【RabbitMQ系列】队列、绑定、交换器
队列:
从概念上来讲,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应用程序日志系统作为示例。
【RabbitMQ系列】队列、绑定、交换器的更多相关文章
- 5.RabbitMQ系列之headers交换器
headers exchange是根据消息header值而不是routing key将消息路由到队列的交换器. 生产者在消息头中以键值对的形式添加一些值,并将其发送到headers exchange, ...
- RabbitMQ系列(三)RabbitMQ交换器Exchange介绍与实践
RabbitMQ交换器Exchange介绍与实践 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchang ...
- Go语言系列之RabbitMQ消息队列
1. RabbitMQ是什么? MQ 是什么?队列是什么,MQ 我们可以理解为消息队列,队列我们可以理解为管道.以管道的方式做消息传递. 生活场景: 1.其实我们在双11的时候,当我们凌晨大量的秒 ...
- 7.RabbitMQ系列之topic主题交换器
topic主题交换器它根据在队列绑定的路由键和路由模式通配符匹配将消息路由到队列. 生产者在消息头中添加路由键并将其发送到主题交换器. 收到消息后,exchange尝试将路由键与绑定到它的所有队列的绑 ...
- RabbitMQ消息队列系列教程(二)Windows下安装和部署RabbitMQ
摘要 本篇经验将和大家介绍Windows下安装和部署RabbitMQ消息队列服务器,希望对大家的工作和学习有所帮助! 目录 一.Erlang语言环境的搭建 二.RabbitMQ服务环境的搭建 三.Ra ...
- RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列
一.理论: .net环境下,C#代码调用RabbitMQ消息队列,本文用easynetq开源的.net Rabbitmq api来实现. EasyNetQ 是一个易于使用的RabbitMQ的.Net客 ...
- RabbitMQ新建交换机、队列、交换机和队列绑定
新建交换机: 1.登录你要配置的交换机地址: 2.选择exchange,下拉选择add a new exchange 3.点击add exchange.完成 新建队列: 1.选择queues: 2.下 ...
- 6.RabbitMQ系列之direct直连交换器
我们通过fanout exchange(扇型交换机)实现生产者发送一个消息,这个消息同时被传送给所有队列.但是有时我们不希望所有的消息都被所有队列接收,我们希望可以指定类型为a的消息只能被队列A接收, ...
- Spring Boot(十四)RabbitMQ延迟队列
一.前言 延迟队列的使用场景:1.未按时支付的订单,30分钟过期之后取消订单:2.给活跃度比较低的用户间隔N天之后推送消息,提高活跃度:3.过1分钟给新注册会员的用户,发送注册邮件等. 实现延迟队列的 ...
- RabbitMQ系列(二)深入了解RabbitMQ工作原理及简单使用
深入了解RabbitMQ工作原理及简单使用 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchange介绍 ...
随机推荐
- 小白进阶之Scrapy(基于Scrapy-Redis的分布式以及cookies池)
首先我们更新一下scrapy版本.最新版为1.3 再说一遍Windows的小伙伴儿 pip是装不上Scrapy的.推荐使用anaconda .不然还是老老实实用Linux吧. conda instal ...
- <训练赛> 垃圾陷阱
垃圾陷阱 时间限制: 1 Sec 内存限制: 128 MB提交: 78 解决: 38[提交][状态][讨论版] 题目描述 卡门--农夫约翰极其珍视的一条Holsteins奶牛--已经落了到&quo ...
- ASP.NET VS2013 Office 转 PDF
本文适用于VS2013 项目中的Word转换为PDF.Excel转换为PDF.PPT转换为PDF 0.一种更加简单方便的方法 1.本页所用的方法在本机测试时基本不会出现问题,只是偶尔PPT转PDF失败 ...
- PyTorch官方中文文档:torch.Tensor
torch.Tensor torch.Tensor是一种包含单一数据类型元素的多维矩阵. Torch定义了七种CPU tensor类型和八种GPU tensor类型: Data tyoe CPU te ...
- MySQL到MongoDB的数据同步方法!
许多公司随着业务发展,单数据库实例已经不能满足业务需要,需要定期进行数据交换,同步到MongoDB, 或其他位置的MySQL,以分散数据库的并发压力. 目前大部分都采用自行开发的方式处理,存在开发成本 ...
- 【BZOJ1500】【NOI2005】维修数列(Splay)
[BZOJ1500][NOI2005]维修数列(Splay) 题面 不想再看见这种毒瘤题,自己去BZOJ看 题解 Splay良心模板题 真的很简单 我一言不发 #include<iostream ...
- Python模块之hashlib模块、logging模块
一.hashlib模块 hashlib模块介绍:hashlib这个模块提供了摘要算法,例如 MD5.hsa1 摘要算法又称为哈希算法,它是通过一个函数,把任意长度的数据转换为一个长度固定的数据串,这个 ...
- 基于jenkins的go语言项目自动化发布遇到的坑
之前我们研究dep,就是为了有一天可以实现go语言项目在我们系统里的CI. 之前联物科技的项目主要是使用java作为后端开发语言,基于jenkins的自动发布,使用了pipeline编写脚本,从拉取代 ...
- IPFS:世界正在悄然发生变化
世界正在悄然发生变化(IPFS) 2015-05-05 Juan Benet 在自己的终端里面敲入了下面的文字: > echo "hello worlds" | ipfs a ...
- PHP开发中涉及到emoji表情的几种处理方法
最近几个月做微信开发比较多,存储微信昵称必不可少 可这万恶的微信支持emoji表情做昵称,这就有点蛋疼了 一般Mysql表设计时,都是用UTF8字符集的.把带有emoji的昵称字段往里面insert一 ...