Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# RabbitMQ中具有工作队列的请求-响应模式_C#_Rabbitmq - Fatal编程技术网

C# RabbitMQ中具有工作队列的请求-响应模式

C# RabbitMQ中具有工作队列的请求-响应模式,c#,rabbitmq,C#,Rabbitmq,我将RabbitMQ用于以下场景。当用户使用高级搜索功能时,我会通过RabbitMQ向少数服务器实例之一发送消息。它们运行相同的例程(数据库查询和计费)。我想确保我不会多次处理同一条消息。 我遇到过这样的情况,但其中显示的交换类型是“Topic”,这对我不适用,因为我多次处理同一条消息。 如何使用RabbitMQ中的工作队列实现请求-响应模式,以便每个消息只处理一次,并且实现负载平衡?Anton Gogolev上面的评论是正确的。由于许多原因,您不能保证消息只被处理一次。但是,这通常是系统的一个

我将RabbitMQ用于以下场景。当用户使用高级搜索功能时,我会通过RabbitMQ向少数服务器实例之一发送消息。它们运行相同的例程(数据库查询和计费)。我想确保我不会多次处理同一条消息。 我遇到过这样的情况,但其中显示的交换类型是“Topic”,这对我不适用,因为我多次处理同一条消息。

如何使用RabbitMQ中的工作队列实现请求-响应模式,以便每个消息只处理一次,并且实现负载平衡?

Anton Gogolev上面的评论是正确的。由于许多原因,您不能保证消息只被处理一次。但是,这通常是系统的一个要求——只产生一次期望的结果

实现这一点的方法是通过这样一种想法:不管给定消息被处理多少次,它只会进行一次所需的更改

有很多方法可以做到这一点。一个简单的例子是使用一个共享数据库来跟踪已处理的消息。当您收到一条消息时,您会检查它是否已经被处理过。如果没有,你就处理它。如果有,你就忽略它,继续前进

在您的情况下,如果您正在执行请求/响应并希望负载平衡,那么您可能希望在同一队列上有多个使用者。您可以有2个、10个或300个请求处理程序实例侦听同一队列,这样您就不会太担心重复处理了

RabbitMQ将向单个使用者发送给定消息。它将等待该消费者说它已完成处理,或者如果消费者崩溃或拒绝该消息,它将重新查询该消息,以便另一消费者重试

这样,每个请求通常只有一个请求处理程序。但是,总是有可能有多个人处理同一条消息,这就是为什么幂等性很重要


关于主题交换的使用与任何其他类型的交换,这没有多大区别。始终可能有多个队列接收您发送的消息,因为您可以使用相同的绑定密钥将多个队列绑定到同一个exchange

您无法使用RabbitMQ(或任何其他分发的内容)获得“一次完全交付”。这简直[不可能][1]。[1] :这里的实际问题是什么?您概述了一系列潜在问题,但没有提出任何问题。请编辑这篇文章来问一个特定的问题。那么,有可能将RPC与许多工作模式类似的“服务器”一起使用吗?在上面的链接中,他们写道“如果RPC服务器太慢,您可以通过运行另一个服务器来扩展。尝试在新控制台中运行第二个RPC_server.py。”那么RPC是一种仅带有响应的Woker模式吗?