队列:

从概念上来讲,AMQP消息路由必须有三部分:交换器、队列和绑定。生产者把消息发布到交换器上;消息最终到达队列,并被消费者接收;绑定决定了消息如何从路由器路由到特定的队列。

消费者通过以下两种方式从特定的队列中接收消息:

1)通过AMQP的basic.consume命令订阅。这样做会将信道置为接收模式,知道取消对队列的订阅为止。订阅了消息后,消费者在消费(或者拒绝)最近接收的那道消息后,就能从队列中(可用的)自动接收下一条消息。如果消费者处理队列消息,并且/或者需要在消息已到达队列时就自动接收的话,你应该使用basic.consume.

2)如果只是想获得单条消息而不是持久订阅,向队列请求单消息是通过AMQP的basic.get命令来实现的,这样做可以让消费者接收队列中的下一条消息,如果要获得更多的的消息的话,需要再次发送basic.get命名。不应该使用basic.get放在一个循环里来替代basic.consume,因为这样会影响Rabbit的性能,大致上讲,basic.get命令会订阅消息,活儿单条消息,然后取消订阅。消费者理应始终使用basic.consume来实现高吞吐量。

如果至少有一个消费者订阅了队列的话,消息会立即发送给这些订阅的消费者。但是如果消息到达了无人订阅的队列呢?这种情况下,消息会在队列中等候。一旦有消费者订阅到该队列,那么队列上的消息就会发送给消费者。

当多个消费者订阅到同一队列上时,消息是如何发布的?

当Rabbit队列拥有多个消费者时,队列收到的消息将以循环的方式发送给消费者。每条通道只会发送给一个订阅的消费者。假设有seed_bin队列,消费者1和消费者2订阅到该队列,当消息到达seed_bin队列时,消息投递方式如下:

1)消息A到达seed_bin队列

2)RbbitMQ把消息A发送给消费者1

3)消费者1确认收到了消息A

4)RbbitMq把消息A从seed_bin中删除

5)消息B到达seed_bin队列

6)RbbitMQ把消息B发送给消费者2

7)消费者2确认收到了消息B

8)RabbitMQ把消息B从seed_bin中删除

联合起来:交换器和绑定

消息是如何到达队列的呢?

当你想将消息投递到队列时,你通过把消息发送给交换器来完成。然后,根据确定的规则,RabbitMQ将会决定消息该投递到哪个队列,这些规则发送到代理服务器时,消息将拥有一个路由器--即便是空的--RabbitMQ也会将其和绑定使用的路由键进行匹配。如果相匹配的话,那么消息将会投递到该队列。如果路由的消息不匹配任何绑定模式的话,消息将进入“黑洞”。

服务器会根据路由键将消息从交换器路由到队列,但它是如何处理投递到多个队列的情况呢?

协议中定义的不同类型的交换器发挥了作用。一共有四种类型:direct  fanout topic  headers

headers交换器允许你匹配AMQP消息的header而非路由键。性能比direct差。

direct交换器:

服务器必须实现direct类型交换器,包含一个空白字符串名称的默认交换器。当声明一个队列时,它会自动绑定到默认交换器,并以队列名称作为路由键。这意味着你可以使用如下代码发送消息到之前声明的队列中去。

fanout交换器:

当你发送一条消息到fanout交换器时,它会把消息投递到所有附加在此交换器上的额队列,这允许你对单条消息做不同的反应。

topic交换器:

这类交换器允许你实现有趣的消息通信场景,它使得来自不同源头的消息能够到达同一个队列,让我们用Web应用程序日志系统作为示例。

最新文章

  1. redis lua
  2. IIS提示“异常详细信息: System.Runtime.InteropServices.ExternalException: 无法执行程序”
  3. android: SQLite 数据库的最佳实践
  4. Oracle数据分页,并传出数据集
  5. magento关于站点搬家,换空间
  6. webstorm 自定义代码模板
  7. php读取excel文件的实例代码
  8. ♫【jQuery插件】图片放大镜
  9. ios开发——实用技术篇&网络音频播放
  10. JQUERY1.9学习笔记 之基本过滤器(九) 小于选择器
  11. java多线程 并发 编程
  12. 孤立的SQL用户
  13. 编译、裁剪、安装、删除 Ubuntu内核和模块管理
  14. [LeetCode] The Maze III 迷宫之三
  15. android评分条RatingBar自定义设置
  16. thinkphp 3.2 加载第三方库 第三方命名空间库
  17. HUE的安装
  18. 转: Xshell鼠标选中,终端立即中断(CTRL-C)的问题
  19. Taking a peek inside with the Actuator
  20. Redis学习五:Redis的持久化-RDB

热门文章

  1. 芝麻HTTP:分析Robots协议
  2. SQLite笔记
  3. ajax交互数据简单拼装,数组成字符串
  4. [JZOJ5522] 图
  5. [BZOJ1212][HNOI2004]L语言
  6. 使用 vscode将本地项目上传到github以及删除github上的某个文件夹
  7. 绘制静态地图API-高德地图
  8. OOP面向对象程序设计
  9. 在 HTML5 中捕获音频和视频
  10. kubernetes1.9中部署dashboard