我在可靠性模式中使用 AMQP,我的用例是将消息放入队列中,然后使用它们并将信息插入到 Web 服务中。我的网络服务很慢,我的队列可能有很多很多消息,我想确保消费者不会杀死我的数据库。
是否有内置的方式在 RabbitMQ 中执行节流,无论是基于时间的(每分钟/秒/小时只有 X 条消息)还是其他一些机制?
每个连接都有流量控制,因此如果服务器上有太多消息,发布者将等待。RabbitMQ 是一个非常可靠的系统,我可以说你不用担心它。
如果你在谈论如何限制消费,可能你必须自己照顾它。您还可以查看channel.flow(自RabbitMQ 3.3.0起已弃用)和basic.qos方法,或者您甚至可以暂时断开消费者并在您的服务能够承担负载时重新连接它们。
UPD
我可以建议您使用basic.consume使用消息并将其提供给您的 Web 服务。根据您 Web 服务处理有效负载的时间长短,您可能会猜测它正在加载并执行某种sleep(N)
. 当您的消费者正在睡觉时,它不会消耗任何东西,因此不会提供任何 Web 服务。
我想知道“每连接流控制”是否与channel.flow()相关。
基本上你可以打电话channel.flow(false);
通知经纪人停止发送消息。
调用channel.flow(true);
使流程再次激活。这是javadoc。