【发布时间】:2015-01-20 09:37:23
【问题描述】:
我们目前正在使用 RabbitMQ,其中一个持续超快的生产者与一个受限于有限资源(例如缓慢的 MySQL 插入)的消费者配对。
我们不喜欢使用x-max-length 声明队列,因为一旦达到限制,所有消息都将被丢弃或死信,而且我们不想丢失消息。
添加更多消费者很容易,但它们都会受到一个共享资源的限制,因此这是行不通的。问题依然存在:如何减慢生产者的速度?
当然,我们可以在 Redis、memcached、MySQL 或生产者读取为 pointed out in an answer to a similar question 的其他东西中放置一个流控制标志,或者更好的是,生产者可以定期测试队列长度并限制自身,但这些看起来像黑客攻击我。
我主要是在质疑我是否存在根本性的误解。我原以为这是一种常见的情况,所以我想知道:
限制生产者的最佳做法是什么? RabbitMQ 如何做到这一点?还是您以完全不同的方式做到这一点?
背景
假设制作人实际上知道如何通过正确的输入减慢自己的速度。例如。硬件传感器或硬件随机数生成器,可以根据需要生成任意数量的事件。
在我们特定的真实案例中,我们有一个 API,用户可以使用它来添加消息。我们不想吞噬和丢弃消息,而是希望通过让我们的 API 在队列“已满”时返回错误来施加背压,以便调用者/用户知道退避,或者让 API 阻塞直到消费者赶上。我们不控制用户,所以不管消费者有多快,我都可以创建一个更快的生产者。
我希望有类似 TCP 套接字的 API,write() 可以阻塞,select() 可以用来确定句柄是否可写。因此,要么让 RabbitMQ API 阻塞,要么让它在队列已满时返回错误。
【问题讨论】:
-
只是出于好奇,您有没有解决过这个问题?我们想实现一个类似的功能,如果消费者过载,我们希望生产者采取一些行动。
-
不,对不起。目前还没有解决办法。
-
谢谢彼得!如果我们找到任何解决方案,我会通知您。
标签: rabbitmq throttling