Java 使用RabbitMQ进行RPC风格的通信:模板转换SendAndReceive与推送/订阅风格

Java 使用RabbitMQ进行RPC风格的通信:模板转换SendAndReceive与推送/订阅风格,java,spring,asynchronous,rabbitmq,amqp,Java,Spring,Asynchronous,Rabbitmq,Amqp,我正在使用RabbitMQ实现RPC风格的通信,其思想是创建异步管道体系结构。我正在使用JavaSpring和AMQP 我将执行RPC风格的通信链-与一个服务器的通信将触发另一个服务器,另一个服务器将触发另一个服务器,直到最终到达该链的末端,并且启动该链的服务器接收最终答案。我发现两种技术似乎适合我的需要: asyncRabbitTemplate的convertSendAndReceive(…):使用此方法推送,一旦消费者收到,触发另一个convertSendAndReceive(…),依此类推

我正在使用RabbitMQ实现RPC风格的通信,其思想是创建异步管道体系结构。我正在使用JavaSpring和AMQP

我将执行RPC风格的通信链-与一个服务器的通信将触发另一个服务器,另一个服务器将触发另一个服务器,直到最终到达该链的末端,并且启动该链的服务器接收最终答案。我发现两种技术似乎适合我的需要:

  • asyncRabbitTemplate
    convertSendAndReceive(…)
    :使用此方法推送,一旦消费者收到,触发另一个
    convertSendAndReceive(…)
    ,依此类推。。。链,直到最终结果在启动整个过程的服务器上结束

  • 使用推送/订阅模式,其中一个生产者将使用
    convertAndSend(…)
    进行推送,消费者将通过
    @RabbitListen
    进行监听,并推送到另一个正在监听的用户,依此类推;在此设置中,具有初始
    convertAndSend(…)
    调用的服务器将接收最终响应


  • 我不确定这些方法之间的区别是什么?什么时候去买一个或另一个?是否存在性能权衡?一个比另一个需要更多的编程工作吗?

    我认为这是一个概念上的问题。我手头没有序列图工具,但在RPC中

  • 我们有消费者C和提供者P
  • C向P发送消息以调用P提供的服务
  • P直接向C回复C的请求消息中要求的结果
  • 除此之外的任何内容都不是RPC。我用来描述这一点的其他术语是“请求/响应”和“客户机/服务器”。这是几乎所有web服务都使用的模式,因此它在应用程序体系结构中无处不在

    你在这里描述的实践被称为。这在概念上似乎很简单,但实际上你拥有的是一系列独立的动作,它们都是自己策划的。这就是现实世界的运作方式,而现实世界的一个关键特征是它是不确定性的。这意味着,给定相同的操作序列,结果输出不能保证相同


    大多数计算机程序依赖确定性行为,相同的输入总是产生完全相同的输出。

    这应该是对@theMayer答案的评论。但是,我想用一个图像详细说明RPC的细节@如果你愿意,玩家可以随意嵌入这个图片,然后我会删除这个答案

    RPC调用通常按以下方式运行:

    据我所知,您正在构建一系列事件,这些事件应该从一开始就结束。RPC模式用于相互了解的两方之间的直接调用


    因此,您完全可以选择主题,如果您可以定义每个站点之后数据的转换方式(即金属条->挤压金属条->弯曲金属条->勺子),这将使您能够独立扩展每个站点,甚至可以在不改变任何其他内容的情况下添加监控/响应任何阶段的服务,但是要小心扩展初始呼叫方-您可能需要解决

    我不确定这是否是一个可以回答的问题,但我只知道2美分-以这种方式链接消息的模式可能会导致糟糕的结果和失望。您需要能够管理整个工作流并重新启动失败的操作。请随意编辑我的答案。这个图表比我可能画的要复杂一些,但它仍然有效。