什么是RabbitMQ
RabbitMQ是一款开源的,基于AMQP协议的消息中间件。
消息队列是一个使用队列来通信的组件。
AMQP是什么
RabbitMQ是AMQP协议的Erlang实现,同时其中的交换器、交换器类型、队列、绑定都是遵循AMQP协议中相应的概念。
RabbitMQ的优缺点
优点:
- 解耦:A系统需接口调用发送数据到其余系统,这时候如果某一系统不需要了,而A系统又需要发送第二种数据,这种过程过于麻烦。
- 异步:将消息写入消息队列,异步响应运行,加快响应速度。
- 削峰:并发量大的时候,所有请求直接对数据库进行操作,容易使数据库异常。
缺点:降低系统稳定性,增加系统复杂性,加入消息队列需要考虑许多方面问题,如,如何保证消息不被重复消费,保证消息可靠性传输等。
如何保证消息不被重复消费
消息在传输的过程中往往会因为一些奇奇怪怪的原因,如网络不稳定、传输故障等问题导致消息队列无法确定是否消费过该消息。
因此,可以在数据写入消息队列之前做一个唯一标识来确认是否消费过该消息。
如何保证消息的可靠性传输
消息在传输过程中可能出现生产者丢失消息、消息队列丢失消息、消费者丢失消息等问题。
生产者丢失消息:可使用RabbitMQ提供的transaction和confirm模式来确保生产者不会丢失消息。
transaction模式:发送消息前开启事务,如果发送过程中出现问题则回滚事务,成功则提交事务。但会导致吞吐量下降。
confirm模式:开启此模式,所有在该信道上发布的消息都会被指派一个唯一的id,一旦消息成功投递到对应队列之后,RabbitMQ就会发送一个ACK给生产者,生产者便知道消息已经正确到达队列了。
消息队列丢失数据:消息持久化处理。
消费者丢失消息:将自动确认消息模式改为手动确认。
消息基于什么进行传输
RabbitMQ使用信道的方式来传输数据。信道是建立在真实的TCP连接内的虚拟连接,且每条TCP上的信道数量没有限制。
不直接使用TCP进行通信是因为TCP的创建和销毁开销大,需要三握四挥。不使用信道会造成资源的巨大浪费。
消息如何分发
以循环的方式发给消费者。每条消息只会发给一个订阅的消费者。