是否可以为 RabbitMQ RPC C# 配置多个/不同的回调队列?

Posted

技术标签:

【中文标题】是否可以为 RabbitMQ RPC C# 配置多个/不同的回调队列?【英文标题】:Is it possible to configure multiple/different CallBack queue for RabbitMQ RPC C#? 【发布时间】:2015-08-21 06:12:24 【问题描述】:

我想要这样的东西......

    客户提出的请求。 Throught Exchange 转到 rpc_queue 来自 rpc_queue 的服务器读取请求 服务器回复不同的回调队列。不同的方法 对于 X 类型的响应,它应该转到“回调队列 1”,对于 Y 类型的响应,它应该转到“回调队列 2”

我可以到第 3 步。但不知道如何配置多个回调队列。甚至可能吗?如果是,如何?请帮我解决一下这个。 提前致谢。

【问题讨论】:

【参考方案1】:

RabbitMQ 的 RPC 功能对消息的“回复”设置起作用,该设置必须由消息生产者预先设置。如果您尝试使用 RPC 功能,它将无法正常工作。根据服务器所说的正确,您将无法从不同的队列中获取不同的消息。

要完成这项工作,您需要在应用中构建双向消息传递,而不是使用 RPC 语义和 API。这意味着,您需要将您的消息生产者(发出原始请求的那个)也设置为消息消费者。

客户端将通过rpc_queue 发出请求,然后它还将作为消息消费者侦听callback queue 1callback queue 2

不过,这方面存在一些挑战。当您从回调队列接收到消息时,您不必再拥有原始请求的所有上下文 - 它不是 RPC,因此它不仅仅是一个回调函数。

来自我的managing long running workflow processes 帖子(其中涵盖了 javascript,但同样适用):

当您有一个通过消息传递促进的长时间运行的进程时,您可能不希望将进程对象一直保留在内存中。如果有成百上千个这样的实例在运行,那可能会占用大量内存。此外,您无法保证服务器不会在来回发送的消息之间关闭并重新启动。

在我关于 RabbitMQ 模式的电子邮件课程/电子书中,我谈到了确保响应消息由正确的对象处理的挑战。

最简单的方法是再次使用消息的关联 ID。通过发送带有原始命令的 ID,并将其与每个状态事件消息一起返回,您可以将消息应用于正确的作业。典型请求/响应场景中的相关 ID 可能是随机 GUID 或 UUID。但是,在作业状态事件的情况下,相关 ID 应该是作业的唯一 ID。这使得查找应用事件消息的作业并相应地更新作业变得轻而易举。

如果管理工作流的原始对象不再在内存中,当相关消息进入时,您将不得不重建该对象。这就是上面提到的相关 ID 发挥作用的地方。消息到达时应检查相关 ID,并且应将正确的工作流对象再次加载到内存中。完成后,消息可以被对象处理,状态可以被保存,然后工作流对象可以再次从内存中卸载。

要实现这一点,必须对代码进行重大调整,同时反转消息侦听器和工作流对象关系。

我还在我的RabbitMQ Patterns 电子邮件课程/电子书(并非特定于编程语言)中写了更多关于此的内容。

【讨论】:

以上是关于是否可以为 RabbitMQ RPC C# 配置多个/不同的回调队列?的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ RPC 多发送者一接收者

RabbitMQ基础整理

rabbitmq简单介绍

RabbitMQ九:远程过程调用RPC

RabbitMQ基础概念详细介绍

如何为 RabbitMQ RPC 请求设置超时?