Skip to content
Roy edited this page Nov 7, 2017 · 2 revisions

Meta使用的最佳实践

生产者最佳实践

  • 尽量复用MessageProducer,可以单个MessageProducer发送多种topic,或者多个MessageProducer每个发送一种topic,前提是不要重复创建。
  • 消息data的序列化方式建议不要使用特定于语言的序列化方式(如java序列化),可考虑自定义协议、json、protobufs、hessian都序列化协议,以便跨语言消费。
  • 实现发送顺序所需要的ParitionSelector,我们会推荐使用业务id,如交易订单id来取模分区列表选择固定分区发送。
  • 单条消息大小最好限制在百k以下。
  • 如无顺序等特殊要求,不要实现自己的PartitionSelector,默认的轮询策略足够。

消费者的最佳实践

  • 尽量复用MessageConsumer,可以单个MessageConsumer订阅多种topic,或者多个MessageConsumer每个订阅一种topic,前提是不要重复创建。
  • 单次拉取的数据不宜过大,对消息实时性要求较高的应用,应将单次拉取的数据缩小,但至少大于单条消息的大小。如对吞吐量要求较高,可将该值设大。
  • 如消费过程非常轻量级(比如只是打印),可不设置MessageListener线程池,减少资源耗费。
  • 如消息发送量巨大,消费能力不高,可适当提高拉取消息线程数fetchRunnerCount和MessageListener的线程池大小。
  • 尽量在消息消费过程中捕捉所有异常,减少消息在本地的堆积和恢复,前提是不要遗漏消息。如确实无法处理,请主动抛出运行时异常以便重试。