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分钟的时间,开始倒计时。如果在这段时间内 用户没有支付,则默认订单取消。

相关推荐
一路向北North5 小时前
使用reactor-rabbitmq库监听Rabbitmq
分布式·rabbitmq·ruby
Amy1870211182310 小时前
赋能低压分布式光伏“四可”建设,筑牢电网安全新防线
分布式
June bug15 小时前
【软考中级·软件评测师】下午题·面向对象测试之架构考点全析:分层、分布式、微内核与事件驱动
经验分享·分布式·职场和发展·架构·学习方法·测试·软考
阿波罗.201216 小时前
Zookeeper 客户端 .net访问框架 ZookeeperNetEx项目开发编译
分布式·zookeeper
Bug退退退12316 小时前
RabbitMQ 工作模式
java·分布式·rabbitmq
weixin_4383354016 小时前
分布式锁实现方式:基于Redis的分布式锁实现(Spring Boot + Redis)
数据库·redis·分布式
危险、21 小时前
RabbitMQ 通过HTTP API删除队列命令
分布式·http·rabbitmq
周某某~1 天前
windows安装RabbitMQ
分布式·rabbitmq
Bug退退退1231 天前
RabbitMQ 高级特性之消息确认
java·分布式·rabbitmq
一只程序汪1 天前
【如何实现分布式压测中间件】
分布式·中间件