RabbitMQ 入门:2. Exchange 和 Queue

上文RabbitMQ 入门:1. Message Broker(消息代理)提到过 RabbitMQ 实现了 AMQP 这个协议(RabbitMQ 所支持的 AMQP 的版本是 0.9.1),这个协议的内容很多,但为了构建入门级的分布式应用,我们只需要了解以下几点即可。

 

在最简单的场景下,RabbitMQ 的架构示意图大致如下:

  • 首先某个消息从发布者那里发往     RabbitMQ

  • 这个消息需要声明一个 Exchange(也可以翻译成交换机),并被发往这个     Exchange

    • Exchange      有点类似“暂存区”,消息都会发往 Exchange。用个类比来说:Exchange      就像邮箱一样,我们写的信件首先都要放到邮箱里才能进行发送。

  • 然后,Exchange     将使用消息内的一些信息以及它自己的配置来决定一条或多条发送消息的路由。

  • 这些路由都通向一个 Queue(队列),消息会存储在这个 Queue 里,等待消息的接收者来进行使用。

  • 一个消息的接收者可以使用 Queue 中的信息。一旦确认这个消息被传递成功,那么它将从 Queue 中被删除。

    • RabbitMQ      所提供的松耦合的特性,主要是因为 Exchange Queue 的分离。

    • 继续使用邮箱的类比,Queue 就相当于是接收信件的邮箱。而根据邮件地址,邮件系统会选择不同的邮箱来接收邮件。

 

而由于 RabbitMQ 处理的是消息,而不是信件,所以它的选项会更多:RabbitMQ 一共有 4 Exchange

  • Direct Exchange。它是默认的 Exchange 。它会把消息发送到一个接收者。如果注册了多个接收者来监听同样的路由 Key,那么     RabbitMQ 将会向每个 Queue 轮流发送一条消息,相当于提供了一个简单的负载均衡

  • Fanout Exchange 它把消息的副本发送到每个绑定到该     Exchange Queue 上面。而这里的 Queue 没有办法对消息进行过滤,如果需要过滤,则需要在消息接收者那里实现。

  • Topic Exchange。它和 Direct Exchange 类似,但不同的是:每个消息接收者监听特定的路由 Key,它们会收到消息的副本。

    • 例如聊天室就可以使用 Topic      Exchange。每个聊天室的 ID 可以作为路由 Key,这样就可以保证消息只会发送给同一个聊天室的其他参与者。

  • Headers Exchange。这类     Exchange 会忽略路由 Key,取而代之的是,它们会查看消息的 Header,并由此来决定消息应该发往哪个 QueueQueue 可以有一个或多个 Header 用来进行匹配。这也就开启了复杂的路由场景,例如某个 Queue 有时可以接收到某类消息而有时则不行。

 

下面仅针对 Fanout Exchange 进行进一步说明:

 

Fanout Exchange

当消息被发往 RabbitMQ 的时候,需要指明它需要发送到哪个 Exchange。而这个Exchange 就可以被设置成为所谓的 Fanout Exchange

使用 Fanout Exchange,消息会被克隆,并被发送到所有与这个 Exchange 绑定的 Queue 上,如下图:

这里每一个 Queue 都会得到属于自己的消息的副本,这些消息副本就i可以被消息的接收者所使用。

在很多大规模多人游戏的场景中,经常使用这种方式来同步玩家的数据:每个玩家都订阅到一个Fanout Exchange,你游戏的实例只需要将数据发送到一个地方即可,游戏中其他的玩家就会获得更新,而你的游戏实例就不需要知道如何数据发往每一个玩家了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305326.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【组图】地震前线归来--心中的震撼

5.12号获悉家乡发生大地震,不放心在成都的家人朋友,于13日从北京赶回成都,再了解事态严重性,并确定家人情况后,14日与众多志愿者一起从成都出发,取道彭州市,通济镇,白水河镇&#xf…

mysql数据库密码错误_MySQL数据库经典错误六 数据库密码忘记的问题

数据库密码忘记的问题[rootzs ~]# mysql -uroot -pEnter password:ERROR 1045 (28000): Access denied for user ‘root’’localhost’ (using password: YES)[rootzs ~]# mysql -uroot -pEnter password:ERROR 1045 (28000): Access denied for user ‘root’’localhost’ (…

前端 input怎么显示null_小猿圈WEB前端之HTML5+CSS3面试题(一)

学习是一件非常充实的过程,特别是把自己的乐趣变成工作的时候,很多朋友就喜欢学习web前端,所以学习前端,也希望从事前端的工作,但是因为缺少实战经验,所以很多都是卡在面试这关上,下面小猿圈总结…

使用AXIS开发Web Service的示例

1)先下载Axis的文件包 :http://ws.apache.org/axis/2)新建web工程 名称为:axis 拷贝Axis包中 webapps/axis 目录中的所有文件到工程目录的 webroot 目录中, 然后 刷新 工程 新建一个 java 文件,文件名称为:HelloClient…

聊聊Interlocked.CompareExchange吧?

【导读】私下空余时间一直在研究开源框架,当然也就少不了学习优秀源码,本文也是我查看有关源码时,触碰到我个人知识盲区,做此记录,分享下Interlocked.CompareExchange这玩意用法被讲的很烂了,为何再次被提及…

sae 本地环境 mysql数据库_SAE本地环境与真实环境的差别

其实从刚开始用的时候就发现本地环境和真实环境有不同,导致本地环境我都没怎么用。1、本地环境的php是32bit版本的,真实环境是64bit的。这是我发现的第一个不相同的地方,就是因为这个,直接导致我的应用绝大部分调试工作都是在把代…

winform 统计大量数据重复的元素个数_面试系列:十个海量数据处理方法大总结...

本文将简单总结下一些处理海量数据问题的常见方法。当然这些方法可能并不能完全覆盖所有的问题,但是这样的一些方法也基本可以处理绝大多数遇到的问题。下面的一些问题基本直接来源于公司的面试笔试题目,方法不一定最优,如果你有更好的处理方…

C# 实现一个基于值相等性比较的字典

C# 实现一个基于值相等性比较的字典Intro今天在项目里遇到一个需求&#xff0c;大概是这样的我要比较两个 JSON 字符串是不是相等&#xff0c;JSON 字符串其实是一个 Dictionary<string, string> 但是顺序可能不同&#xff0c;和上一篇 record 使用场景中的第一个需求类似…

RIAMeeting第六次开发者交流活动。

5月的一场大地震带给我们过多的悲痛&#xff0c;但国家还要兴起&#xff0c;技术还要进步&#xff0c;让广大RIA开发者化悲愤为力量&#xff0c;继续开创中国的RIA事业吧&#xff01; 本月的25日&#xff0c;RIAMeeting将举办第六次开发者交流活动&#xff0c;本次活动邀请到了…

java字符串转时间_java字符串和时间转换

import java.text.SimpleDateFormat; import java.util.Date; //将long字符串转换成格式时间输出 public class LongToString {public static void main(String argsp[]){String time="1256006105375"; Date date=new Date(Long.parseLong(time)); SimpleDateFormat …

java 堆栈_Java中线程与堆栈的关系

栈是线程私有的&#xff0c;每个线程都是自己的栈&#xff0c;每个线程中的每个方法在执行的同时会创建一个栈帧用于存局部变量表、操作数栈、动态链接、方法返回地址等信息。每一个方法从调用到执行完毕的过程&#xff0c;就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。其…

巧用lock解决缓存击穿的解决方案

背景缓存击穿是指缓存中没有但数据库中有的数据&#xff08;一般是缓存时间到期&#xff09;&#xff0c;这时由于并发用户特别多&#xff0c;同时读缓存没读到数据&#xff0c;又同时去数据库去取数据&#xff0c;引起数据库压力瞬间增大&#xff0c;造成过大压力。解决方案1、…

ISA禁止了symantec的LiveUpdate的使用

从我们服务器将symantec升级到10.1.5.5000后&#xff0c;就发现ISA客户端的用户&#xff0c;用LiveUpdate没法升级&#xff0c;点击按钮后也会运行升级&#xff0c;但是到最后总是出现一个红色的大叉&#xff0c;说升级失败。这样客户端就只剩下手动用升级包升级或者是通过服务…

java怎么将前端的数据存到关联的表中_Java程序员最可能被考到的14个面试题

1. 如何只扫描一遍就找到位于一个链表正中间的元素&#xff1f; 这是最受欢迎的算法题之一&#xff0c;经常在电话面试中被问到。很多程序员会想&#xff0c;要知道链表的长度&#xff0c;就要先扫描一遍链表&#xff0c;然后在第二遍中取其正中的元素。所以被要求只扫描一遍就…

java 监听文件内容_java 监听文件内容变化

有时候&#xff0c;我们需要确定某些文件是否有变化而做出一些对应的动作&#xff0c;例如&#xff0c;曾经开发的一款服务器中&#xff0c;由于模块比较多&#xff0c;在运行期间有时候需要单独的输出某个模块日志&#xff0c;但又不可能总是开着日志。log4j中已经实现了可以动…

.NET Core 和 .NET Framework 启动可执行文件的差别

在 Windows 下&#xff0c;使用 .NET Framework 构建出来的应用&#xff0c;可以只有一个可执行文件&#xff0c;在可执行文件里面包含了 IL 代码。使用 .NET Core 构建出来的应用&#xff0c;将会包含一个 Exe 可执行文件&#xff0c;和对应的 Dll 文件&#xff0c;而 IL 代码…

firefox 3.0 在 windows 下的编译

&#xff08;1&#xff09;下载firefox 3.0源代码。下载并安装 mozilla-build &#xff08;2&#xff09;运行 start-msvc9.bat&#xff0c;进入shell界面&#xff0c; 查看环境变量&#xff1a; echo $PATH echo $LIB echo $INCLUDE &#xff08;3&#xff09;确保: windo…

常见的几种最优化方法

阅读目录1. 梯度下降法&#xff08;Gradient Descent&#xff09;2. 牛顿法和拟牛顿法&#xff08;Newtons method & Quasi-Newton Methods&#xff09;3. 共轭梯度法&#xff08;Conjugate Gradient&#xff09;4. 启发式优化方法我们每个人都会在我们的生活或者工作中遇到…

安卓平板运行python_使用Python进行手机平板移动开发 | 学步园

过去&#xff0c;Android和iOS上的移动应用程序开发不是Python的强项&#xff0c;但情况可能会发生变化……使用Python进行移动应用开发怎么样&#xff1f;从历史上看&#xff0c;在编写移动GUI应用程序时&#xff0c;Python并没有很强的故事。实际上&#xff0c;仅使用纯Pytho…

专业的软件安装包可以这样做!

C/S客户端开发完成&#xff0c;需要将程序交付给用户&#xff0c;直接压缩发给用户是可以的&#xff08;只是有点不专业&#xff09;&#xff0c;如果能有一个比较好看的安装界面&#xff0c;那档次就不一样了。本文介绍怎么使用Adanced Installer 17.9 制作专业的Windows 客户…