消息中间件RabbitMQ

 每日一句:好记性不如烂笔头。行万里路 读万卷书 尝尽天下美食。

 ^_^ 下面直接进入正题。 

 AMQP协议是一套开放标准,支持不同语言的不同产品;

AMPQ核心组件包含以下几个:

  • 生产者
  • 消费者
  • 消息
  • 连接、通道
  • 交换器 队列 路邮键 绑定。   

如图 一图胜千言是  

 

RabbitMQ常用的交换器类型有 fanout. direct. topic、 headers四种:

  • fanout: 它会把所有发送到该交换器的消息,路由到所有与该交换器绑定的队列中;
  • direct: 把消息路由到那些BindingKey和RoutingKey完全匹配的队列中;
  • topic: 类似于direct,但可以使用通配符匹配规则;
  • header: 消息不根据路由键的匹配规则路由,而是根据发送的消息内容中的headers属性进行匹配。

 fanout如图: 会把所有发送到该交换器的消息,路由到所有与该交换器绑定的队列中;

direct:把消息路由到那些BindingKey和RoutingKey完全匹配的队列中

 

topic: 类似于direct,但可以使用通配符匹配规则;

RabbitMQ运行流程:

  生产者发送消息流程:

  • 1.生产者与Broker建立连接(Connection) ,开启信道(Channel)
  • 2.生产者声明交换器(交换器类型、是否持久化、是否自动删除等)
  • 3.生产者声明队列(是否持久化、是否排他、是否自动删除)
  • 4.生产者通过路由键将交换器和队列绑定
  • 5.生产者发送消息至Broker (携带路由键等)
  • 6.交换器根据接收到的路由键,以及交换器类型查找匹配的队列
  • 7.找到,队列将消息存入相应队列中
  • 8.找不到,则根据生产者的配置,选择丢弃还是回退给生产者
  • 9.关闭信道
  • 10.关闭连接

   消费者流程:

  •  1.消费者与Broker建立连接(Connection) ,开启信道(Channel)
  • 2.消费者向Broker请求消费相应队列的消息,可能设置回调函数
  • 3等待Broker回应并投递相应队列中的消息,接收消息
  • 4.消费者确认(ack) 接收到的消息
  • 5.RabbitMQ从队列中删除相应已经被确认的消息
  • 6.关闭信道
  • 7.关闭连接

RabbitMQ 的Connection 和 Channel

       无论是生产者还是消费者,都需要和RabbitMQ Broker建立个TCP连接, 这个连接就是一个Connection。连接建立之后,客户端将在连接之上建立一个AMQP信道(Channel), 每个信道有一个唯1的ID, RabbitMQ所有的AMQP指令都是通过信道完成。

  • 同一个Connection中, 允许既有消费者Channel也有生产者Channel;
  • 通过消息(标签+有效载荷)标签;
  • Channel是否可以既是生产者又是消费者;

RabbitMQ 的消息确认机制

  • 为保证消息从队列可靠地到达消费者,RabbitMQ提供 了消息确认机制。
  • 消费者在订阅队列时,可以指定autoAck参数, 当autoAck等于false时, RabbitMQ会等待消费 者显式地回复确认后,才从内存(或磁盘)中移除该消息(实际上是先标记为删除,之后再真正删除)。
  • 当autoAck等于true时,RabbitMQ会自动把发送出去的消息改为确认,然后移除,而不管消息是否真正被消费者接收到。
  • 当autoAck设置为false时,对RabbitMQ服务端而言,队列中的消息分成两部分: -部分是等待投递给消费者的消息; -部分是已经投递给消费者,但是还没有收消费者确认信号的消息。
  • 如果RabbitMQ直没有收到消费者的确认信号, 并且该消费者已经断开连接,则RabbitMQ会安排消息重新进入队列,等待投递给下一个消费者(可以是原消费者) .

RabbitMQ 的消息拒绝机制

拒绝单条消息: void basicReject(long deliveryTag, boolean requeue) throws lOException;
拒绝多条消息: void basicNack(long deliveryTag, boolean multiple, boolean requeue) throws lOException;
参数的意义:
          multiple参数设置为false,则表示拒绝编号为deliveryTag这条消息;
          multiple参数设置为true,则表示拒绝deliveryTag编号之前所有未被当前消费者确认的消息;
          requeue参数用于设置是否再次将该消息放入队列中重新发送给消费者。
         注意: channel.basicReject(或channel.basicNack0中的requeue设置为false, 可以启用"死信队列"功能。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值