客户端最佳实践 复用MessageSessionFactory,最好作为全局单例来使用。
生产者最佳实践- 尽量复用MessageProducer,最好也是使用单例。可以单个MessageProducer发送多个topic,或者多个MessageProducer每个发送一种topic,尽量减少重复创建producer。
- 消息data的序列化方式锦衣不要使用特定语言的序列化方式(如java序列化),可以考虑 自定义协议、json、protocolbuffer、hessian等序列化协议,以便跨语言消费。
- 实现发送顺序所需要的PartitionSelector,推荐使用业务id。如:交易订单id来取模,分区列表选择固定分区发送。
- 单条消息大小最好限制在100k以下。
- 如无顺序等特殊需求,不要实现自己的PartitionSelector,默认的轮询策略足够。
消费者最佳实践- 尽量复用MessageConsumer,最好也是使用单例。可以单个MessageConsumer订阅多种topic,或者多个MessageConsumer每个订阅一种topic,尽量减少重复创建consumer。
- 单次拉取的数据不宜过大。如果对消息实时性要求较高的应用,应将单次拉取的数据缩小,但至少要大于单条消息的大小。如果对吞吐量要求较高,可以将该值设置大一些。
- 假设消费过程非常轻量级(如:只是打印log),可以不设置MessageListener线程池,减少资源耗费。
- 假设消息发送量巨大,消费能力不高,可适当提高拉取消息线程数 fetchRunnerCount和MessageListener的线程池大小。
- 尽量在消息的消费过程中,扑捉所有异常,减少消息在本地的堆积和恢复,前提是不要遗漏消息。如确实无法处理,请主动抛出异常,以便重试。