RabbitMQ

RabbitMQ

结构模型

image-20200721082719501

  • Producer:创建消息发布到RabbitMQ中。

    • 消息包含标签和消息体。

  • Consumer:订阅队列,消费存储在队列中的消息。

  • Broker:可看作RabbitMQ服务器。

  • Queue:用于存储消息。

    • Name

    • Durable:消息代理重启后,队列依旧存在

    • Exclusive:只能被一个连接使用,连接关闭后队列删除

    • Auto-delete:最后一个消费者退订后删除

    • Arguments:完成TTL的额外功能

  • Exchange:交换机

    • 将消息路由到一个或多个队列中,路由不到则返回给Producer或者丢弃。

    • 交换机状态:持久,暂存。

    • 类型fanout(广播到所有绑定的队列中),topic(可以使不同源的消息到达同一个队列,通配符),direct(路由键完全匹配),headers

  • Routing Key:路由键指定消息的路由规则。

  • Blinding Key:通过绑定将交换机和队列关联起来。

  • Connection: TCP连接。

  • Channel:信道复用TCP连接,节省性能开销,便于管理。

  • vhost:在单独的代理上实现多个隔离环境。

AMQP协议

  • 应用层协议。RabbitMQ采用Erlang语言实现AMQP的消息中间件。

消息机制

  • 消息确认:消费者在没有回执的情况下挂了,AMQP代理会将消息重新投递给注册到此队列的消费者,如果没有,则等待消费者注册,再次投递。

  • 拒绝消息:销毁或者重新放入队列。

  • 预读消息:明确收到回执前消费者能够接收多少消息,发布消息时能够负载均衡和提高吞吐量。

  • 消息持久化:与交换机和队列的持久化无关,消息存储在磁盘上。

消息积压

  • 先修复并停止consumer。

  • 临时扩大queue资源和consumer资源加速消费。

  • 消费完成恢复consumer。

消息过期

  • 批量重导

message是否有数量限制

  • 没有,但消息过多会导致处理效率下降

消息正确发送

  • 发送方确认机制:将信道设置成确认模式,在信道上发布的消息会指派唯一的ID。一旦消息被发送至RabbitMQ,信道会发送一个确认给生产者。如果消息丢失,会发送一条nack消息。

消息正确消费

  • autoACK=false接收方确认机制:消费者接受并确认消息之后,消息队列才能安全地将信息从队列中删除。

  • autoACK=true,RabbitMQ会自动把发送出去的消息置为确认,然后从内存或磁盘中删除

  • Rabbit仅通过Consumer的连接中断来确认是否需要重新发送。

    • 断开或取消订阅会重新分发给下一个订阅的消费者。

    • 未断开则认为消费者繁忙,不会分发更多的消息。

消息重复投递或重复消费

  • 重复投递:生产者发送的消息生成inner-msg-id作为去重和幂等的依据,避免重复的消息进入队列。

  • 重复消费:消息消费时需要bizId作为去重和幂等的依据。

消息传递

  • RabbitMQ基于信道的方式传递数据,且信道数量没有限制。

消息分发

  • 以循环的方式发送给消费者。

  • 每条消息只会发送给一个订阅的消费者。

消息路由

  • 根据交换机的路由规则,将routing key和blinding key进行匹配,将消息投递到相应队列中。

消息不丢失

  • 消息持久化,消息队列必须持久化。

  • 持久化日志文件:

    • 发布持久性消息到持久性交换器上,RabbitMQ会在消息提交到日志文件后才发送响应。

    • 消费者消费持久化消息后,日志文件将这条消息标记为等待垃圾收集。

    • 持久化消息被消费前RabbitMQ重启,RabbitMQ会重新发布持久化日志文件中的消息到合适的队列中。

优缺点

  • 解耦,拆分系统。

  • 异步处理,减少响应时间。

  • 消息分发。

  • 流量削峰。

  • 消息缓冲。

  • 可用性降低,消息队列出问题影响业务。

高可用

集群镜像队列
  • 集群扩展吞吐量,但不会备份消息。

  • 备份消息通过镜像队列,消息实体主动在镜像节点之间同步。

    • 缺点:集群内部的同步通讯会占用大量带宽。

如何保证数据一致性

  • 生产者确认机制:消息持久化后异步回调通知生产者,保证消息已经发出去。

  • 消息持久化:设置消费持久化。

  • 消费者确认机制:消费者成功消费信息之后,确认之后保证消息已经消费。

RabbitMQ与消费者之间的关系

  • 一个队列可以绑定多个消费者。

  • 消息默认以循环的方式发送给消费者。

posted @ 2020-07-31 22:07  樱空废宅  阅读(78)  评论(0)    收藏  举报