RocketMq Producer最佳实践

RocketMq Producer最佳实践

翻译自RocketMQ官方文档

SendStatus

发送消息时,你会得到一个包含SendStatus的SendResult。首先,我们认为消息的isWaitStoreMsgOK属性为true(默认)。如果不是,我们总是会得到SEND_OK状态如果没有抛出异常。下面有每个状态的描述:

  • FLUSH_DISK_TIMEOUT 刷盘超时
    如果broker设置消息存储的配置是 FlushDiskType=SYNC_FLUSH(同步刷盘),并且Broker在同步刷盘的时候超时没有完成刷盘时得到这个状态。

  • FLUSH_SLAVE_TIMEOUT 同步到slave等待超时
    如果Broker设置为同步主从热备,并且slave Broker没有完成从MASTER同步消息时。

  • SLAVE_NOT_AVAILABLE 当前没有可用的Slave
    如果Broker配置了主从热备,但是没有slave,就回得到这个状态。

  • SEND_OK 发送成功
    SEND_OK 并不意味着一定可靠。要使得没有消息丢失,需要打开同步主从热备或者同步刷盘。

Duplication or Missing

如果你得到一个FLUSH_DISK_TIMEOUT,FLUSH_SLAVE_TIMEOUT的结果,并且同时Broker shutdown了,你会发现你的消息丢失了。这时,你有2个选择,一是让他继续,这可能造成这条消息的丢失。另一个是重新发送,这可能使得这条消息重复发送。通常我们建议重新发送并在consumer端做幂等去重。如果你觉得消息丢失不重要。但是注意SLAVE_NOT_AVAILABLE时重新发送没有用,如果这种情况发生,你应该保留现场并报警给Cluster Manager.

Timeout

客户端发送请求给Broker,等待回应,如果到了最大等待时间还是没有回应,客户端会抛出RemotingTimeoutException,默认等待时间为3秒,你可以使用send(msg, timeout)这个方法来定义超时时间替代send(msg)。不建议超时时间太短,因为Broker需要时间来刷盘或者同步给slave。同事这个值会对同步刷盘有一点影响,因为它如果超过刷盘超时时间可能会先得到一个FLUSH_SLAVE_TIMEOUT或者FLUSH_SLAVE_TIMEOUT在收到timeout之前。

Message Size

消息大小建议不超过512K

Async Sending

默认发送消息阻塞直到返回,如果你注重性能,建议使用send(msg, callback)这种异步的方式。

Producer Group

通常,Producer集群没有什么影响,但是如果你关心事务,你应该关注一下。

Thread Safety

Producer是线程安全的。

Performance

如果你想用不止一个Producer在一个JVM中处理大量数据,建议使用几个Producer异步发送,为每个Producer设置实例名。

猜你喜欢

转载自blog.csdn.net/doujinlong1/article/details/84136768