消息服務實踐

prefetch:

如果什麼都不配置,Rabbit會儘可能快速地發送隊列中的所有消息到client端。因爲consumer在本地緩存所有的message,
從而極有可能導致內存耗盡或不足,影響其它進程的正常運行。

prefetch允許爲每個consumer指定最大的unacked messages數目。簡單來說就是用來指定一個consumer一次可以從Rabbit中獲取多少條message並緩存在client中(RabbitMQ提供的各種語言的client library)。一旦緩衝區滿了,Rabbit將會停止投遞新的message到該consumer中直到它發出ack。

amqp0-9-1中的prefetch是針對每個隊列(channel的),而rabbitmq在v3.3.0之後,設置細化到了每個消費者的粒度。amqplib應用的是amqp0-9-1,但目前前端的消息隊列,一個channel只會對應一個consumer,所以這兩者並無什麼區別。

prefetch的值可以設爲比 消息來回的總時間/業務處理的時間 略大一點。

nack, reject,和啥都不做的區別

reject是對於單獨的消息做處理,告訴broker要麼去丟棄消息,要麼去重新把消息入隊列。nack不但提供了所有的reject做的事情,還提供了批處理的功能。客戶端在方法中把multiple Flag 置爲true後,broker將拒絕所有未確認的,已傳遞的消息,包括basic.nack方法的delivery_tag字段中指定的消息。

如果有deadletter exchange,則把nack的第三個參數置爲false,即不重新入隊列,可以進入到deadletter exchange中。

https://github.com/LeanKit-Labs/wascally/issues/84
http://xuyangyang.club/articles/2018/07/23/1532348839398.html
https://www.cnblogs.com/rjzheng/p/8994962.html

如何保證消息不丟失?

  1. 生產者弄丟了數據:發消息publish方法裏options裏的persistent設爲true
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章