用于分布式事件限制的只读队列?

时间:2014-01-21 09:31:49

标签: queue rabbitmq cluster-computing beanstalkd throttling

我正在寻找一种在群集范围内限制各种流程的方法。这需要某种集中控制,可以应对任意数量的事件消费者。我的想法涉及一个只读队列,它以一定的速率生成令牌而没有积压(因此丢失的事件就被丢弃了)。例如,假设我有一些Web API需要每小时限制为10,000封邮件,但可以从群集中的任意数量的服务器调用。我将配置一个队列以每小时10k消息生成令牌,并且所有服务器都连接到该队列并在继续之前检索令牌。这将引入延迟元素(在第一次请求之后为3600/10000秒),但无论消费者数量多少,都将是平滑且可预测的。我不希望积压,因为我不希望在一段安静的时间后匆匆忙忙 - 目的不仅仅是限制每小时的事件总数,而是将它们均匀分布在它上面。

我的主要应用是PHP,它在linux上运行。目前我对beanstalkd非常满意正常排队,但它不支持这种操作模式。我过去曾经使用过RabbitMQ但相比之下发现它很重且很脆弱。如果这可以由队列管理器本身完成,那将是很好的,因为它在配置后不需要外部输入。

在缺乏对此类内容的特定支持的情况下,我可以尝试使用普通队列,并使用一个进程将令牌推入到它中,并且非常短的到期,尽管这看起来非常不优雅。有更好的想法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用以下方法之一:

  1. 使用主题交换与常规队列,但根据您的需要设置消息ttl。这种方法的专家是,你可以拥有小的积压,比如最近5秒,这可以让你的应用程序在短时间问题后恢复,比如在某些维护期间网络丢失。没有利弊。

  2. 您可以将消息发布到扇出交换并使用auto-delete标志声明队列,然后使用它们的消息。这种方式最大的问题是消息通过队列重复。实际上,如果您需要这样的行为,它可能是专业的,但您也可以使用具有相同绑定的其他队列轻松实现主题交换。