RocketMQ最佳实践之Producer

投递状态

发送消息时,将得到包含SendStatusSendResult。首先,我们假设消息的isWaitStoreMsgOK = true(默认是true)。如果不是,我们将总会得到SEND_OK,如果没有抛出异常。下面是关于每个状态的描述列表:

  • FLUSH_DISK_TIMEOUT

    如果 Broker 设置MessageStoreConfigFlushDiskType=SYNC_FLUSH(默认是ASYNC_FLUSH),并且代理没有在MessageStoreConfig的syncFlushTimeout(默认是5秒)时间内完成刷盘,您将获得这个状态。

  • FLUSH_SLAVE_TIMEOUT

    如果 Broker 的角色是 SYNC_MASTER (默认是ASYNC_MASTER),并且 Slave Broker 没有在MessageStoreConfig的syncFlushTimeout(默认是5秒)时间内完成同步,您将得到这个状态。

  • SLAVE_NOT_AVAILABLE

    如果代理的角色是SYNC_MASTER(默认是ASYNC_MASTER),但是没有配置 Slave Broker ,您将获得这个状态。

  • SEND_OK

    SEND_OK 并不意味着它是可靠的。为了确保没有信息会丢失,应启用 SYNC_MASTER 或 SYNC_FLUSH

重复或者丢失消息

如果您得到FLUSH_DISK_TIMEOUTFLUSH_SLAVE_TIMEOUT并且 Broker 恰好在此时意外宕机,您会发现你的消息丢失。此时,您有两个选择,一个是不管它,这可能导致这个消息丢失;另一个是重新发送消息,这可能会导致消息重复。我们经常建议重新发送,然后再消费时使用某个方法移除重复的消息。除非你觉得一些信息丢失并不重要。但是请记住,当您得到 SLAVE_NOT_AVAILABLE 状态时,重新发送是没有用的。如果出现这种情况,您应该保存场景并通知集群管理

超时

客户端发送请求到 Broker ,并等待响应,但如果最大等待时间过去了,没有返回响应,客户端就会抛出一个RemotingTimeoutException。默认的等待时间是3秒。您还可以使用 send(msg, timeout) 代替 send(msg) 来传递超时参数。注意,我们不建议等待时间过小,因为 Broker 需要一些时间来刷新磁盘或与 Slave 进行同步。而且,如果它超过 syncFlushTimeout,那么它的值可能不会有多大的影响,因为在超时之前,代理可能会以FLUSH_SLAVE_TIMEOUTFLUSH_SLAVE_TIMEOUT返回响应。

消息大小

我们建议的消息的大小应该不超过 512 K。

异步发送

默认 send(msg) 将阻塞直到返回的响应。所以如果你关心的是性能,我们建议你使用 send(msg, callback) ,这将会以异步方式发送。

生产者组

正常情况下,生产者组没有影响。但如果你开启了事物,你应该注意它。默认情况下,您只能在同一个JVM中只创建同一个生产者组,这通常是足够的。

线程安全

生产者是线程安全的,您可以在业务解决方案中使用它。

性能

如果您希望在一个JVM中有多个生产者进行大数据处理,我们建议:

  • 与一些生产者一起使用异步发送(3 ~ 5就足够了)
  • 为每个生产者setInstanceName

最新文章

  1. 2016/12/30_Python
  2. python下ssh的简单实现
  3. iOS - 使用自定义字体-苹方字体
  4. jq pagination分页 全选、单选的思考
  5. docker swarm
  6. Filestream读取或写入文件
  7. java 中的匿名内部类
  8. Qt 学习之路:QML 组件
  9. 利用代码改变世界 #AzureDev
  10. 天嵌E9平台下进行USB Wifi模块RT3070驱动的移植
  11. angularJS 系列(五)--controller AS 语法
  12. 《JAVA与模式》之简单工厂模式
  13. Oracle锁表处理操作笔记
  14. 比最差的API(ETW)更差的API(LTTng)是如何炼成的, 谈如何写一个好的接口
  15. 获取android项目的数据库地址或者数据库名
  16. cocos2dx 3.x(for 循环让精灵从中间往上下两边排列)
  17. python 爬虫基础知识一
  18. Spring 学习——Resources接口
  19. Struts2+JSON数据
  20. linux nginx,php开机启动

热门文章

  1. JAVA基础之——Thrift原理及应用
  2. mysql 中优化数据类型的三个原则
  3. 从BASE理论到CAP理论
  4. 关于修改bug的思考
  5. 【javascript】javasrcipt设计模式之策略模式
  6. Python爬虫教程-00-写在前面
  7. 微信小程序开发11-HTTPS网络通信(重点)
  8. OkHttp3源码详解(三) 拦截器-RetryAndFollowUpInterceptor
  9. ElasticSearch初体验之使用
  10. C#中的基础数据类型