RocketMq Producer最佳实践
RocketMq Producer最佳實踐
翻譯自RocketMQ官方文檔
SendStatus
發(fā)送消息時,你會得到一個包含SendStatus的SendResult。首先,我們認為消息的isWaitStoreMsgOK屬性為true(默認)。如果不是,我們總是會得到SEND_OK狀態(tài)如果沒有拋出異常。下面有每個狀態(tài)的描述:
-
FLUSH_DISK_TIMEOUT 刷盤超時
如果broker設(shè)置消息存儲的配置是 FlushDiskType=SYNC_FLUSH(同步刷盤),并且Broker在同步刷盤的時候超時沒有完成刷盤時得到這個狀態(tài)。 -
FLUSH_SLAVE_TIMEOUT 同步到slave等待超時
如果Broker設(shè)置為同步主從熱備,并且slave Broker沒有完成從MASTER同步消息時。 -
SLAVE_NOT_AVAILABLE 當前沒有可用的Slave
如果Broker配置了主從熱備,但是沒有slave,就回得到這個狀態(tài)。 -
SEND_OK 發(fā)送成功
SEND_OK 并不意味著一定可靠。要使得沒有消息丟失,需要打開同步主從熱備或者同步刷盤。
Duplication or Missing
如果你得到一個FLUSH_DISK_TIMEOUT,FLUSH_SLAVE_TIMEOUT的結(jié)果,并且同時Broker shutdown了,你會發(fā)現(xiàn)你的消息丟失了。這時,你有2個選擇,一是讓他繼續(xù),這可能造成這條消息的丟失。另一個是重新發(fā)送,這可能使得這條消息重復(fù)發(fā)送。通常我們建議重新發(fā)送并在consumer端做冪等去重。如果你覺得消息丟失不重要。但是注意SLAVE_NOT_AVAILABLE時重新發(fā)送沒有用,如果這種情況發(fā)生,你應(yīng)該保留現(xiàn)場并報警給Cluster Manager.
Timeout
客戶端發(fā)送請求給Broker,等待回應(yīng),如果到了最大等待時間還是沒有回應(yīng),客戶端會拋出RemotingTimeoutException,默認等待時間為3秒,你可以使用send(msg, timeout)這個方法來定義超時時間替代send(msg)。不建議超時時間太短,因為Broker需要時間來刷盤或者同步給slave。同事這個值會對同步刷盤有一點影響,因為它如果超過刷盤超時時間可能會先得到一個FLUSH_SLAVE_TIMEOUT或者FLUSH_SLAVE_TIMEOUT在收到timeout之前。
Message Size
消息大小建議不超過512K
Async Sending
默認發(fā)送消息阻塞直到返回,如果你注重性能,建議使用send(msg, callback)這種異步的方式。
Producer Group
通常,Producer集群沒有什么影響,但是如果你關(guān)心事務(wù),你應(yīng)該關(guān)注一下。
Thread Safety
Producer是線程安全的。
Performance
如果你想用不止一個Producer在一個JVM中處理大量數(shù)據(jù),建議使用幾個Producer異步發(fā)送,為每個Producer設(shè)置實例名。
總結(jié)
以上是生活随笔為你收集整理的RocketMq Producer最佳实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RocketMQ Broker的最佳实践
- 下一篇: RocketMq Consumer 最佳