是否可以为 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 1
和callback queue 2
。
不过,这方面存在一些挑战。当您从回调队列接收到消息时,您不必再拥有原始请求的所有上下文 - 它不是 RPC,因此它不仅仅是一个回调函数。
来自我的managing long running workflow processes 帖子(其中涵盖了 javascript,但同样适用):
当您有一个通过消息传递促进的长时间运行的进程时,您可能不希望将进程对象一直保留在内存中。如果有成百上千个这样的实例在运行,那可能会占用大量内存。此外,您无法保证服务器不会在来回发送的消息之间关闭并重新启动。
在我关于 RabbitMQ 模式的电子邮件课程/电子书中,我谈到了确保响应消息由正确的对象处理的挑战。
最简单的方法是再次使用消息的关联 ID。通过发送带有原始命令的 ID,并将其与每个状态事件消息一起返回,您可以将消息应用于正确的作业。典型请求/响应场景中的相关 ID 可能是随机 GUID 或 UUID。但是,在作业状态事件的情况下,相关 ID 应该是作业的唯一 ID。这使得查找应用事件消息的作业并相应地更新作业变得轻而易举。
如果管理工作流的原始对象不再在内存中,当相关消息进入时,您将不得不重建该对象。这就是上面提到的相关 ID 发挥作用的地方。消息到达时应检查相关 ID,并且应将正确的工作流对象再次加载到内存中。完成后,消息可以被对象处理,状态可以被保存,然后工作流对象可以再次从内存中卸载。
要实现这一点,必须对代码进行重大调整,同时反转消息侦听器和工作流对象关系。
我还在我的RabbitMQ Patterns 电子邮件课程/电子书(并非特定于编程语言)中写了更多关于此的内容。
【讨论】:
以上是关于是否可以为 RabbitMQ RPC C# 配置多个/不同的回调队列?的主要内容,如果未能解决你的问题,请参考以下文章