最近用到了一些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,与自己发出的进行匹配,成功则标示消息已经被消费。

RabbitMQ基本模式的更多相关文章

  1. RabbitMQ.Client API (.NET)中文文档

    主要的名称空间,接口和类 核心API中定义接口和类 RabbitMQ.Client 名称空间: 1 using RabbitMQ.Client; 核心API接口和类 IModel :表示一个AMQP ...

  2. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  3. RabbitMq应用二

    在应用一中,基本的消息队列使用已经完成了,在实际项目中,一定会出现各种各样的需求和问题,rabbitmq内置的很多强大机制和功能会帮助我们解决很多的问题,下面就一个一个的一起学习一下. 消息响应机制 ...

  4. 如何优雅的使用RabbitMQ

    RabbitMQ无疑是目前最流行的消息队列之一,对各种语言环境的支持也很丰富,作为一个.NET developer有必要学习和了解这一工具.消息队列的使用场景大概有3种: 1.系统集成,分布式系统的设 ...

  5. RabbitMq应用一的补充(RabbitMQ的应用场景)

    直接进入正题. 一.异步处理 场景:发送手机验证码,邮件 传统古老处理方式如下图 这个流程,全部在主线程完成,注册->入库->发送邮件->发送短信,由于都在主线程,所以要等待每一步完 ...

  6. RabbitMq应用一

    RabbitMq应用一 RabbitMQ的具体概念,百度百科一下,我这里说一下我的理解,如果有少或者不对的地方,欢迎纠正和补充. 一个项目架构,小的时候,一般都是传统的单一网站系统,或者项目,三层架构 ...

  7. 缓存、队列(Memcached、redis、RabbitMQ)

    本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 redis 简介.安装.使用.实例 Python 操作 Redis String.Hash.Li ...

  8. 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)

    Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...

  9. windows下 安装 rabbitMQ 及操作常用命令

    rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rab ...

随机推荐

  1. linux系统中用户

    一.用户身份介绍: 1.系统管理员用户,UID(User IDentification) :0, 2.系统用户,UID为1~999,默认的程序都有独立的系统用户负责,运行,进而控制被破坏的范围, 3. ...

  2. 【mongdb主从复制和同步】

    主从同步: Master: Slave: 副本集: #在卷本中加任意主机 #登录从 #登录主 #同步日志 #仲裁: 向集群中添加主机成为仲裁 #查看集群里的成员角色参数:

  3. hadoop生态搭建(3节点)-17.sqoop配置_单节点

    # ==================================================================安装 sqoop tar -zxvf ~/sqoop-1.4.7 ...

  4. python学习——初始面向对象

    一.讲在前面 编程的世界中有三大体系,面向过程.面向函数和面向对象编程.而面向过程的编程就包括了面向函数编程,接下来说一下面向对象.假如 ,你现在是一家游戏公司的开发人员,现在需要你开发一款叫做< ...

  5. 北京Uber优步司机奖励政策(12月16日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  6. [python3.x]win 7 下Pyinstaller库的安装与使用---探索之路

    一.下载安装包 cmd进入命令行,执行命令:pip install https://github.com/pyinstaller/pyinstaller/archive/develop.tar.gz ...

  7. php post

    post form function post($remote_server,$data,$second=60){ $ch = curl_init();if(is_string($data)){ $t ...

  8. Hive实现自增列

    1.用row_number()函数生成代理键 ) max_id from id_test) t2; 2.用UDFRowSequence生成代理键              ——报错? add jar ...

  9. 可靠UDP,KCP协议快在哪?

    WeTest 导读 云真机已经支持手机端的画面投影.云真机实时操作,对延迟的要求比远程视频对话的要求更高(100ms以内).在无线网络下,如何更实时.更可靠的传输视频流就成了一个挑战.通过websoc ...

  10. 「暑期训练」「基础DP」免费馅饼(HDU-1176)

    题意与分析 中文题就不讲题意了.我是真的菜,菜出声. 不妨思考一下,限制了我们决策的有哪些因素?一,所在的位置:二,所在的时间.还有吗?没有了,所以设dp[i][j]" role=" ...