天天看點

RocketMQ概念詳細之Producer

發送狀态

當你發送一個消息,你将會獲得包含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夠用)生産者使用異步發送
  • 每個生産者設定執行個體名稱