logo头像
ICQL

445_rabbitmq

消息队列 Message Queue

  • JMS(Java Message Service,JMS)规范目前支持两种消息模型
    • 1)点对点(point to point, queue)
    • 2)发布/订阅(publish/subscribe,topic)
  • 优点:解耦、异步、削峰
  • 缺点:系统可用性降低,系统复杂性增加
  • 重复消费原因:消费者在消费消息完毕后,会发送一个 “确认信息” 给消息队列,消息队列就知道该消息被消费了,就会将该消息从消息队列中删除;当网络出现故障,造成 “确认信息” 未发送给消息队列,导致消息队列不知道自己已经消费过该消息了,再次将该消息分发给其他的消费者,就会造成重复消费
    • 解决方案:宗旨就是保证消息队列的幂等性,如数据库插入insert操作,主键不能重复,自动报错,无需解决;redis设置缓存,多次set都一样,无需处理;其他场景可以 引入redis 等记录消费记录
  • 丢数据
    • 1)生产者弄丢数据:RabbitMQ提供transaction和confirm模式来确保生产者不丢消息
    • 2)消息队列弄丢数据:处理消息队列丢数据的情况,一般是开启持久化磁盘的配置
    • 3)消费者弄丢数据:消费者丢数据一般是因为采用了自动确认消息模式。这种模式下,消费者会自动确认收到信息。这时rahbitMQ会立即将消息删除,这种情况下如果消费者出现异常而没能处理该消息,就会丢失该消息。解决方案:采用手动确认消息即可

rabbitmq 安装

1
2
3
4
5
6
7
8
9
10
docker run -di -p 7200:5617 -p 7201:5672 -p 7202:4369 -p 7203:15671 -p 7204:15672 -p 7205:25672 --name=mq-rabbitmq rabbitmq 
docker run -di -p 5617:5617 -p 5672:5672 -p 4369:4369 -p 15671:15671 -p 15672:15672 -p 25672:25672 --name=mq-rabbitmq rabbitmq
#默认未开启web管理模块,需进入容器开启,端口15672是web端口,默认用户名密码:guest,guest,进入web页面修改用户名密码
rabbitmqctl start_app
rabbitmq-plugins enable rabbitmq_management

#启动webSocket支持
rabbitmq-plugins enable rabbitmq_web_stomp rabbitmq_stomp rabbitmq_web_stomp_examples

rabbitmqctl stop

rabbitmq 介绍

rabbitmq架构图

  • 主要概念
    • RabbitMQ Server:消息中间件server
    • Producer:消息生产者,如图A、B、C,数据的发送方。消息生产者连接RabbitMQ服务器然后将消息投递到Exchange
    • Consumer:消息消费者,如图1、2、3,数据的接收方。消息消费者订阅队列,RabbitMQ将Queue中的消息发送到消息消费者
    • Exchange:生产者将消息发送到Exchange(交换器),由Exchange将消息路由到一个或多个Queue中(或者丢弃)。Exchange并不存储消息
    • Queue:是RabbitMQ的内部对象,用于存储消息
    • RoutingKey:路由规则,Exchange与RoutingKey确定发送到哪个队列
    • Connection(连接):Producer和Consumer都是通过TCP连接到RabbitMQ Server的
    • Channels(信道):建立在上述的TCP连接中,数据流动都是在Channel中进行的
    • VirtualHost:权限控制的基本单位,一个VirtualHost里面有若干Exchange和MessageQueue,以及指定被哪些user使用
  • Exchange的4种模式
    • 1)direct直接模式
      • 最简单的一种模式,不需要自定义Exchange,直接使用default Exchange(该Exchange的名字为空字符串)
      • 这种模式下不需要将Exchange进行任何绑定(binding)操作
      • 消息传递时需要一个“RouteKey”,可以简单的理解为要发送到的队列名字
      • 如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃
    • 2)fanout分裂模式
      • 发送的消息会被转发到与Exchange绑定(Binding)的所有Queue上
      • 这种模式不需要RouteKey
      • 这种模式需要提前将Exchange与Queue进行绑定,一个Exchange可以绑定多个Queue,一个Queue可以同多个Exchange进行绑定
      • 如果接受到消息的Exchange没有与任何Queue绑定,则消息会被抛弃
    • 3)topic主题模式
      • 任何发送到Topic Exchange的消息都会被转发到所有关心RouteKey中指定话题的Queue上
      • 所有的消息都带有一个“标题”(RouteKey),Exchange会将消息转发到所有关注主题能与RouteKey模糊匹配的队列
      • 这种模式需要RouteKey,也许要提前绑定Exchange与Queue
      • RouteKey规则:#表示0个或若干个单词(关键字),是通过.区分
      • 同样,如果Exchange没有发现能够与RouteKey匹配的Queue,则会抛弃此消息
    • 4)headers:不常用,不处理RouteKey,而是根据发送的消息内容中的headers属性进行匹配
微信打赏

赞赏是不耍流氓的鼓励