我在不同的服务器上运行两个Services Producer和Consumer(都是spring-boot)。 我们的想法是从多个来源生成聚合数据并发布消息。然后,消费者会收听他们并进行一些处理。
我在这些服务之间使用RabbitMQ。问题是以动态突发(30秒突发+ 3-4秒空闲)以20K / s发送消息。消费者的工作速度约为10-15K / s。因此,在RabbitMQ中存在拥塞并且消息堆积如山。
由于对Consumer的某些限制,我无法对系统进行水平扩展。所以我想根据消费率动态降低发布速度。这是至关重要的,因为需要在不久的将来添加另一个生产者 。 我使用的是常见的Redis和MongoDB,可以使用它们来实现它。我听说过Back压力,但从来没有使用过它。这有帮助吗?请建议一种方法。谢谢。
PS:我已阅读this,其中的解决方案对我不起作用。
答案 0 :(得分:0)
我能想到的两件事
使用Circuit Breaking,您可以通知制作人停止发布。构建监控微服务,定期监控消费者队列大小。对于可以在rabbit mq队列中堆积的消息数量,有一个更高/更低的水印。一旦它达到更高的水印信号,生产者就会停下来并在较低的水位上做相反的事情。由于您使用的是Rabbit mq,因此请使用扇出交换来发布此断路事件。让所有制作人都在扇出交换中收听消息并做必要的事情。
发布商可以使用批处理,以便以固定的速率发布,而不是将所有数据转储到兔子中。根据您拥有的生产者数量,可以配置此批量大小。