【问题标题】:Dealing with duplicates in message queue处理消息队列中的重复项
【发布时间】:2019-06-08 21:40:32
【问题描述】:

假设我有像堆栈溢出这样的高负载 Q/A 论坛。 想象一下只有两个线程,First 和 Second。 每次有人发布答案/回复时,都会导致两次插入消息队列。 1. 插入帖子/回复的命令和 2. 给定线程的重建缓存命令。

假设,我在某个时间有这个队列的快照:

0: insert First.1 answer
1: rebuild First
2: insert First.2 answer
3: rebuild First
4: insert Second.1 answer
5: rebuild Second
6: insert First.3 answer
7: rebuild First

A./ 在步骤 #1 中处理队列时,是否有任何机制可以帮助实现,在 #3 和 #7 还存在“First”的重建,因此 #1 和 #3 可以被丢弃,只有 # 7个可以加工吗?

B./ 哪种消息队列产品(RabbitMq、Kafka、ActiveMQ ......)最适合这种用途?这里的关键属性是性能和可扩展性,因为应用程序应该处理 > 100 000 req./s.,大约 10% 的写入(相对于 90% 的缓存读取)。

感谢您的任何建议。 (不是作业,只是简化了过于复杂的问题,无法详细描述)

【问题讨论】:

    标签: message-queue debouncing


    【解决方案1】:

    我相信您在这里寻找的术语是“去抖动”。如果我是索引重建服务,我可能知道重建索引需要 5 秒。因此,在重建索引所需的时间范围内可能会有多条消息到达。去抖动例程将在一个时间常数上运行,接受许多消息,但在每个合理的时间单位产生一个重建请求。

    您必须为此编写自己的例程,或者可以利用Rx(反应式框架)的语义来执行此操作。

    Here is a resource 这可能涉及到您想要实现的目标,至少在概念上是这样。

    【讨论】:

    • 最后,我得到了某种“负载平衡”。简而言之,我有 3 个消费者,每个消费者都附加到它的“私人”队列。通过 Thread.id 以消费者数量为模,我可以确保特定线程始终以相同的三个队列之一结束,因此,这消除了两个消费者将在同一个线程上操作/重建缓存时间。它并不完美,但足够好一段时间了。好吧,我没有解决跳过不必要的重建的问题。不过谢谢你给我介绍了有趣的概念。
    猜你喜欢
    • 2015-12-16
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 2023-02-10
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    相关资源
    最近更新 更多