可靠的Webhook调度系统

Art*_*hur 6 webhooks rabbitmq event-dispatching apache-kafka

我很难为 Webhook 调度系统找出可靠且可扩展的解决方案。

当前系统使用RabbitMQwebhook 队列(我们称之为events),该队列被消耗和调度。该系统运行了一段时间,但现在出现了一些问题:

  • 如果系统用户产生过多的事件,会占用队列,导致其他用户长时间收不到webhook
  • 如果我将所有事件分成多个队列(通过 URL 哈希),则可以减少第一个问题的可能性,但当非常繁忙的用户访问同一队列时,它仍然会时不时地发生
  • 如果我尝试将每个 URL 放入其自己的队列中,面临的挑战是动态创建/分配消费者到这些队列。就RabbitMQ文档而言,该 API 在过滤非空队列或未分配消费者的队列方面非常有限。
  • Kafka我了解,在阅读有关它的所有内容后,情况在单个分区的范围内是相同的。

那么,问题是 - 有没有更好的方法/系统来实现此目的?也许我缺少一个非常简单的解决方案,可以让一个用户不干扰另一个用户?

提前致谢!

Art*_*hur 0

所以,我不确定这是否是解决这个问题的正确方法,但这就是我想到的。

先决条件:具有重复数据删除插件的 RabbitMQ

所以我的解决方案包括:

  • g:events队列 - 我们称之为队列parentchild该队列将包含所有需要处理的队列的名称。也许它可以用其他一些机制(比如 Redis 排序集或其他机制)替换,但是你必须自己实现 ack 逻辑。
  • g:events:<url>- 有child队列。每个队列仅包含需要发送到该队列的事件url

将 Webhook 负载发布到 RabbitMQ 时,您将实际数据发布到child队列,然后另外将队列名称发布childparent队列。重复数据删除插件不允许同一child队列被发布两次,这意味着只有一个消费者可以接收该child队列进行处理。

你们所有的消费者都在消费parent队列,收到消息后就开始消费child消息中指定的队列。child队列清空后,您确认该parent消息并继续。

此方法可以非常精细地控制child允许处理哪些队列。如果某个child队列花费了太多时间,则只需发送ack消息parent并将相同的数据重新发布到队列末尾parent

我知道这可能不是最有效的方法(不断发布到队列也会产生一些开销parent),但事实就是如此。