使用RabbitMQ进行消息传递

RabbitMQ是一个强大的消息代理,可用于实现不同的消息传递模式。 即使有出色的教程 (使用不同的语言和框架),也很难理解这些概念。 在这篇文章中,我想展示一些可以用RabbitMQ实现的不同范例,以及为什么要为某些概念而苦恼。

使用队列发送和接收

最简单的方法是使用队列发送消息,并让使用者从同一队列中读取数据。

没有什么可以阻止您拥有多个使用者,每个使用者都可以处理队列中的消息。 消耗完一条消息后,该消息将从队列中消失。

当有需要执行的任务并且哪个消费者处理任务无关紧要时,这特别适合。

发布/订阅

并非所有用例都只是想消耗一条消息的方式。 通常,您希望拥有多个应该全部处理所有消息的使用者。 一个示例可以是将对象存储在不同的数据存储中(例如,搜索索引和数据库),另一种是域事件,例如已提交并应由订单管理系统和库存系统处理的订单。 这需要一种发布/订阅机制,RabbitMQ当然已经涵盖了这一点。

与仅使用队列相比,最大的区别是在这种情况下,生产者不再直接写队列。 一个称为Exchange的实例将接受邮件并将其转发到一个或多个队列。

要使用经典的发布/订阅模型,您可以使用FanoutExchange将消息转发到一个或多个队列。 要连接交换和队列,您需要声明一个绑定,在这种情况下,用于特定交换的所有消息都应转发到特定队列。

每个使用者都从专用队列中读取消息。 这也意味着您将需要为每个正在监听的使用者绑定一个绑定。

使用RabbitMQ,可以使用在使用者停止监听时自动删除的队列。 这允许消费者加入和离开时具有非常动态的行为。

看我们的第一个示例,您可能想知道为什么有不同的方式来发送消息,发送队列和进行交换。 事实证明,发送到队列确实是不可能的。 总是存在一个默认交换,它仅转发消息。 此默认交换仅获取消息的某个路由键(即队列名称),并将它们以相同的名称放入队列中。

发布/订阅过滤

除了将消息发送到已注册进行交换的所有队列之外,还可以根据路由密钥对消息进行过滤。 所有消息都被发送到一个交换机,该交换机通过查看路由键来确定将消息发送到哪个队列。

如果要与路由键完全匹配,请执行DirectExchange。

将DirectExchange绑定到队列时,需要提供一个路由密钥,该路由密钥将确定将为此队列考虑的路由密钥。 如果要分配多个路由键,则可以为同一队列添加多个绑定。

您还可以提供通配符来确定哪些路由键应用于队列,这是通过使用需要分层路由键的TopicExchange来完成的。

一开始,这两个交流-直接交流和主题交流-可能最让我感到困惑。 当涉及主题时,我正在考虑经典的发布订阅系统,例如使用FanoutExchange时。 交换名称是客户端正在注册的主题。 但是这里的主题是指在现有交换机上的一种路由。 与DirectExchange相同:我希望直接交换类似于第一个示例,在第一个示例中,您直接将消息发送到队列。 但是,在这种情况下,直接交换是指直接路由,因此您始终需要为此提供路由密钥。

如果您想进一步了解各种交流,请访问RabbitMQ网站上的教程 。

翻译自: https://www.javacodegeeks.com/2018/03/messaging-with-rabbitmq-2.html

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

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

相关文章

android 为什么fragment在调用hide方法后没有生效_Android 多 Fragment 切换优化

code小生,一个专注 Android 领域的技术平台公众号回复 Android 加入我的安卓技术群作者:DDDong丶链接:https://www.jianshu.com/p/c8e8a0249911声明:本文已获DDDong丶授权发表,转发等请联系原作者授权问题分析一直在简书里看别人的…

mysql如何查看远程用户_MySQL系列(十)--用户权限及远程访问

本文基于MySQL8.0,记录一下完整的远程访问的过程,以及这个过程中可能遇到的问题,MySQL运行在阿里云服务器,操作系统:CentOS 7.6 64位顺便说下,买服务器还是要双十二这种拉新活动再买,用一个新的…

spring mvc拆分_Spring集成–强大的拆分器聚合器

spring mvc拆分健壮是什么意思? 在本文的上下文中,健壮性是指在不立即返回给调用者的情况下管理流中的异常条件的能力。 在某些处理方案中, n个 m个回答足以做出结论。 通常具有这些趋势的示例处理场景是: 财务,保…

mysql typeindex_explain mysql的type字段,索引的类型

4.type这列很重要,显示了连接使用了哪种类别,有无使用索引.从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL(1).system这是const联接类型的一个特例。表仅有一行满足条件.如下(t3表上的id是 primary key)mysql> explain select * from (select * from t3 …

JasperReports:棘手的部分

如果您使用Java进行编程的时间足够长,则有可能需要为业务用户生成报告。 就我而言,我已经看到几个项目使用JasperReports库来生成PDF和其他文件格式的报告。 最近,我荣幸地观察了Mike和他的团队使用上述报告库及其面临的挑战。 简而言之Jasp…

win mysql 2003错误_windows MySql 报1067错误 2003错误

1067错误原因是我把安装mysql的目录的名字改了。但是位于目录里面的my.ini配置文件没有修改,玛德我真傻逼。把my.ini的#Path to installation directory. All paths are usually resolved relative to this.basedir"D:/My_MySQL/"这下面一行的路径名改成目…

java heroku_Heroku和Java –从新手到初学者,第1部分

java heroku最近,我听说Heroku允许在Cedar堆栈中部署Java应用程序。 由于没有真正的软件构想,我决定尝试一下,仅配置SOMETHING以在Heroku上运行。 我对ReST有所了解(我仍然想学习并练习),所以我决定我的第…

mysql 合服_风云私服合区的方法详解(mysql数据库合并)

只能合并帐号,MY的库不能合并。倒数据前请留好备份,防止发生以外,破坏你得数据,切忌.1)首先确认你的机器上必须装MySQL 以及 mysql-connector-odbc-5.1.1-win32.msimysql-connector-odbc-5.1.1-win32.msi 就是 MySQL ODBC 5.1,你可…

mysql自定义数据类型_MySQL中的数据类型

一.MySQL中的数值类型分类MySQL中数值类型主要有三类:数字类型,字符串类型,时间类型。1.数字类型1.1整数tinyint 1字节smallint 2字节mediumint 3字节int 4字节bigint …

分布式系统开发注意点_分布式系统开发注意事项

分布式系统开发注意点开发分布式软件系统时,要考虑许多因素。 如果您甚至不知道第一句话中我在说什么,那么让我为您提供一些见解,示例以及有关分布式系统的实例。 总览 分布式系统是指多个物理硬件设备与单独的离散用户交互并通过这些硬件设…

String#repeat来到Java吗?

JDK-8197594 (“ String#repeat”)在其“描述”中包括以下内容:“长期以来,一直要求一种用于重复字符序列的String方法,没有后续操作。” 可以在JDK-8197594的“问题链接”中找到有关String类中用于重复字符…

mysql 什么是幻读_何为幻读?MySQL又是如何解决幻读的?

一、什么是幻读在一次事务里面,多次查询之后,查询的结果集的个数不一致的情况叫做幻读。而多出来或者少的哪一行被叫做 幻行二、为什么要解决幻读在高并发数据库系统中,需要保证事务与事务之间的隔离性,还有事务本身的一致性。三、…

电子电气架构——车载ECU刷写工具vFlash简介

电子电气架构——车载ECU刷写工具vFlash简介 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值&a…

mysql执行系统命令_mysql 命令行执行 sql

1.直接输入sql执行MySQL> select now();---------------------| now() |---------------------| 2013-09-18 13:55:45 |---------------------1 row in set (0.00 sec)2.执行编写好的sql脚本mysql> source /home/1.sql---------------------| now() |-------------------…

jboss7.1.1 部署_在JBoss AS 7上部署BroadleafCommerce 2.0

jboss7.1.1 部署前2个步骤实际上与Broadleaf无关&#xff0c;但是提到该步骤是为了使其易于执行&#xff08;复制/粘贴&#xff09;这些步骤。 步骤&#xff03;1&#xff1a;在JBoss AS中配置数据源。 <datasource jta"true" jndi-name"java:jboss/datasou…

java中n次方怎么表示_java如何计算一个数的n次方

java递归算法&#xff0c;代码如下&#xff1a;public class Test3 { public double zhishu(double x,double y){ if(y>0){ return x*zhishu(x,y-1); }else if(y<0){ return (x*zhishu(x,-y-1)); }else{ return 1; } } public double fuzhishu(…

枚举集合的EnumSet

在上一篇博客文章中&#xff0c;我们发现了EnumMap用于带有枚举键的映射。 您可能已经观察到&#xff0c;还有一个专门针对枚举优化的Set &#xff1a; EnumSet 。 我们再次定义一个CoffeeType枚举&#xff1a; public enum CoffeeType {ESPRESSO, POUR_OVER, FRENCH_PRESS, …

linux下mkdir头文件_Linux中判断一个目录是否存在,如果不存在就创建这个目录

在操作文件目录时我们常常会考虑如下的功能&#xff1a;1、判断文件是否存在&#xff0c;并判断文件是否可写/目录是否存在Linux下&#xff1a;#includeint access(const char* pathname, int mode);参数介绍&#xff1a;返回值&#xff1a;成功0&#xff0c;失败-1pathname 是…

mac 连接hbase的图形化界面_MAC安装Hbase以及Hbase基本命令

安装Hbase1&#xff0e;官网下载安装包&#xff0c;我下载的是hbase-2.4.0-bin.tar.gz。2&#xff0e;解压&#xff1a;tar zxf hbase-2.4.0-bin.tar.gz3&#xff0e;安装JDK&#xff0c;并设置JAVA_HOME&#xff0c;通过vi ~/.bash_profile&#xff0c;设置环境变量export JAV…

ldap java_使用LDAP保护Java EE6中的Web应用程序

ldap java在上一篇文章中&#xff0c;我们解释了如何在通过传输层安全性&#xff08;TLS&#xff09;/安全套接字层&#xff08;SSL&#xff09;传输数据时保护数据。 现在让我们尝试了解如何为使用LDAP服务器进行身份验证的基于JEE 6的Web应用程序应用安全机制。 目的&#x…