将主要围绕以下四个方面进行分享:
-
RabbitMQ特性
-
RabbitMQ中的消息不可靠问题及其解决方案
-
死信队列
-
生产环境下使用RabbitMQ应注意的事项
RabbitMQ特性
对于左边的Client Publisher而言,RabbitMQ Server是消息的接收者,也就是消费者。
对于右边的Client Consumer而言,RabbitMQ Server是消息的发送者,也就是生产者。
RabbitMQ Server将消息从Client Publisher传送给Client Consumer,扮演着消息中间商的角色。
RabbitMQ Server负责将Client Publisher传递来的消息持久化,延后地将消息传递给Client Consumer.这样,即使消费者挂掉,RabbitMQ Server也可以存储消息,当消费者重新工作时再将存储的消息传递过去, 从而保证消息不丢失 。
RabbitMQ Server提供了堆积消息的能力。
另外,RabbitMQ Server还具有复制和广播消息的能力。
具体来说,RabbitMQ Server可以将Client Publisher发布的消息分发给多个消费者,比如它能够将特定的消息按照特定的队列分发给特定的消费者。
“特定”指不同消息具有不同的routing key属性,由上图实例,不同的消息生产者生产了具有不同routing key的消息,通过exchange路由器将不同的routing key消息投递到不同队列,从而分发给不同消费者。
RabbitMQ中的消息不可靠问题及其解决方案
消费端消息不可靠问题及其解决方案
实际上,RabbitMQ Server将消息投递给消费者,具有消息不可靠的特点。
具体来说,RabbitMQ Server将消息投递给消费者时会调用套接字的write操作,而write操作的过程是不可靠性的。
在write操作的过程中,Server需要将消息发送到套接字的缓存中,通过网卡转发到链路上,最终到达消费者所在的机器内核的套接字缓存中,由消费者使用套接字的read操作将消息读出来。
即使套接字的write操作成功也无法保证消息可靠,潜在的网络故障可能使消费者接收不到消息。
机器宕机也可能使消息不可靠,即使消息字节流已经到达消费者所在机器,消费者所在机器的宕机也可能使消息无法被即时读取并处理。
另外,即使消费者即时读取消息,内存消息队列中的所有消息也可能因为kill-9操作发生丢失。
这些可能性都直接导致了消息不可靠。