SDK使用注意事項
本文介紹使用開源的客戶端SDK接入云消息隊列 RabbitMQ 版服務端時的注意事項。
使用客戶端時需要設置自動重連功能嗎?
設置com.rabbitmq.client.ConnectionFactory
接口時,必須開啟連接自動恢復功能,保證服務端升級時,客戶端斷開連接可自動重新連接,否則會導致消息讀寫中斷。
//設置為true,開啟Connection自動恢復功能;設置為false,關閉Connection自動恢復功能。
factory.setAutomaticRecoveryEnabled(true);
//設置自動恢復間隔時間,單位:毫秒。
factory.setNetworkRecoveryInterval(5000);
生產消息時需要注意什么?
在生產或消費過程中,請勿頻繁開啟或關閉連接。請盡可能使用長期存活的Connection,以免每次收發消息時都需要創建新的Connection,消耗大量的網絡資源和服務端資源,甚至引起服務端SYN Flood防護。更多信息,請參見Connection。
生產消息前根據實際情況選擇是否打開發送確認接口。開啟發送確認,服務端收到消息后,會調用本地方法確認消息收到。
mandatory
設置為true時,如果消息因為路由原因,未到達Queue,客戶端添加的ReturnListener
接口將會被調用。發送消息時,強烈建議自定義msgId,即消息的唯一標識。可用于消息查詢、軌跡查詢、以及故障排查時后臺信息定位。
消息發送時,需要根據
basicPublish
接口返回的錯誤類型決定是否拋出異常。如果是業務自身問題,例如
ExchangeNotExist
(Exchange不存在)則需要拋出異常。如果是發送消息被限流,建議關閉舊的連接,重新創建并初始化Channel,這樣可以保證業務的連續性。
消費消息時需要注意什么?
消費數據時,需要防止消費傾斜。具體做法,請參見Connection和Channel的使用建議。
消費數據時,使用
basic.basicQos
設置服務端允許緩存未ack消息的數量,當到達設置值時,服務端將不再推送消息到客戶端。當客戶端提交ack后,服務端將再次推送等同ack數量的消息,保持服務端緩存最大未ack消息數量小于等于QoS設置值。QoS可以設置在Channel上,也可以設置在單個Consumer上。channel.basicQos(100, true)
表示同一Channel上創建的所有Consumer共享100的額度限制。channel.basicQos(100, false)
或者channel.basicQos(100)
表示不同Consumer之間額度不共享,不同Consumer額度都是100。如果客戶端不設置,默認使用服務端配置,服務端默認針對每個消費者限制100,也即等同于客戶端channel.basicQos(100, false)
。自定義設置值不能超過100,否則設置不生效,仍然使用默認值。如果消費能力較弱,建議將QoS值降低。如果服務端堆積消息量達到設置的QoS,則不會再推送消息給客戶端。這種情況下客戶端看到的現象是服務端間歇性推送消息,并且重啟消費者后消息恢復,建議通過增強消費者的消費能力解決。如果使用autoACK消費模式,basicQos
將不生效。消費者提交的ack如果不在指定時間內,則觸發消費重試。消息將會被重新投遞,最多重試16次。若重試16次還未成功,則消息將被丟棄或發送至死信Exchange。消費超時時間如下:
實例重試策略參數說明
實例類型
Serverless系列實例
預付費系列實例
預留+彈性 /按累積量
專業版
企業版
鉑金版
消費超時時間
15分鐘
默認值:5分鐘
10分鐘
默認值:1分鐘
15分鐘
默認值:5分鐘
60分鐘
默認值:30分鐘
最大投遞次數
16
默認值:16
16
默認值:16
16
默認值:16
64
默認值:16
basicGet
拉取消息效率較低,能達到的上限TPS沒有basicConsume
高。生產環境大規模消費消息推薦使用basicConsume
,而不是basicGet
。queueDeclare
和exchangeDeclare
等元數據接口有限流設置,建議在控制臺上創建,不建議在發送數據時調用,否則可能觸發限流導致連接關閉。更多信息,請參見使用限制。