大数据开发:消息队列如何处理消息积压

2021-07-09 10:34:34 浏览数 (1)

实时消息流处理,是当前大数据计算领域面临的常见场景需求之一,而消息队列对实时消息流的处理,常常会遇到的问题之一,就是消息积压。今天的大数据开发学习分享,我们就来聊聊,消息队列如何处理消息积压?

一般来说,消息积压的直接原因一定是系统中的某个部分出现了性能问题,来不及处理上游发送的消息,才会导致消息积压。

1、优化性能来避免消息积压

①发送端性能优化

对于发送消息的业务逻辑,只需要设置合适的并发和批量大小,就可以达到很多的发送性能。

Producer发送消息的过程包括:Producer发送消息给Broker,Broker收到消息返回确认响应。假设这一次交互的平均时延是1ms,这1ms包括了下面这些步骤的耗时:

发送端准备数据、序列化消息、构造请求等逻辑的时间,也就是发送端在网络请求之前的耗时发送消息和返回响应在网络传输中的耗时。

Broker处理消息的时延

如果是单线程发送,每次只发送1条消息,那么每秒只能发送1000ms/1ms*1条/ms=1000条消息。无论是增加每次发送消息的批量大小,还是增加并发都能成倍地提升发送性能。

比如说,消息发送端主要接收RPC请求处理在线业务,因为所有RPC框架都是多线程支持多并发的,自然就实现了并行发送消息。并且在线业务比较在意的是请求响应时延,选择批量发送会影响RPC服务的时延。

如果是一个离线系统,它在性能上更注重整个系统的吞吐量,发送端的数据都是来自于数据库,这种情况就更适合批量发送。可以批量从数据库读取数据,然后批量来发送消息,同样用少量的并发就可以获得非常高的吞吐量。

②消费端性能优化

使用消息队列的时候,大部分的性能问题都出现在消费端,如果消费的速度跟不上发送生产消息的速度,就会造成消息积压。如果这种性能倒挂的问题只是暂时的,只要消费单的性能恢复之后,超过发送端的性能,那积压的消息是可以逐渐被消化掉的。

要是消费速度一直比生产速度慢,时间长了,整个系统就会出现问题,要么,消息队列的存储被填满无法提供服务,要么消息丢失,这对于整个系统来说都是严重故障。

在设计系统的时候,一定要保证消费端的消费性能要高于生产端的发送性能。

消费端的性能优化除了优化消费业务逻辑之外,也可以通过水平扩容,增加消费端的并发数来提升总体的消费性能。在扩容Consumer的实例数量的同时,必须同步扩容主题中的分区数量,确保Consumer的实例数和分区数量是相等的。如果Consumer的实例数量超过分区数量,这样的扩容是无效的。

2、消息积压了该如何处理?

还有一种消息积压的情况是,日常系统正常运转的时候,没有积压或者只有少量积压很快就消费掉了,但是某一时刻,突然就开始积压消息并且积压持续上涨。这种情况下需要在短时间内找到消息积压的原因,迅速解决问题。

能导致积压突然增加,最粗粒度的原因,只有两种:要么是发送变快了,要么是消费变慢了。

大部分消息队列都内置了监控的功能,只要通过监控数据,很容易确定是哪种原因。如果是单位事件发送的消息增多,比如说是赶上大促或者抢购,短时间内不太可能优化消费端的代码来提升消费性能,唯一的方法是通过扩容消费端的实例来提升总体的消费能力。

如果短时间内没有足够的服务器资源进行扩容,没办法的办法是将系统降级,通过关闭一些不重要的业务,减少发送方发送的数据量,最低限度让系统还能正常运转,服务一些重要业务。

还有一种不太常见的情况,通过监控发现,无论是发送消息的速度还是消费消息的速度和原来都没什么变化,这时候需要检查一下消费端是不是消费失败导致的一条消息发福消费这种情况比较多,这种情况也会拖垮整个系统的消费速度。

关于大数据开发学习,消息队列如何处理消息积压,以上就为大家做了基本的介绍了。消息积压是实时流处理常见的问题之一,掌握常见的解决思路和方案,还是很有必要的。

0 人点赞