我正在寻找一种在集群范围内限制各种进程的方法。这需要某种可以处理任意数量的事件消费者的集中控制。我的想法涉及一个只读队列,它以一定的速度生成 token ,没有积压(因此错过的事件只是被丢弃)。例如,假设我有一些 Web API 需要限制为每小时 10,000 条消息,但可以从集群中任意数量的服务器调用。我将配置一个队列以每小时 10k 条消息的速度生成 token ,并且所有服务器都连接到该队列并在继续之前检索 token 。这将引入延迟元素(在第一个请求后为 3600/10000 秒),但无论消费者数量如何,它都是平滑且可预测的。我不想积压,因为我不想在安静的时期后匆忙 - 目的不仅仅是限制每小时的事件总数,而是将它们平均分布。
我的主要应用程序是 PHP,它在 Linux 上运行。目前我对 beanstalkd 的正常排队非常满意,但它不支持这种操作模式。我过去使用过 RabbitMQ,但相比之下发现它又重又脆弱。如果这可以由队列管理器本身完成,那就太好了,因为它在配置后不需要外部输入。
在没有对此类内容的具体支持的情况下,我可以尝试使用一个普通队列,其中一个进程将 token 以非常短的到期时间推送到其中,尽管这看起来很不雅观。有更好的想法吗?
最佳答案
您可以使用以下方法之一:
使用常规队列的主题交换,但设置消息
ttl
根据您的需要。这种方法的优点是你可以有小的积压,比如说,最后 5 秒,这允许你的应用程序在短时间问题后恢复,比如在某些维护期间网络丢失。没有缺点。您可以将消息发布到扇出交换器并使用
auto-delete
标志声明队列,然后使用来自它们的消息。这种方式最大的缺点是消息通过队列被复制。实际上,如果您需要这样的行为,它可能是专业的,但您也可以通过使用具有相同绑定(bind)的其他队列轻松进行主题交换来实现它。
关于queue - 用于分布式事件限制的只读队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21254108/