Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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#_.net_Rabbitmq - Fatal编程技术网

C# RabbitMq确认/重新发布

C# RabbitMq确认/重新发布,c#,.net,rabbitmq,C#,.net,Rabbitmq,正在进行一个使用Rabbit的C#项目。我在文档中发现了一些冲突信息,这些信息是关于何时由于连接或通道关闭而重新传递消息的(是哪一个?) 此处的文档: 说明在通道关闭时重新请求它进行交付 可以使用具有以下特性的AMQP方法将消息返回到队列 重新查询参数(basic.recover、basic.reject和basic.nack),或 由于在保存未确认消息时通道关闭。任何 这些场景导致消息在消息的后面被重新查询 RabbitMQ版本早于2.7.0的队列。从RabbitMQ发布 2.7.0,消息始

正在进行一个使用Rabbit的C#项目。我在文档中发现了一些冲突信息,这些信息是关于何时由于连接或通道关闭而重新传递消息的(是哪一个?)

此处的文档:

说明在通道关闭时重新请求它进行交付

可以使用具有以下特性的AMQP方法将消息返回到队列 重新查询参数(basic.recover、basic.reject和basic.nack),或 由于在保存未确认消息时通道关闭。任何 这些场景导致消息在消息的后面被重新查询 RabbitMQ版本早于2.7.0的队列。从RabbitMQ发布 2.7.0,消息始终按发布顺序保存在队列中,即使存在重新排队或通道关闭

但在这里:

状态:仅当辅助连接断开时

如果消费者在未发送ack的情况下死亡,RabbitMQ将理解 消息未被完全处理,将重新传递给另一个 消费者。这样您就可以确保不会丢失任何消息,即使 工人们偶尔会死

没有任何消息超时;RabbitMQ将重新传递消息 仅当工作连接断开时。即使处理一个 这个信息需要很长很长的时间

那么,什么时候才能真正实现重新交付呢?当工人或通道死亡时?我可以在一个频道上消费,但在另一个频道上消费吗


目前,我创建了一个ChannelManager类,它打开N个通道,并根据需要将它们存储在ConcurrentQueue和Queues/Dequeues通道中,还确保我们永远不会低于“最小”可用通道数。使用这种方法,我无法确保消费和确认发生在同一频道上…

第二个引号的措辞不正确,尽管该工作页面周围的上下文仍然正确。。。你用粗体写的那句话将正确地改为:

当使用者死亡时,RabbitMQ将重新传递消息

这样说不会排除其他合法案例,但会说明他们在本文中提出的观点

如果希望邮件重新排队并重新传递,则必须确保
noAck
设置为false(这是默认设置)。一旦你知道了,你引用的第一段是正确的

关于您的
频道管理器
——不必要。频道是便宜、快捷的东西,可以根据需要架设和拆除。只有一个开放频道或1000个开放频道是可以的,只要您使用所有开放频道


另一方面,连接是昂贵的。为每个应用程序实例打开单个连接。然后在该连接中使用所需数量的频道。

第二个引号的措辞不正确,尽管该工作页面周围的上下文仍然正确。。。你用粗体写的那句话将正确地改为:

当使用者死亡时,RabbitMQ将重新传递消息

这样说不会排除其他合法案例,但会说明他们在本文中提出的观点

如果希望邮件重新排队并重新传递,则必须确保
noAck
设置为false(这是默认设置)。一旦你知道了,你引用的第一段是正确的

关于您的
频道管理器
——不必要。频道是便宜、快捷的东西,可以根据需要架设和拆除。只有一个开放频道或1000个开放频道是可以的,只要您使用所有开放频道

另一方面,连接是昂贵的。为每个应用程序实例打开单个连接。然后在该连接中使用您需要的任意多个通道。

首先,拥有一个我称之为“通道池”的应用程序会给您的应用程序增加有害的复杂性。通道绝对不能在线程之间共享。将通道视为端点标识符—它并不表示与代理的单独连接,而是代表与代理通过连接进行的独特讨论

其次,教程并不是真正的文档。这有助于理解代理如何工作,但我通常希望作为教程的一部分编写的内容特定于该教程中描述的场景。在这种情况下,文档解释了可能重新查询消息的情况

第三,重新订购和重新交付是分开的。重新交付只能在重新请求后发生,但不能保证。例如,消息可能在重新请求后过期,但在重新传递之前过期(可能是因为没有消费者可以接收消息,或者消息在队列中等待的时间太长)

最后,每个传递给消费者的消息都会被发布一个传递标签。该标签特定于频道和频道上的消费者。因此,不可能从另一个频道确认,因为另一个频道缺少传递标签的上下文感知。

首先,拥有我称之为“频道池”的频道会给应用程序增加有害的复杂性。通道绝对不能在线程之间共享。将通道视为端点标识符—它并不表示与代理的单独连接,而是代表与代理通过连接进行的独特讨论

其次,教程并不是真正的文档。这有助于理解代理如何工作,但我通常希望作为教程的一部分编写的内容特定于该教程中描述的场景。在这种情况下,文档解释了可能重新查询消息的情况

第三,重新订购和重新交付是分开的。重新交付只能在重新请求后发生,但我