关于mq:阿里二面MQ-消息积压了增加消费者有用吗
大家好,我是不才陈某~ 明天分享一道有意思的面试题。 面试官:RocketMQ 音讯积压了,减少消费者有用吗? 我:这个要看具体的场景,不同的场景下状况是不一样的。 面试官:能够具体说一下吗? 我:如果消费者的数量小于 MessageQueue 的数量,减少消费者能够放慢音讯生产速度,缩小音讯积压。比方一个 Topic 有 4 个 MessageQueue,2 个消费者进行生产,如果减少一个消费者,明细能够放慢拉取音讯的频率。如下图: 关注公众号:码猿技术专栏,回复关键词:1111 获取阿里外部Java性能调优手册! 如果消费者的数量大于等于 MessageQueue 的数量,减少消费者是没有用的。比方一个 Topic 有 4 个 MessageQueue,并且有 4 个消费者进行生产。如下图 面试官:你说的第一种状况,减少消费者肯定能放慢音讯生产的速度吗? 我:这...,个别状况下是能够的。 面试官:有非凡的状况吗? 我:当然有。消费者音讯拉取的速度也取决于本地音讯的生产速度,如果本地音讯生产的慢,就会提早一段时间后再去拉取。 面试官:在什么状况下消费者会提早一段时间后后再去拉取呢? 我:消费者拉取的音讯存在 ProcessQueue,消费者是有流量管制的,如果呈现上面三种状况,就不会被动去拉取: ProcessQueue 保留的音讯数量超过阈值(默认 1000,能够配置);ProcessQueue 保留的音讯大小超过阈值(默认 100M,能够配置);对于非程序生产的场景,ProcessQueue 中保留的最初一条和第一条音讯偏移量之差超过阈值(默认 2000,能够配置)。这部分源码请参考类:org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl。面试官:还有其余状况吗? 我:对于程序生产的场景,ProcessQueue 加锁失败,也会提早拉取,这个延迟时间是 3s。 面试官:消费者提早拉取音讯,个别可能是什么起因导致的呢? 我:其实提早拉取的实质就是消费者生产慢,导致下次去拉取的时候 ProcessQueue 中积压的音讯超过阈值。以上面这张架构图为例: 消费者生产慢,可是能上面的起因: 消费者解决的业务逻辑简单,耗时很长;消费者有慢查问,或者数据库负载高导致响应慢;缓存等中间件响应慢,比方 Redis 响应慢;调用内部服务接口响应慢。面试官:对于内部接口响应慢的状况,有什么应答措施吗? 我:这个要分状况探讨。 如果调用内部零碎只是一个告诉,或者调用内部接口的后果并不解决,能够采纳异步的形式,异步逻辑里采纳重试的形式保障接口调胜利。 如果内部接口返回后果必须要解决,能够思考接口返回的后果是否能够缓存默认值(要思考业务可行),在调用失败后采纳疾速降级的形式,应用默认值代替返回接口返回值。 如果这个接口返回后果必须要解决,并且不能缓存,能够把拉取到的音讯存入本地而后给 Broker 间接返回 CONSUME_SUCCESS。等内部零碎恢复正常后再从本地取出来进行解决。 面试官:如果消费者数小于 MessageQueue 数量,并且内部零碎响应失常,为了疾速生产积压音讯而减少消费者,有什么须要思考的吗? 我:内部零碎尽管响应失常,然而减少多个消费者后,内部零碎的接口调用量会突增,如果达到吞吐量下限,内部零碎会响应变慢,甚至被打挂。 同时也要思考本地数据库、缓存的压力,如果数据库响应变慢,解决音讯的速度就会变慢,起不到缓解音讯积压的作用。 面试官:新减少了消费者后,怎么给它调配 MessageQueue 呢? ...