發送狀态
當你發送一個消息,你将會獲得包含SendStatus的SendResult。首先,我們假設消息 isWaitStoreMsgOK=true(預設true)。如果沒有,我們會得到 SEND_OK,沒有異常抛出的話。
下面是每個狀态的描述清單:
FLUSH_DISK_TIMEOUT
如果broker設定 MessageStoreConfig’s 的 FlushDiskType=SYNC_FLUSH(預設ASYNC_FLUSH),在MessageStoreConfig’s 的syncFlushTimeoutbroker(預設5秒)内沒有完成刷盤,你會獲得此狀态。
FLUSH_SLAVE_TIMEOUT
如果broker的角色是SYNC_MASTER(預設ASYNC_MASTER),在MessageStoreConfig’s 的syncFlushTimeoutbroker(預設5秒)内從Broker沒有完成與主同步,你會獲得此狀态。
SLAVE_NOT_AVAILABLE
如果broker的角色是SYNC_MASTER(預設ASYNC_MASTER),但是配置的從Broker不存在,你會獲得此狀态。
SEND_OK
SEND_OK也不意味着可靠。為了確定沒有消息丢失,還應該啟用 SYNC_MASTER或SYNC_FLUSH。
Duplication or Missing
如果得到FLUSH_DISK_TIMEOUT、FLUSH_SLAVE_TIMEOUT 和Broker正好關閉,你可以發現消息丢失。此時,你有兩種選擇,一個是放手可能引起消息丢失;另一個是重發消息,可能會使消息重複。通常我們建議重發和尋找一種方式處理消費時的重複删除。除非你感覺丢失的消息不重要。但請記住,當SLAVE_NOT_AVAILABLE時,重發時無用的。
如果發生,你應該保留場景同時警告叢集管理者。
逾時
用戶端發送請求到broker,然後等待響應,但如果等待時間過久且沒有響應傳回,用戶端将會抛出RemotingTimeoutException異常。預設等待時間3秒。你可以使用send(msg, timeout) 代替 send(msg)傳遞逾時參數。
我們不建議等待時間太短,因為broker需要時間刷盤或與從同步。
如果該值超過syncFlushTimeout,則該值可能影響不大,因為Broker可能會在逾時之前傳回FLUSH_SLAVE_TIMEOUT或FLUSH_SLAVE_TIMEOUT的響應。
消息大小
建議消息的大小不能超過512k。
異步發送
預設send(msg) 将會阻塞,直到響應傳回。是以如果你關系性能,我們建議使用 send(msg, callback)以異步方式執行。
生産者群組
通常,生産者群組沒有任何效果。但是如果你涉及事務,你應該注意。預設情況下,你隻需要在同一個JVM上建立一個具有相同群組的生産者,就足夠啦。
線程安全
生産者是線程安全的,你可以在業務解決方案中使用。
性能
如果在一個JVM上你需要多個producer用于大資料處理,我們建議:
- 這些(3~5夠用)生産者使用異步發送
- 每個生産者設定執行個體名稱