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

相关推荐
惊讶的猫34 分钟前
rabbitmq初步介绍
分布式·rabbitmq
小镇敲码人1 小时前
华为CANN框架中HCCL仓库的全面解析:分布式通信的引擎
分布式·华为
User_芊芊君子1 小时前
【分布式训练】CANN SHMEM跨设备内存通信库:构建高效多机多卡训练的关键组件
分布式·深度学习·神经网络·wpf
酷酷的崽7982 小时前
CANN 开源生态解析(四):`cann-dist-train` —— 构建高效可扩展的分布式训练引擎
分布式·开源
惊讶的猫2 小时前
AMQP 与 RabbitMQ 四大模型
分布式·rabbitmq
灰子学技术3 小时前
istio从0到1:如何解决分布式配置同步问题
分布式·云原生·istio
小马爱打代码3 小时前
ZooKeeper:入门实战
分布式·zookeeper·云原生
永远都不秃头的程序员(互关)4 小时前
CANN赋能AIGC分布式训练:硬核通信,加速大模型智能生成新纪元
分布式·aigc
像少年啦飞驰点、4 小时前
从零开始学 RabbitMQ:小白也能懂的消息队列实战指南
java·spring boot·微服务·消息队列·rabbitmq·异步编程
lekami_兰4 小时前
RabbitMQ 延迟队列实现指南:两种方案手把手教你搞定
后端·rabbitmq·延迟队列