如何提高队列的消息处理效率
关键词: 消息队列 处理效率 消费确认 消息幂等传递 批量消费消息 Kafka RabbitMQ
声明:本文并非原创,转自华为云帮助中心的分布式消息服务(DMS)的用户指南。客户端连接方法通用,故摘抄过来分享给大家。
消息发送和消费的可靠性必须由DMS服务和生产者以及消费者协同工作才能保证。同时开发者需要尽量合理使用DMS消息队列,以提高消息发送和消息消费的效率与准确性。
对使用DMS服务的生产者和消费者有如下的使用建议:
重视消息生产与消费的确认过程
消息生产(发送)
发送消息后,生产者需要根据DMS的返回信息确认消息是否发送成功,如果返回失败需要重新发送。
每次生产消息,生产者都需要等待消息发送API的应答信号,以确认消息是否成功发送。在消息传递过程中,如果发生异常,生产者没有接收到发送成功的信号,生产者自己决策是否需要重复发送消息。如果接收到发送成功的信号,则表明该消息已经被DMS可靠存储。
消息消费
消息消费时,消费者需要确认消息是否已被成功消费。
生产的消息被依次存储在DMS的存储介质中。消费时依次获取DMS中存储的消息。消费者获取消息后,进行消费并记录消费成功或失败的状态,并将消费状态提交到DMS,由DMS决定消费下一批消息或回滚重新消费消息。
在消费过程中,如果出现异常,没有提交消费确认,该批消息会在后续的消费请求中再次被获取。
消息生产与消费的幂等传递
DMS设计了一系列可靠性保障措施,确保消息不丢失。例如使用消息同步存储机制防止系统与服务器层面的异常重启或者掉电,使用消息确认(ACK)机制解决消息传输过程中遇到的异常。
考虑到网络异常等极端情况,用户除了做好消息生产与消费的确认,还需要配合DMS完成消息发送与消费的重复传输设计。
- 当无法确认消息是否已发送成功,生产者需要将消息重复发送给DMS。
- 当重复收到已处理过的消息,消费者需要告诉DMS消费成功且保证不重复处理。
消息可以批量生产和消费
为提高消息发送和消息消费效率,推荐使用批量消息发送和消费。通常,默认消息消费为批量消费,而消息发送尽可能采用批量发送。同时批量方式可有效减少API调用次数,减少服务使用费用。
如下面两张示意图对比所示,消息批量生产与消费,可以减少API调用次数,节约资源。
![点击放大](https://support.huaweicloud.com/bestpractice-dms/zh-cn_image_0096040812.png)
![](https://support.huaweicloud.com/bestpractice-dms/public_sys-resources/icon-notice.gif)
批量发送消息时,单次不能超过10条消息,总大小不能超过512KB。
批量生产(发送)消息可以灵活使用,在消息并发多的时候,批量发送,并发少时,单条发送。这样能够在减少调用次数的同时保证消息发送的实时性。
![点击放大](https://support.huaweicloud.com/bestpractice-dms/zh-cn_image_0096040859.png)
此外,批量消费消息时,消费者应按照接收的顺序对消息进行处理、确认,当对某一条消息处理失败时,不再需要继续处理本批消息中的后续消息,直接对已正确处理的消息进行确认即可。
巧用消费组协助运维
用户使用DMS服务作为消息管理系统,查看队列的消息内容对于定位问题与调试服务是至关重要的。
当消息的生产和消费过程中遇到疑难问题时,通过创建不同消费组可以帮助定位分析问题或调试服务对接。用户可以创建一个新的消费组,对队列中的消息进行消费并分析消费过程,这样不会影响其他服务对消息的处理。