本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://oldratlee.com/post/2013-02-01/synchronous-rpc-vs-asynchronous-message
在阿里的平台技术部参与开发了Dubbo(远程调用服务)和Napoli(消息解决方案),又给网站应用支持这2个产品2年,了解了这2个产品的实现及应用对这两个产品的用法。
大部分情况下,“给定场景下应该使用这两个产品中哪个”这个问题,大家都会容易决定,而且不需要多少讨论。
我为什么要拿出来讨论一下:
- 一些场景会比较模糊,觉得都可以使用。这时需要知道产品缺点,而不是看到优势。
- 一些新人会觉得产品功能是可以替换的,要给说明一下。
这里简单说一下两者的区别。
系统结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
RPC系统结构:
+----------+ +----------+
| Consumer | <=> | Provider |
+----------+ +----------+
Consumer调用的Provider提供的服务。
Message Queue系统结构:
+--------+ +-------+ +----------+
| Sender | <=> | Queue | <=> | Receiver |
+--------+ +-------+ +----------+
Sender发送消息给Queue;Receiver从Queue拿到消息来处理。
|
功能特点
在架构上,RPC和Message的差异点是,Message有一个中间结点Message Queue,可以把消息存储。
消息的特点
- Message Queue把请求的压力保存一下,逐渐释放出来,让处理者按照自己的节奏来处理。
- Message Queue引入一下新的结点,让系统的可靠性会受Message Queue结点的影响。
- Message Queue是异步单向的消息。发送消息设计成是不需要等待消息处理的完成。
所以对于有同步返回需求,用Message Queue则变得麻烦了。
PRC的特点
- 同步调用,对于要等待返回结果/处理结果的场景,RPC是可以非常自然直觉的使用方式。
# RPC也可以是异步调用。
- 由于等待结果,Consumer(Client)会有线程消耗。
如果以异步RPC的方式使用,Consumer(Client)线程消耗可以去掉。但不能做到像消息一样暂存消息/请求,压力会直接传导到服务Provider。
适用场合说明
- 希望同步得到结果的场合,RPC合适。
- 希望使用简单,则RPC;RPC操作基于接口,使用简单,使用方式模拟本地调用。异步的方式编程比较复杂。
- 不希望发送端(RPC Consumer、Message Sender)受限于处理端(RPC Provider、Message Receiver)的速度时,使用Message Queue。
随着业务增长,有的处理端处理量会成为瓶颈,会进行同步调用到异步消息的改造。
这样的改造实际上有调整业务的使用方式。
比如原来一个操作页面提交后就下一个页面会看到处理结果;改造后异步消息后,下一个页面就会变成“操作已提交,完成后会得到通知”。
不适用场合说明
RPC同步调用使用Message Queue来传输调用信息。 上面分析可以知道,这样的做法,发送端是在等待,同时占用一个中间点的资源。变得复杂了,但没有对等的收益。
对于返回值是void的调用,可以这样做,因为实际上这个调用业务上往往不需要同步得到处理结果的,只要保证会处理即可。(RPC的方式可以保证调用返回即处理完成,使用消息方式后这一点不能保证了。)
返回值是void的调用,使用消息,效果上是把消息的使用方式Wrap成了服务调用(服务调用使用方式成简单,基于业务接口)。
补记,关于解耦讨论
微博上inter12一些讨论,觉得很有意义补记下来。
inter12:这两者可以拿来比较,但是个人感觉并不是同一个层面的问题。RPC是分布式服务之间调用的一种解决方案,是我们在做架构设计决策时同分布式对象,REST等层面的东西比较,决策的一个方案! 消息系统更多是我们为了解决系统之间的解耦,以及性能问题等方面所考虑的方案! 说的有些乱,望鼎哥指点下。
oldratlee:回复@inter12:你说到很多关键点了,“分布式对象”“解耦”“性能”,这些都可以用来看两者的差异。 如果从两个机器间数据的传递(调用、消息都是数据)角度看,两者效果相同,区别只是使用方式、技术指标:同步异步(比如 是否等反馈 )、数据是否暂存、强弱类型(比如 有独立的业务方法,数据类型)等等
inter12提到了“解耦”,“解决系统之间的解耦”使用消息时大家常常说到的一点,一个重要权衡方面!
个人觉得,“解耦”不如“暂存”,是消息相对RPC的关键区别,原因说明如下:
消息的解耦特征,主要体现在:
- 消息的发送者,不需要关心接收者的信息。 服务通过注册中心也可以做到,即服务调用者到注册中心查询服务提供者信息,调用者不需知道。
- 消息的发送者,不用关心可以发个几个关心的消息组件。
这一点RPC可以通过服务编排做到。
所属标签:
RPC,
JMS,
Queue,
message,
远程调用,
消息,
同步,
异步,
Dubbo,
MetaQ,
napoli,
HSF,
转自 :http://oldratlee.com/post/2013-02-01/synchronous-rpc-vs-asynchronous-message
分享到:
相关推荐
远程调用服务(RPC)和消息(MessageQueue)对比在阿里的平台技术部参与开发了Dubbo(远程调用服务)和Napoli(消息解决方案),又给网站应用支持这2个产品很长一段时间,了解了这2个产品的实现及应用对这两个产品的用法。...
在分布式系统中,消息队列(Message Queue,MQ)是一种重要的通信机制,它允许不同的服务之间异步交换信息,从而提高系统的可扩展性和容错性。RabbitMQ 是一个广泛使用的开源消息代理软件,它实现了 Advanced ...
3. Message Queue(MQ):例如RabbitMQ、Kafka等,服务之间通过消息队列异步通信,解耦了调用关系,提高系统吞吐量和响应速度,但可能会引入延迟。 4. Service Mesh:如Istio、Linkerd等,是一种更高级的服务间通信...
1. **服务请求方(Client)**:客户端创建一个消息,包含要调用的远程方法名和参数,然后发布到一个特定的交换机(Exchange),该交换机被配置为将消息路由到一个特定的队列(Queue)。 2. **服务提供方(Server)*...
在Java领域,Dubbo是一款广泛使用的RPC框架,它提供了高性能、透明化的远程服务调用能力。然而,有时候我们可能需要利用消息中间件来实现类似的RPC功能,比如使用RabbitMQ。本篇文章将深入探讨如何利用RabbitMQ实现...
Spring RabbitMQ RPC(远程过程调用)是一种使用RabbitMQ实现客户端与服务器间通信的方式,它允许客户端发送请求到服务器,然后服务器处理请求并返回结果。在这个场景中,RabbitMQ作为一个消息中间件,帮助解耦应用...
在分布式系统中,远程过程调用(RPC)是一种常见的通信方式,它允许一个服务直接调用另一个服务的方法,仿佛两个服务是在同一个进程中运行一样。在微服务架构中,Dubbo 是一个广泛使用的 RPC 框架。本篇我们将探讨...
本文将详细讲解如何在Spring项目中集成RabbitMQ,实现基于RPC(远程过程调用)的通信模式。 首先,我们需要在项目中引入Spring AMQP库,这是Spring对RabbitMQ的官方支持。可以通过在pom.xml文件中添加以下Maven依赖...
在IT行业中,消息传递(Message)是分布式系统和网络通信中的关键概念,它涉及软件组件之间的数据交换。视频“Video7.Demo1.Message”可能是一个演示,深入解释了消息传递的原理、技术和应用。让我们详细探讨一下这...
最后,Message Queue,如Handler、Looper和Message,通常用于同一应用内的线程间通信,但通过配合使用Remote Messenger服务,也可以实现简单的跨进程通信。 在提供的文档《Android底层结构-SDK_Service线程知多少....
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送...
早期,Remote Procedure Call(RPC)作为一种简化分布式系统通信的技术,允许程序调用远程服务器上的函数或方法,如同调用本地函数一样。然而,RPC存在一些固有问题,例如延迟问题、部分失败处理和并发控制等。Waldo...
传统的RPC(Remote Procedure Call)调用模式虽然能够满足一些简单的服务间通信需求,但在复杂的微服务架构中却显得力不从心。例如,当多个服务相互依赖且调用链路较长时,一旦某个服务出现延迟,可能会导致整个调用...
此时就需要考虑子模块间的远程通信,典型的通信模式分为以下两种,一种是同步的 RPC 远程调用;一种是基于中间件代理的异步通信方式。 同步 RPC 调用模型 同步 RPC 调用模型下,不同系统之间直接进行调用通信,每...
2. **消息队列**:消息队列(Message Queue)是一种常见通信机制,它允许模块异步发送和接收消息,提高系统的并发性和响应速度。消息队列可以缓存消息,确保即使在模块故障时也不会丢失数据。 3. **远程过程调用...
随着分布式系统的规模和复杂度不断增加,传统的远程过程调用(RPC)中间件技术如CORBA、DCOM、RMI等逐渐暴露出局限性。这些技术通常采用同步通信方式,这导致客户和服务对象之间的生命周期紧密耦合,进而限制了系统的...
它还包含了Message类,用于封装消息内容,以及MessageQueue和MessageQueueSelector等类,用于管理和选择消息队列。 2. `rocketmq-common-3.2.6.jar`: 这个库包含了一些通用的工具类和模块,是RocketMQ的基础组件...
- MQ提供消息传递和消息队列模型,允许系统在分布式环境中扩展进程间通信,无需关心远程过程调用(RPC)和网络通信细节。 - 消息中间件的主要特性包括有保证的消息发送,提高了系统的灵活性和扩展性。 2. **消息...
- 远程过程调用(RPC):远程过程调用允许执行过程调用的程序不必在同一个地址空间执行,通常用于网络服务。 - 套接字(Socket):套接字是实现网络通信的一种IPC机制,可以用于不同主机间的进程通信。套接字基于...