RabbitMQ知识点(二)

  1. 消息如何分发?
    若该队列至少有一个消费者订阅,消息将以循环(round-robin)的方式发送给消费者。每条消息
    只会分发给一个订阅的消费者(前提是消费者能够正常处理消息并进行确认)。通过路由可实现多
    消费的功能

  2. 消息怎么路由?
    消息提供方->路由->一至多个队列消息发布到交换器时,消息将拥有一个路由键(routing key),
    在消息创建时设定。通过队列路由键,可以把队列绑定到交换器上。消息到达交换器后,
    RabbitMQ 会将消息的路由键与队列的路由键进行匹配(针对不同的交换器有不同的路由规则);
    常用的交换器主要分为一下三种:
    (1)fanout:如果交换器收到消息,将会广播到所有绑定的队列上
    (2)direct:如果路由键完全匹配,消息就被投递到相应的队列
    (3)topic:可以使来自不同源头的消息能够到达同一个队列。 使用 topic 交换器时,可以使用通配符

  3. 消息基于什么传输?
    由于 TCP 连接的创建和销毁开销较大,且并发数受系统资源限制,会造成性能瓶颈。RabbitMQ
    使用信道的方式来传输数据。信道是建立在真实的 TCP 连接内的虚拟连接,且每条 TCP 连接上的
    信道数量没有限制。

  4. 如何保证消息不被重复消费?或者说,如何保证消息消费时的幂等性?
    先说为什么会重复消费:正常情况下,消费者在消费消息的时候,消费完毕后,会发送一个确认消
    息给消息队列,消息队列就知道该消息被消费了,就会将该消息从消息队列中删除;
    但是因为网络传输等等故障,确认信息没有传送到消息队列,导致消息队列不知道自己已经消费过
    该消息了,再次将消息分发给其他的消费者。
    针对以上问题,一个解决思路是:保证消息的唯一性,就算是多次传输,不要让消息的多次消费带
    来影响;保证消息等幂性;
    比如:在写入消息队列的数据做唯一标示,消费消息时,根据唯一标识判断是否消费过;
    假设你有个系统,消费一条消息就往数据库里插入一条数据,要是你一个消息重复两次,你
    不就插入了两条,这数据不就错了?但是你要是消费到第二次的时候,自己判断一下是否已
    经消费过了,若是就直接扔了,这样不就保留了一条数据,从而保证了数据的正确性。

  5. 如何确保消息正确地发送至 RabbitMQ? 如何确保消息接收方消费了消息?

    发送方确认模式:
    将信道设置成 confirm 模式(发送方确认模式),则所有在信道上发布的消息都会被指派一个唯一的 ID。
    一旦消息被投递到目的队列后,或者消息被写入磁盘后(可持久化的消息),信道会发送一个确认
    给生产者(包含消息唯一 ID)。
    如果 RabbitMQ 发生内部错误从而导致消息丢失,会发送一条 nack(notacknowledged,未确认)消息。
    发送方确认模式是异步的,生产者应用程序在等待确认的同时,可以继续发送消息。当确认消息到
    达生产者应用程序,生产者应用程序的回调方法就会被触发来处理确认消息。

    接收方确认机制:
    消费者接收每一条消息后都必须进行确认(消息接收和消息确认是两个不同操作)。只有消费者确
    认了消息,RabbitMQ 才能安全地把消息从队列中删除。
    这里并没有用到超时机制,RabbitMQ 仅通过 Consumer 的连接中断来确认是否需要重新发送消息。
    也就是说,只要连接不中断,RabbitMQ 给了 Consumer 足够长的时间来处理消息。保证数据的最终一致性;

    下面罗列几种特殊情况
    如果消费者接收到消息,在确认之前断开了连接或取消订阅,RabbitMQ 会认为消息没有被分发,
    然后重新分发给下一个订阅的消费者。(可能存在消息重复消费的隐患,需要去重)
    如果消费者接收到消息却没有确认消息,连接也未断开,则 RabbitMQ 认为该消费者繁忙,将不
    会给该消费者分发更多的消息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值