RabbitMQ五种消息模型

RabbitMQ

官网: http://www.rabbitmq.com/
官方教程:http://www.rabbitmq.com/getstarted.html
官网下载地址:http://www.rabbitmq.com/download.html
Erlang下载地址:http://www.erlang.org/download.html

六种种消息模型

3、4、5这三种都属于订阅模型,只不过进行路由的方式不同:

Exchange(交换机):生产者将消息发送到交换器,交换器根据路由规则将消息路由一个或多个队列中。而路由规则受 Exchange 的类型和绑定(binding) 关系的影响
在这里插入图片描述

消息模型Exchange类型routing-keybinding-key
Publish/Subscribe 发布/订阅Fanout
Routingdirect= bindingKey匹配值
Topicstopic通配符匹配指定匹配规则
-基本用不到headers消息的headers的键值对匹配键值对匹配规则 匹配规则x-match(all / any)

在这里插入图片描述

一、基本消息模型

在这里插入图片描述

  • P 生产者:发送消息
  • Q 消息队列:(红色部分)可以缓存消息;生产者向其中投递消息,消费者从其中取出消息
  • C 消费者:消息的接受者,会一直等待消息到来

消费者的消息确认机制(Acknowlage)

消息一旦被消费者接收,队列中的消息就会被删除。
回执ACK 分两种情况:

  • 自动ACK,消息一旦被接收,消费者自动发送ACK
  • 手动ACK,消息接收后,不会发送ACK,需要手动调用

选择方式:

  • 如果消息不太重要,丢失也没有影响,那么自动ACK会比较方便
  • 如果消息非常重要,不容丢失。那么最好在消费完成后手动ACK,否则接收消息后就自动ACK,RabbitMQ就会把消息从队列中删除。如果此时消费者宕机,那么消息就丢失了
channe.basicConsume(QUEUE_NAME, true, consumer);

第二个参数为true,则会自动进行ACK;如果为false,则需要手动ACK

二、Work queues

work queues,也称 Task queues (任务模型–能者多劳)
在这里插入图片描述

角色

  • P 生产者:发送消息
  • Q 消息队列:可以缓存消息;生产者向其中投递消息,消费者从其中取出消息
  • C1 消费者:领取任务并完成任务
  • C2 消费者2:领取任务并完成任务

负载均衡 (能者多劳)

  • 场景:当消息处理比较耗时的时候,当生产消息的速度会远远大于消息的消费速度时,导致消息就会堆积越来越多,无法及时处理。
  • 使用work 模型:让多个消费者绑定到一个队列,共同消费队列中的消息。队列中的消息一旦消费,就会消失,因此任务是不会被重复执行的。任务平均分配,消费效率高的,消费的消息也越多。

三、Publish/Subscribe (发布/订阅)

RabbitMQ通过exchange可以支持多订阅,当RabbitMQ需要支持多订阅时,生产者发送的消息通过路由同时写到多个Queue,不同消费者都可以消费此消息。
在这里插入图片描述
fanout exchange 会将消息分发给所有绑定到此 exchange 的queue中,不管 queue中的 route key。如果有 N 个 Queue 绑定到 一个 fanout exchange 时,那么此时 exchange 收到消息时,会将此消息分发到 这 N 个 queue中,由于此性质, fanout exchange 也常用消息的广播。

  • X:Exchange(交换机):生产者将消息发送到交换器,交换器根据路由规则将消息路由一个或多个队列中。而路由规则受 Exchange 的类型和绑定(binding) 关系的影响
  • 交换机把消息发送给绑定过的所有队列
  • 多个消费者
  • 每个消费者都有自己的消息队列Queue
  • 每个消费者将自己的Queue绑定到自己感兴趣的Exchage (可以绑定多个Exchange)
  • 由于Queue中的消息消费完后立即删除,不保留历史消息。所以在多订阅时,消息会以拷贝的形式存在不同的队列中。

RabbitMQ消息模型的特点:

  • 通exchange交换器和消息拷贝实现多订阅。
  • RabbitMQ既支持内存队列也支持持久化队列。
  • 消费端为推模型,消费状态和订阅关系由服务端负责维护。

三、Routing 路由

在这里插入图片描述
Exchange(交换机):生产者将消息发送到交换器,交换器根据路由规则将消息路由一个或多个队列中。而路由规则受 Exchange 的类型和绑定(binding) 关系的影响

direct exchange 根据消息携带的 routing key 将消息投递到不同的 queue中,direct exchange 适用于消息的单播发送。工作流程如下:

  • 将一个队列绑定到某个交换机上,同时赋予该绑定 一个 route key。
  • 当一个携带 route key为R 的消息被发送到 direct exchange 时,exchange 会将消息路由到 绑定值同样为 R 的队列。注意Route Key和绑定值要完全匹配才行

direct exchange 经常用于在 多个 worker 中分配任务,当这样做时,需注意,在AMQP 0-9-1中,息的负载均衡发生在 consumer之间,而不是在 queue之间。

四、Topic

在这里插入图片描述Exchange(交换机):生产者将消息发送到交换器,交换器根据路由规则将消息路由一个或多个队列中。而路由规则受 Exchange 的类型和绑定(binding) 关系的影响

topic exchange 会根据 route key 将消息分发到与此消息的 route key 相匹配的并且绑定此exchange的一个或多个 queue。这里的**“相匹配”**与 direct exchange的完全匹配的路由规则不一样,topic exchange 在匹配规则上进行了扩展,规则如下:

  • RoutingKey(路由键)为一个点号 “.” 分隔的字符串,如 “com.rabbitmq.client”、“java.util.concurrent”、"com.hidden.client"等
  • BindingKey(绑定键) 和 RoutingKey一样也是点号 “.” 分隔的字符串
  • BindingKey (绑定键) 中可以存在两种 特殊字符串 “*” 和 “#” ,用于做模糊匹配,其中 " # " 用于匹配一个单词," * "用于匹配多个单词

topic exchange 经常用于实现 publish/subscribe模型,即消息的多播模型。前面介绍消息模型也曾提到过消息中间件一般有两种模式:点对点模式和发布/订阅模式。这里的Topic Exchange就适用于发布/订阅模型。RabbitMQ的一个原则就是,消息不能直接投递到 Queue中,必须先将消息投递到 Exchange中,然后由Exchange 按照路由规则将消息投递到对应的 Queue中。至于点对点模型就可以用 Direct Exchange来实现,利用完全匹配的路由规则。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值