RabbitMQ分享

RabbitMQ遵循AMQP协议,自身采用Erlang

RabbitMQ工作模式

生产者发消息,启动多个消费者实例来消费消息,每个消费者仅消费部分信息,可达到负载均衡的效果。

RabbitMQ三种常用交换机类型:

交换机主要起调度分发作用。

direct(直连交换机)

Direct,完全匹配型交换机,此种类型交换机,通过RoutingKey路由键将交换机和队列进行绑定, 消息被发送到exchange时,需要根据消息的RoutingKey,来进行匹配,只将消息发送到完全匹配到此RoutingKey的队列。

如图,不同的key绑定不同的队列,实现不同消息分发至不同队列。

PS: 注意同一个key,可以绑定多个queue队列。如图中,当匹配到key1时,则会将消息分发送至queue1和queue2,这样两个队列都会有相同的消息数据。

fanout(扇形交换机)

Fanout,扇出类型交换机,此种交换机,会将消息分发给所有绑定了此交换机的队列,此时RoutingKey参数无效。

此种方式,最简单快速,性能最好,因为少了中间的匹配判断环节。

一按用于全量分发

topic (主题交换机)

Topic,主题类型交换机,此种交换机与Direct类似,也是需要通过routingkey路由键进行匹配分发,区别在于Topic可以进行模糊匹配,Direct是完全匹配。

Topic中,将routingkey通过"."来分为多个部分,通过如下功能字符来进行匹配:

  • "*":代表一个部分
  • "#":代表一个或多个部分

举例说明:比如我们现在的应用场景为日志处理

routingkey 设置为:*.error

生产者推送的路由为:login.error 、reg.error 都会匹配到 *.error对应的队列,由该队列 对登录、注册的错误进行业务处理。

消息可靠性问题

保证最终一致性,我们需要确保消息队列有ack机制 客户端收到消 息并消费处理完成后,客户端发送ack消息给消息中间件 如果消息中间件超过指定时间还没收 到ack消息,则定时去重发消息。

死信队列

在定义业务队列时可以考虑指定一个 死信交换机,并绑定一个死信队列。当消息变成死信时,该消 息就会被发送到该死信队列上,这样方便我们查看消息失败的原因。 DLX,全称为Dead-Letter-Exchange,死信交换器。消息在一个队列中变成死信(Dead Letter) 之后,被重新发送到一个特殊的交换器(DLX)中,同时,绑定DLX的队列就称为"死信队列"。

主要用于:必须成功的业务,即使处理不成功 也需进行手动处理。

例子:比如调用第三方话费接口充值话费 消费者处理失败,那么正常的业务逻辑就会进入到 死信队列 进行入库,后续人工介入充值。

扩展学习:

延迟队列:

延迟消息是指的消息发送出去后并不想立即就被消费,而是需要等(指定的)一段时间后才触发消费。

TTL机制:

在京东下单,订单创建成功,等待支付,一般会给30分钟的时间,开始倒计时。如果在这段时间内 用户没有支付,则默认订单取消。

相关推荐
RainbowSea7 小时前
6. RabbitMQ 死信队列的详细操作编写
java·消息队列·rabbitmq
RainbowSea7 小时前
5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
java·消息队列·rabbitmq
数据智能老司机9 小时前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
数据智能老司机9 小时前
CockroachDB权威指南——开始使用
数据库·分布式·架构
数据智能老司机10 小时前
CockroachDB权威指南——CockroachDB 架构
数据库·分布式·架构
IT成长日记10 小时前
【Kafka基础】Kafka工作原理解析
分布式·kafka
州周12 小时前
kafka副本同步时HW和LEO
分布式·kafka
ChinaRainbowSea13 小时前
1. 初始 RabbitMQ 消息队列
java·中间件·rabbitmq·java-rabbitmq
爱的叹息13 小时前
主流数据库的存储引擎/存储机制的详细对比分析,涵盖关系型数据库、NoSQL数据库和分布式数据库
数据库·分布式·nosql
千层冷面14 小时前
RabbitMQ 发送者确认机制详解
分布式·rabbitmq·ruby