前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RabbitMQ实战:消息通信模式和最佳实践

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

作者头像
情情说
修改2018-04-28 13:03:37
1.2K0
修改2018-04-28 13:03:37
举报
文章被收录于专栏:情情说情情说

本系列是「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集群和高可用性以及它们的设置。

欢迎扫描下方二维码,关注我的个人微信公众号,查看更多文章 ~

公众号:情情说
公众号:情情说
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 面向消息通信的好处
    • 异步状态思维
      • 扩展性
        • 零成本API
        • 发后即忘模型
        • 用RabbitMQ实现RPC
        相关产品与服务
        负载均衡
        负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档