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
如何保證消息不丟失?
- 生產者弄丟了數據:發消息publish方法裏options裏的persistent設爲true