【问题标题】:How to handle a single publisher clogging up my RabbitMQ's queue如何处理阻塞我的 RabbitMQ 队列的单个发布者
【发布时间】:2015-09-16 01:31:17
【问题描述】:

在我的上一个项目中,我将 MassTransit (2.10.1) 与 RabbitMQ 一起使用。 在某些情况下,生产者可以向队列发送大量消息。

例如 - 用户设置了对其联系人列表的批量通知 - 在某些情况下,该列表可能多达 100000 个联系人。这将为每个联系人发送一条消息到队列(我需要跟踪每条消息)。现在因为 - 据我了解 - 消息正在按入口顺序处理,该用户正在阻塞队列很长时间,而另一个用户可能已经做了一件简单的事情,例如向自己发送测试消息,等待处理结束。

我考虑过为常规的 VS 批量操作分离队列,但这仍然不能解决小批量(有几十个联系人的用户等待有几十万个用户的用户)的问题,并且会导致额外的维护。

对我来说理想的解决方案 - 我认为 - 将涉及以这样一种方式操纵路由,即消费者将处理来自同一用户的 x 条消息,移动来自下一个用户的 X 条消息,而不是再次移动,而不是返回到队列的开头,直到处理完所有消息。

这可能吗?有没有更好的解决方案?

提前致谢。

【问题讨论】:

    标签: rabbitmq masstransit


    【解决方案1】:

    您必须自己编写代码来管理它。 RabbitMQ 实际上并没有任何内置机制来处理这样的场景,而无需您的代码参与。

    如果您想一次从批量处理几个,然后恢复正常,然后再返回批量,您将需要 2 个队列和代码来管理从哪个队列中提取,何时提取。

    【讨论】:

    • 谢谢。在这种情况下为每个用户生成一个队列是否有意义?
    • 至此,saga 可以轻松地处理逻辑来决定您是使用消费者来处理小请求,还是使用批量消费者。 2 个消费者意味着 2 个单独的队列。
    【解决方案2】:

    只是我的意见,据我所知,没有内置的方法...您是否考虑过使用您用来存储通知的任何存储空间,然后只需发布一条消息,带有通知列表,存储它在您的数据库中,然后为用户消费者检索通知。响应将是一条消息,它可能有一个巨大的有效负载,但即使它陷入困境,也可以在消息中添加一个 skip 和 take 属性,并强制它在 0 到 50 之间(或其他任何值)。在什么情况下,您希望一次向用户显示 100,000 条通知?

    【讨论】:

    • 我已经考虑过了,但我不喜欢这个选项,因为它绕过我的排队机制只是为了放入另一个队列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多