RabbitMQ基本模式

   最近用到了一些RabbitMQ的东西,看了官方的Get Started,以此为模板总结一下。


        (1)生产者(发送方)发送消息到ExChange(含参:routingkey),ExChange通过bindingkey确定消息传入哪一个Queue,消费者(接收方)通过监听Queue来获取消息。

           其中需要注意的是:生产者(Producer)永远不会向队列(Queue)直接发送消息。

        (2)ExChange通过BindKey来和Queue进行关联保定的,Binding表示一种Exchange服务器和Queue之间的关系,或者说QueueExchange服务器中的内容感兴趣。

        (3)通过上面可以知道,生产者是将消息发送给ExChange服务器的,但是ExChange服务器是怎么知道如何处理这些Message呢,是通过ExChange Type,ExChange Type主要有四类:

  • direct:消息会流向bindingkey和routingkey相同的队列;
  • topic:topic消息的routingkey必需有多个单词,单词间以“.”间隔,比如:stock.usd.nyse。发送消息伴随一个特定的routingkey,他会发送给所有满足bindingkey的队列
  • fanouts:广播消息给所有知道的队列
  • headers:通过头部信息进行匹配(这种方式在Get Started中没有详细提及)

        (4)其常见的消息分发模型如下:

                    1.简易的一对一的生产者消费者模型


                    2.一对多的工厂模型,其主要需要注意的点是默认为公平分配,即C1、C2两个消费者拿到的东西是一样多的,其需要设置prefetch_count来改变这种情况。 


      3.订阅/发布模式,其采用一种广播模式进行对已知的队列进行消息发送。


                    3.direct这种确定值的路由状态,即routingkey为orange的消息,只会发送到与Exchange的Bindingkey为orange的队列中,而,在fanout广播下会忽略这些值(orange,black等)。

                        即:其如果routingkey都一致,都是black,那么Exchange收到的所有routingkey为black的消息都会发送给Q1、Q2两个队列。这样就已经不具备Direct确定路由的特性了,这种情况就和fanout广播的原理一样了,如下:


                    4.还有这种通配符模型(TOPIC),以及其类似的指定模型(DIRECT),topic模型是最具有变换性质的模型,其通过“*”和“#”两种配置符号进行EXCHANGE和QUEUE的绑定,能够通过特定的routingkey绑定方式实现DIRECT和FANOUTS类型。

      (1)topic模式下的routingkey,必须由一系列的单词组成,单词之间以“.”间隔,比如:stock.usd.nyse;

      (2)topic有两种通配符: * 标示一个单词,# 标示零个或多个单词  (Y.X.Z,单词是以.来确定的,Y、X、Z即为三个单词)

       比如这种情况下:

消息的RoutingKey

会接收消息的通道编号

quick.orange.rabbit

Q1、Q2

lazy.orange.fox

Q1、Q2

lazy.orange.male.rabbit

Q2

需要注意的是,如果routingkey匹配了该通道的多条bindingkey,消息也不会多次发送,另外:

  •         如果所有通道的bindingkey都是#,那么这种模式下的topic就和fanout一样了;
  •         如果所有通道的bindingkey都不包含*和#,那么这种模式下的topic和direct一样了。

                    5.还有一种RPC,远程服务型,其能够实现消息回调,即客户端通过RabbitMQ访问服务端,服务端接收到消息后,再返回信息给客户端,其由函数ConvertSendandReceive()实现,具体过程如下:

                    可以看到其发送的消息有一些参数:

  •                             deliveryMode:if=2 - persistenet else - transient
  •                             contentType:数据类型,比如:application/json
  •                             replyto:用于标示回调通道名称
  •                             correlation_id:标识请求和回复

                    如上图:其客户端发送了reply_to=amqp.gen-x a2... 那么服务端回复的通道就是amqp.gen-xa2....

                    客户端接收到了服务端发回来的coorelation_id,与自己发出的进行匹配,成功则标示消息已经被消费。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程

Nutch重要命令使用说明

之前几篇博文对nucth抓取周期的几个命令做了说明,本篇博文将对nutch抓取周期以外的几个重要的命令的使用进行详细的说明。 1. mergesegs 合并多个...

2025
来自专栏技术碎碎念

OS存储器管理(一)

存储器的层次: 分为寄存器、主存(内存)和 辅存(外存)三个层次。 主存:高速缓冲存储器、主存储器、磁盘缓冲存储器,          主存又称为可执行存储...

3879
来自专栏MelonTeam专栏

android bitmap的缓存策略

不论是android还是ios设备,流量对于用户而言都是宝贵的。在没有wifi的场景下,如果加载批量的图片消耗用户过多流量,被其知晓,又要被念叨一波~ ? 如...

2366
来自专栏深度学习之tensorflow实战篇

RStudio中,出现中文乱码问题的解决方案

RStudio中,出现中文乱码问题的解决方案 正常出现乱码问题, 解决步骤: 1、设置RStudio文本显示的默认编码: RStudio菜单栏的Tools...

2737
来自专栏腾讯Bugly的专栏

Android 混淆那些事儿

本文主要讲述了代码混淆和资源混淆的原理,Studio默认的混淆方案,混淆的参数,以及如何对Apk进行代码混淆(自定义混淆文件)和资源混淆(结合微信混淆和美团混淆...

8435
来自专栏生信宝典

Linux学习-文件列太多,很难识别想要的信息在哪列;别焦急,看这里。

经常会碰到列数特别多的文件,而屏幕又不足以放下这么多列;即便能放下,也不容易清晰的辨别出想提取的信息在第几列。 根据我们前面的学习,可以用一行命令或简单的写一...

26210
来自专栏哲学驱动设计

Rafy 领域实体框架 - 树型实体功能(自关联表)

在 Rafy 领域实体框架中,对自关联的实体结构做了特殊的处理,下面对这一功能进行讲解。 场景 在开发数据库应用程序时,往往会遇到自关联表的场景。例如,分类信息...

2068
来自专栏牛肉圆粉不加葱

Spark Task 的执行流程② - 创建、分发 Task

task 的创建本应该放在分配 tasks 给 executors一文中进行介绍,但由于创建的过程与分发及之后的反序列化执行关系紧密,我把这一部分内容挪到了本文...

741
来自专栏用户2442861的专栏

linux grep工作常用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/d...

1134
来自专栏PHP实战技术

Linux下自动化监控内存、存储空间!

距离上一次更新文章已经过去一段时间了,小编在这段时间因为一些琐事,加上身体生病不能及时更新文章,今天身体逐渐恢复就急忙来更新文章,今天思梦给大家...

3466

扫码关注云+社区

领取腾讯云代金券