我很难为webhook调度系统找到一个可靠的、可伸缩的解决方案。
当前系统使用RabbitMQ,并为webhooks提供队列(让我们称其为events),这些let钩子被消耗和分派。这个系统运行了一段时间,但现在有几个问题:
RabbitMQ文档而言,API在过滤非空队列或没有分配使用者的队列方面非常有限。Kafka而言,我从阅读有关它的所有内容中了解到,在单个分区的范围内,情况是一样的。因此,问题是-是否有更好的办法/制度来实现这一目的?也许我错过了一个非常简单的解决方案,可以让一个用户不干扰另一个用户?
提前感谢!
发布于 2021-10-14 14:44:53
所以,我不知道这是否解决这个问题的正确方法,但这是我想出来的。
先决条件:带有去重叠插件的RabbitMQ
所以我的解决方案包括:
g:events队列-让我们称它为parent队列。此队列将包含需要处理的所有child队列的名称。可能可以用其他机制(比如Redis排序集或其他机制)来代替它,但是您必须自己实现ack逻辑。g:events:<url> --这里有child队列。每个队列只包含需要发送到该url的事件。当向RabbitMQ发布webhook有效负载时,您可以将实际数据发布到child队列,然后将child队列的名称附加到parent队列中。重复插件将不允许同一个child队列发布两次,这意味着只有一个用户可以接收到该child队列进行处理。
所有的消费者都在使用parent队列,在收到消息之后,他们就开始使用消息中指定的child队列。在child队列为空后,您将确认parent消息并继续前进。
此方法允许非常精细地控制允许处理哪些child队列。如果某些child队列花费太多时间,只需将parent消息重新发布到parent队列的末尾即可。
我知道这可能不是最有效的方法(经常向parent队列投递也有一些开销),但事实就是如此。
发布于 2021-08-26 10:12:08
您可以尝试几个rabbitmq特性来缓解您的问题(而不完全删除它):
您可能有几个事件的“周期”,不同的配置(即每个周期的周期数和TTL值)。您的第一个循环尽可能地处理新事件,在随机交换下通过几个队列减少尖峰。如果它不能足够快地处理事件,则事件将被移动到另一个具有专用队列和使用者的循环中。
这样,您可以确保新事件有更好的更改需要快速处理,因为它们总是在第一个周期中发布(而不是在另一个用户的一堆旧事件后面)。
发布于 2021-08-31 13:31:28
如果您需要订单,不幸的是,您依赖于用户的输入。
但是在卡夫卡的世界里,有几件事要提出来;
exactly-once实现Transactions交付,这允许您构建类似于常规AMQPs的类似系统。分区在您的场景中是最重要的。您可以增加分区以同时处理更多消息。你的消费者可以和你的分区在同一个消费者中一样多。即使您在达到分区计数后进行缩放,您的新使用者也将无法阅读,并且他们将保持未分配。
与常规的AMQP服务不同,Kafka在阅读后不会删除消息,只会为消费者注册标识标记偏移。这允许你同时做一些事情。就像在单独的进程中计算实时用户计数一样。
https://stackoverflow.com/questions/68874153
复制相似问题