RabbitMQ实战:消息通信模式和最佳实践

本系列是「RabbitMQ实战:高效部署分布式消息队列」书籍的总结笔记。

通过前2篇的介绍,了解了消息通信的主要元素和交互过程,以及如何运行和管理RabbitMQ,这篇将站在开发模式的角度理解「面向消息通信」带来的好处,以及在各种场景下的最佳实践。

通过介绍,你会了解到:

  • 面向消息通信的好处
  • 发后即忘模型
  • 用RabbitMQ实现RPC

面向消息通信的好处

主要从异步状态思维、处理能力扩展性、集成复杂度方面,说明面向消息通信的好处。

异步状态思维

当将消息通信集成到应用程序时,开发模式将从同步模型变为异步模型,RabbitMQ提供了不同的方法,允许我们在一处发送请求,在另一处进行处理,这样同步程序可以继续执行其他逻辑。

举个简单的例子来说明,通过支付宝还信用卡:

  • 用户填写信用卡号、发卡银行、持卡人姓名、还款金额,提交还款申请;
  • 支付宝会立即提示用户,申请已提交,多少小时内完成还款;
  • 还款完成后,会推送给用户一条消息,提醒还款是否成功;

如果是同步请求,用户需要等待几个小时查看结果,等待过程中不能进行其他操作,这是很不合理的。

异步的思维是将请求和处理分离,在应用中紧密耦合的两部分中间使用RabbitMQ,请求解析后,发送一条业务能够理解的消息到RabbitMQ,就返回给用户,真正的处理由另外的服务异步处理。

扩展性

随着业务的扩展,对服务处理能力的要求越来越高,RabbitMQ可以很简单的增加处理能力。

因为RabbitMQ可以将请求在处理服务器间平均地分发,不需要负载均衡器了。

零成本API

系统间相互调用,需要约定一套API,通常来讲,需要花费一点点时间,编写一大段代码将传入的HTTP请求转化为应用程序中的函数调用。

如果使用AMQP来连接应用程序的各个部分,无需额外定义API,使用消息通信即可。另外, AMQP是语言无关的,拥有数十种语言的本地语言绑定。

发后即忘模型

当考虑消息通信能够解决的问题类型时,消息通信适用的主要领域是的「发后即忘」处理模式。关心的是任务将会完成,但无须实时完成,创建一个任务,发送到交换器上后,就可以返回继续工作,甚至都不需要通知用户任务已经完成。

匹配该模式的两种类型任务:

  • 批处理:针对大型数据集合的工作或者转换,多个任务对数据集合的独立部分进行操作;
  • 通知:对发送事件的描述,可以是消息的日志,或者通知另一个程序或者管理员;

书上介绍的实例比较简单,就不在此列出了,主要是根据不同的场景,确定交换器的类型和routingkey,可以参考上一篇介绍的「收集日志」的例子进行理解。

用RabbitMQ实现RPC

有多种方式来实现远程过程调用RPC,比如REST API、SOAP、Thrift等,这些传统的RPC实现方法有共同之处:客户端和服务器紧密相连、而且要等待返回结果。另外考虑这些问题:

  • 当有多个服务节点时,客户端如何发现对应服务器;
  • 如果客户端连接的RPC服务器崩溃了,客户端需要额外逻辑进行重连;

通过MQ服务器来实现时,只是简单地发布消息而已,将消息路由到合适的地方放,通过多台RPC服务器对消息进行负载均衡,当处理消息的服务器崩溃时,将RPC消息重发到另一台。

现在的问题在于,如果将应答返回给客户端?

RabbitMQ使用消息来发回应答,在AMQP消息头里有一个字段叫做reply_to,消息的生成者可以通过该字段来确定队列名称,并监听队列等待应答,消息接收者能够检查reply_to字段,并创建包含应答内容的新的消息,并以队列名称作为路由键。

关于reply_to的队列名称,如果生成者声明了没有名字的队列,RabbitMQ为自动生成一个唯一的队列名,同时在声明的时候指定exclusive参数,确保只有创建队列的生产者可以读取队列上的消息。

这样,所有RPC客户端要做的,就是声明临时的、排他的、匿名队列,并将该队列名称包含到RPC消息的reply_to头中,这样服务器端就知道应答消息该发往哪儿了。

很多场景使用「发后即忘」模型,不需要处理者响应,如果需要响应,可以使用RabbitMQ的RPC模型。

下一篇将介绍RabbitMQ集群和高可用性以及它们的设置。

欢迎扫描下方二维码,关注我的个人微信公众号 ~

原文地址:http://blog.51cto.com/13714880/2116093

时间: 2024-11-09 02:03:40

RabbitMQ实战:消息通信模式和最佳实践的相关文章

[老老实实学WCF] 第九篇 消息通信模式(上) 请求应答与单向

老老实实学WCF 第九篇 消息通信模式(上) 请求应答与单向 通过前两篇的学习,我们了解了服务模型的一些特性如会话和实例化,今天我们来进一步学习服务模型的另一个重要特性:消息通信模式. WCF的服务端与客户端在通信时有三种模式:单向模式.请求/应答模式和双工模式. 如果选用了单向模式,调用方在向被调用方进行了调用后不期待任何回应,被调用方在执行完调用后不给调用方任何反馈.如客户端通过单向模式调用了一个服务端的操作后,就去干别的了,不会等待服务端给他任何响应,他也无从得知调用是否成功,甚至连发生了

[老老实实学WCF] 第十篇 消息通信模式(下) 双工

原文:[老老实实学WCF] 第十篇 消息通信模式(下) 双工 老老实实学WCF 第十篇 消息通信模式(下) 双工 在前一篇的学习中,我们了解了单向和请求/应答这两种消息通信模式.我们知道可以通过配置操作协定的IsOneWay属性来改变模式.在这一篇中我们来研究双工这种消息通信模式. 在一定程度上说,双工模式并不是与前面两种模式相提并论的模式,双工模式的配置方法同前两者不同,而且双工模式也是基于前面两种模式之上的. 在双工模式下,服务端和客户端都可以独立地调用对方,谁都不用等待谁的答复,同样也不期

Redis基础---消息通信模式

Redis发送订阅通信模式 Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 发布订阅(pub/sub)实现了消息系统,发送者(在redis术语中称为发布者)在接收者(订阅者)接收消息时发送消息.传送消息的链路称为信道. 在Redis中,客户端可以订阅任意数量的信道. 首先,订阅者-客户端subscribe消息 localhost:6379> SUBSCRIBE redisChat Reading messages... (

wcf_消息通信模式(下) 双工通讯

原文:[老老实实学WCF] 第十篇 消息通信模式(下) 双工 第十篇 消息通信模式(下) 双工 在前一篇的学习中,我们了解了单向和请求/应答这两种消息通信模式.我们知道可以通过配置操作协定的IsOneWay属性来改变模式.在这一篇中我们来研究双工这种消息通信模式. 在一定程度上说,双工模式并不是与前面两种模式相提并论的模式,双工模式的配置方法同前两者不同,而且双工模式也是基于前面两种模式之上的. 在双工模式下,服务端和客户端都可以独立地调用对方,谁都不用等待谁的答复,同样也不期待对方答复,因为如

.Net RabbitMQ之消息通信

1.消息投递服务 RabbitMQ是一种消息投递服务,怎么理解这句话呢?即RabbitMQ即不是消息的生产者,也是消息的消费者.他就像现实生活中快递模式,消费者在电商网站上下单买了一件商品,此时对应的生产者(商家)则生产了一件货物(概念上的生产,可能已经生产好了),接着生产者(商家)将货物发送给快递公司,因为消费者下单了这个货物,相当于订阅了这件货物,所以快递公司将会把这件货物发送给对应的消费者.RabbitMQ就相当于这里面的快递公司.服务在生产者和消费者之间建立桥梁,即通信. 2.Rabbi

Mongo实战之数据空洞的最佳实践

问题背景: 某天,开发部的同事跑过来反映: mongodb数据文件太大,快把磁盘撑爆了!其中某个db占用最大(运营环境这个db的数据量其实很小) 分析: 开发环境有大量测试的增/删/改操作,而由于MongoDB顺序写的原因,在我们删除部分无用数据后,它的storageSize并不会变小,这就造成了大量的数据空洞. 解决办法 1. 使用MongoDB自带的compact命令: db.collectionName.runCommand("compact") 这种方式是collection级

最重要的 Java EE 最佳实践

参考:IBM WebSphere 开发者技术期刊: 最重要的 Java EE 最佳实践 IBM WebSphere 开发者技术期刊: 最重要的 Java EE 最佳实践 2004 年 IBM? WebSphere? 开发者技术期刊中曾发表过一篇名称类似的文章,本文是其更新版本.这个修正版中考虑了一些不断变化的技术趋势,更重要的是推荐了一些作者认为应当广泛遵循.但尚未广泛遵循的实践. 2 评论: Keys Botzum, 高级技术人员 , EMC Kyle Brown, 杰出工程师, EMC Ru

最重要的J2EE最佳实践

始终使用 MVC 框架. MVC 框架可以将业务逻辑(Java beans 和 EJB 组件).控制器逻辑(Servlets/Struts 动作).表示层(JSP.XML/XSLT)清晰地分离开来.良好的分层可以带来许多好处. MVC 框架对于成功使用 J2EE 是如此重要,以致没有其他最佳实践可以与其相提并论.模型-视图-控制器(MVC)是设计 J2EE 应用程序的基础.MVC 将您的程序代码简单地划分下面几个部分: 负责业务逻辑的代码(即模型??通常使用 EJB 或者普通的 Java 对象来

Android应用开发:核心技术解析与最佳实践pdf

下载地址:网盘下载 <Android开发模式与最佳实践>首先介绍了安卓开发的基础知识,包括如何搭建环境.一般的开发流程.给App添加测试用例等.接下来是组成安卓框架的各个模块和组件,包括应用的结构,如何使用widget和component,以及怎么使用view.然后介绍了应用的设计模式,以及如何创建一个方便管理和更新的App,包括如何添加多媒体和网络连接等.<Android开发模式与最佳实践>后面部分也覆盖了可选hardware组件.安卓Wear和安卓TV.最后介绍了一些关键的优化