MQ常见问题

1,MQ使用场景有哪些

mq更多应用与分布式服务架构,起到流量消封和系统解耦的作用,作为发送方告知其他系统(或者自产自消)自身的业务数据发生变化,而不过多在意消费方的业务细节。而作为消费方需要关注消息发送的实际场景,以及实现自己的业务细节。
具体场景比如用户下单完成后对外通知订单状态的变更,实现功能的解耦,秒杀场景通过MQ来处理已经获取秒杀资格的订单,保证秒杀的性能,对于一些可以从主流程剥离出来,而且不需要立即处理的场景可以使用mq,比如发送邮件短信,另外数据同步的场景也可以使用MQ实现。

2,为什么要使用mq,mq的常见作用

比如用户下单业务,订单会自动参与各个优惠活动或送优惠卷,经常也会发送微信通知或者系统通知等等。如果将业务逻辑下单那么系统变得难以维护,mq通过异步处理机制将这些与核心业务无关的业务处理放到其他服务或者其他模块,实现功能之间的解耦。
另外当我们面临大量流量 一瞬间打开的时候系统可能会很难抗住高并发,那么就可以通过只处理核心逻辑或者先记录这些请求,由mq来异步处理或者实现延迟处理,实现流量的消封。

3,mq可能会有那些常见问题

mq主要问题就是消息丢失,重复消费,顺序性等问题,像消息丢失,常见的可能是发送的时候丢失,或者队列丢失,或者消费失败,导致丢失。这种情况下,我们可以采用好发送的时候,做好验证,持久化一般mq都有相应的raid策略,消费的时候做好ack机制,可以处理。像重复性问题我们可以做好幂等性处理,防止消息多次发送或者重复消费。顺序问题,我们可以用队列的顺序模式,也可以 确保使用分区机制,来保证消费。

4,如何保证消息的顺序消费

顺序消费很常见,举个例子,比如先新增,后删除的消息,这种就需要保证顺序消费,造成mq不顺序消费的原因有三个,最常见的是多个消费者并行处理,大家都消费同一消息队列的消息,如果没有特殊的限制,就会造成消息的处理顺序可能会与发送顺序不一致,另外一种就是分区机制,不同的分区内的消息顺序可能会被打乱,还有就是重试,如果消息处理失败时,重试机制重发可能产生影响。
解决的方案主要是比如可以使用顺序队列消息设置分区建保证有顺序性的消息,落入到分区中
顺序队列:比如kafka使用单个分区来保证消息的顺序性。
使用消息分区建:通过设置消息分区键,确保同一分区内的消息按顺序处5,理。分区建通常是业务相关的标识符,比如订单ID,用户IID,在kafka中,可以使用分区键来确保同一订单的消息发送到同一分区。
单消费模式:在某些情况下,可以使用单消费模式,既一个队列只有一个消费者,这样可以确保按顺序处理。
消息排序:在某些场景中,可以在消费端进行消息排序,消费者在处理消息前,对消息进行排序,确保处理顺序

5,如何避免消息丢失

消息丢失主要产生在几个环节,按照消息的生命周期,可能会在生产中丢失,传输中丢失,存储中丢失,消费中丢失。
生产中丢失,比如实际消息未发出,但是程序认为发出了,这种主要是要保证我们发送消息的时候不会报错,确保消息被成功发送到消息系统,比如kafka使用acks配置,设置为all,确保消息被所有副本确认.
在传输过程中,网络传输失败进行重试,同时使用TCp,确保消息传输的可靠性。在kafka中配置重试机制。
消息传递过程中的可靠性保证,确保消息在磁盘上持久化存储。kafka默认情况下是持久化存储。
消息在消费过程中的可靠性保证
消息确认机制,确保消息被成功处理后才从队列中删除。比如kafka使用手动提交偏移量.

6,如何避免消息重复投递或者重复消费

首先要保证的就是消费幂等,一个消息应该无论被处理多少次,结果都是相同的,主要是通过唯一标识,建立去重表,或者业务逻辑代码的幂等处理来实现,另一种情况就是投递,这种情况一方面,配合mq的投递机制,尽快收到mq的确认,可以防止我们多次重试,还可以在发送方做好策略处理,比如做去重表,也可以避免重复。
最后一个就是偏中间件机制,针对有位点概念的mq,消费者一定要及时的提交位点。
消息幂等性
1,唯一标识:每条消息都带有一个唯一标识,在处理消息时,先检查这个标识是否已经处理过。
2,去重表:使用数据库或者缓存记录处理过的消息标识,避免重复处理。
3,业务逻辑幂等性:确保业务操作本身是幂等的,例如扣款操作确保同一笔交易不会被重复扣款
消息投递机制
同步投递确保消息被可靠地发送到broker,并且发送方可以收到确认,通过这种方式,可以减少消息丢失的可能。
消费进度管理
消费者实例在消费消息后,需要定期提交消费位点到broker.这样即使消费者实例重启,也能从上一次提交的位置继续消费。
消费位点可以存储在Broker或者数据库,zookeeper中,确保消费位点的持久化存储,可以在消费者实例故障恢复后继续消费。

7 消息重复消费的原因

常见的主要有,发送方逻辑错误或者重放,重试机制,实例重启,位点提交失败等。
有时会产生发送方因自身逻辑错误,导致消息重复发送,或者某个消费方有问题,导致消息没有正确消费,想让发送方重发这种情况,重试机制是mq内置的一种策略,当消费者消费失败,或者迟迟没收到ack确认的时候,mq可能会认为这次消费有问题于是进行再次发送。还有就是实例重启,或者位点提交失败,导致偏移的时候,mq会认为位点之后的消息,没有被消费,于是重新发送给消费方,其实无论怎么重复消费,我们消费方只要做好幂等或业务逻辑的处理就不会产生问题。

8,如果产生了消息积压问题如何解决

在一个运行正常的系统中,消息积压通常是因为生产者短时间内生产了大量的消息,而消费者相对缓慢导致,从生产者来入手,可以做降级或者限流,减少消息的产生,从消费者入手,短期方案可以增加消费实例来提高消费速度,另外评估是否需要优化消费者的处理逻辑,通过提升代码性能来提高消费速度。

9,如何解决消息队列的延时以及过期失效问题

解决消息队列的延时问题
1,增加消费者实例:增加消费者实例可以提高消费处理的并发度,从而减少消息的等待时间。
2,优化消费者处理逻辑:优化消费者处理逻辑,减少每条消息的处理时间,例如:通过批量处理,异步处理,减少不必要的计算和I/O操作来提高处理效率。
3,调整消息队列的分区:增加消息队列的分区数,使更多的消费者能够并行处理消息,从而提高处理速度。
4,调整消息队列的配置: 调整消息队列的配置参数,如增加内存缓存区大小,优化网络配置等,以减少消息传输和处理的延时。
解决消息过期失效问题
1,设置合理的消息过期时间:根据业务需求设置合理的消息过期时间,确保消息在有效期内被处理。
2,使用死信队列:将处理失败或者过期的消息转移到死信队列,进行后续处理或者人工干预。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值