gpt4 book ai didi

parallel-processing - 按顺序处理事件时如何实现可用性?

转载 作者:行者123 更新时间:2023-12-02 03:29:41 24 4
gpt4 key购买 nike

目标

我想实现事件的弹性处理,并且仍然按照事件到达的顺序处理它们。

描述

监听器任务监听许多客户端的事件,将它们包装在消息中并放入队列中。事件处理任务从队列中读取并处理事件。单个客户端的事件必须按顺序处理;不同客户端的事件可以乱序处理。一个简单的解决方案是:

创建N个队列,监听器在queue[client_id % N]中对事件进行排队。每个队列都有一个从中读取的事件处理程序。

这可行,但我还必须考虑事件处理程序失败的情况。我可以想到两种处理方法:

  1. 在队列的读者之间进行领导者选举——每个队列选举一次
  2. 使用 RabbitMQ 的确认功能(或其他 MQ 系统中的等效功能)- 每个队列都有多个事件处理程序。事件处理程序将消息从队列中取出,并在完成处理后发回确认。

问题规模

大约有 5K 个事件/秒,事件很小,只有 50-200 字节。队列中的消息可能是 1000 个事件的集群,以减少 MQ 开销。这意味着支持选项 2 并每秒处理数十条消息的 MQ 系统将起作用。

问题

我可以做选项 2 还是队列中会出现太多争用?它甚至支持使用确认吗?有没有更好的方法来实现这样的设计?我可以将事件集群发送到事件处理程序并等待 ACK,然后再发送下一个 block ,但我认为使用 MQ 可能不太需要重新发明轮子。

最佳答案

另一种方法是使用 partitioned topic在卡夫卡。 Kafka 可以通过标识符对主题进行分区,并保持分区内的顺序。所以在这种情况下,最好按 client_id 进行分区。然后,Kafka 通过重新划分主题来管理客户端之间的负载。

另见:How to achieve distributed processing and high availability simultaneously in Kafka?

关于parallel-processing - 按顺序处理事件时如何实现可用性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27815345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com