启用RabbitMQ磁盘或内存警报后,spring-cloud-stream-rabbit-binder如何工作?

时间:2019-02-14 11:12:48

标签: rabbitmq spring-cloud-stream spring-rabbitmq

版本:

Spring-cloud-stream-starter-rabbit-> 2.1.0.RELEASE

RabbitMQ-> 3.7.7

Erlang-> 21.1


(1)我已经在github上创建了一个示例mq-publisher-demomq-subscriber-demo存储库以供参考。

  

激活内存警报时

     
    

发布者:能够发布消息。

         

订户:看来,订户正在批量接收 消息,而延迟很少。

  
     

激活磁盘警报时

     
    

发布者:能够发布消息。

         

订户:似乎在激活“磁盘警报”时订户未收到消息。但是一旦停用警报,订阅者就会收到所有消息

  

消息是否被缓存在某处?

这是预期的行为吗? (因为我期望RabbitMQ将停止接收来自发布者的消息,并且一旦激活任何警报,订阅者将永远不会收到任何后续消息。)

(2) Spring Cloud Stream document如下所述。 这是否表示上述行为? (避免僵局并让发布者继续发布消息)

  

从2.0版开始,RabbitMessageChannelBinder将RabbitTemplate.userPublisherConnection属性设置为true,以便非事务生成器避免使用方出现死锁,如果由于代理上的内存警报而阻止了缓存的连接,则可能会发生死锁。

(3)我们是否也为Disk alarm做一些类似的事情以避免死锁?

(4)如果RabbitMQ不接受生产者的消息,则有可能从spring-cloud-stream中向发布者抛出特定的异常(例如,警报已激活且消息发布失败) )?

我对spring-cloud-stream中的这些警报还是很陌生,请帮助我清楚理解。谢谢。

2 个答案:

答案 0 :(得分:1)

  

消息是否被缓存在某处?

是的,设置资源警报后,消息将发布到网络缓冲区中。

  • 微小的消息需要一些时间来填满网络缓冲区,然后 阻止发布者。
  • 较少的网络缓冲区大小将阻止发布者 很快。

答案 1 :(得分:0)

最好在Rabbitmq-users Google网上论坛上询问有关RabbitMQ本身(以及Spring使用的Java客户端)的行为的问题;那就是RabbitMQ工程师的聚会地点。

  

(2)Spring Cloud Stream文档如下所述。这是否表示上述行为?

进行此更改是为了使生产者被禁止生产,消费者仍然可以消费。

  

(4)如果RabbitMQ不接受生产者的消息,那么是否有可能从spring-cloud-stream中向发布者抛出特定的异常(例如,警报已激活并且消息发布失败)?

默认情况下发布是异步的;您可以启用交易(这可能会大大降低性能;或者在生产者上启用错误,如果启用发布者确认并返回,则会在错误通道上收到异步消息。