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

标签 queue rabbitmq cluster-computing beanstalkd throttling

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

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

在没有对此类内容的具体支持的情况下,我可以尝试使用一个普通队列,其中一个进程将 token 以非常短的到期时间推送到其中,尽管这看起来很不雅观。有更好的想法吗?

最佳答案

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

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

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

关于queue - 用于分布式事件限制的只读队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21254108/

相关文章:

linux - 奇怪的 RIAK 行为

cluster-computing - 打开 MPI/MPICH - 如果节点终止会发生什么?

java - 为什么在实现优先级队列时使用堆而不是二叉树?

mysql - 插入MySQL队列的中间

python - Django celery 在检查数据是否准备好时总是返回 false

redis - 如何从 Kubernetes 集群中的应用程序连接 Redis 集群?

带有 Amazon SQS 的 Laravel 队列

java - 将运算符从 double 转换回 char 后,如何使用它?

ssl - 确保 rabbitmq 集群节点通过 ssl 进行通信

rabbitmq - MassTransit 为 RabbitMQ 添加了什么?