弹性处理来自RabbitMQ

时间:2019-05-06 19:16:33

标签: rabbitmq

我不确定在间歇性中断情况下如何弹性处理RabbitMQ消息。

我订阅了Windows服务,阅读了消息,然后将其存储在我的数据库中。如果由于数据而无法处理记录,我会将其发布到死信队列中,以供人员处理和重新处理。

我不确定如果遇到一些间歇性技术问题会自行解决(数据库重新启动,网络中断,驱动器空间等),该怎么办。我不希望有数百条关于死信的消息出现,这些消息只需要等待一个小故障就可以了,而现在却正在等待一个人。

当前,我重新排队该事件并重试一次,但是它重试的速度如此之快,通常无法解决问题。我曾想过重试,但是我不想让 real 问题陷入无限循环。

1 个答案:

答案 0 :(得分:0)

这是一个广泛的话题,但是从服务器端可以保留消息并使队列持久化,这意味着万一服务器重新启动,它们也不会丢失,请在此处How to persist messages during RabbitMQ broker restart?中查看更多信息

对于使用者(客户端),这取决于您如何从文档配置客户端:

  

在网络故障(或节点崩溃)的情况下,可以复制消息,并且消费者必须准备好处理它们。如果可能,处理此问题的最简单方法是确保您的使用者以幂等方式处理消息,而不是显式处理重复数据删除。

     

如果将一条消息传递给使用者,然后重新排队(例如,因为在断开消费者连接之前未对其进行确认),那么RabbitMQ将在再次传递该消息时(无论是发给同一使用者还是一个不同的)。这暗示着使用者可能之前已经看过此消息(尽管不能保证,但是该消息可能已经使它脱离了代理,但在连接断开之前并未进入使用者)。相反,如果未设置重新传递的标志,则可以确保该消息之前从未被看到过。因此,如果消费者发现对消息进行重复数据删除或以幂等方式进行处理更昂贵,则只能对设置了重新传递标志的消息进行此操作。

在此处查看更多信息:https://www.rabbitmq.com/reliability.html#consumer