13518219792

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

了解MQ,读这篇就够了

一、简介

市场上现在常用的消息队列有:RabbitMQ、RocketMQ、Kafka,ActiveMQ。

二、MQ的优势

(1) 解耦

使用消息MQ后,只需要保证消息格式不变,不需要关心发布者及消费者之间的关系,这两者不需要彼此联系。

(2) 异步

在一些不需要即时(同步)的返回结果操作,通过消息队列来实现异步。

(3) 削峰

在大量请求时(秒杀场景),使用消息队列做缓冲处理,削弱峰值流量,防止系统在短时间内被峰值流量冲垮。

场景:在大量流量涌入高峰,如数据库只能抗住2000的并发流量,可以使用MQ控制2000到数据库中。

(4) 日志处理

日志存储在消息队列中,用来处理日志,比如kafka。

三、MQ的劣势

在还未引进MQ之前,系统只需要关系生产端与消费端的接口一致性就可以了,现在引进后,系统需要关注生产端、MQ与消费端三者的稳定性,这增加系统的负担,系统运维成本增加。

引入了MQ,需要考虑的问题就增加了,如何保障消息的一致性,消费不被重复消费等问题。

A系统发送完消息直接返回成功,但是BCD系统之中若有系统写库失败,则会产生数据不一致的问题。

四、常见问题

(1) 怎么保证消息没有重复消费?使用消息队列如何保证幂等性

幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。

问题出现原因

我们先来了解一下产生消息重复消费的原因,对于MQ的使用,有三个角色:生产者、MQ、消费者,那么消息的重复这三者会出现:

解决方案

在正常情况下,生产者是客户,我们很难避免出现用户重复点击的情况,而MQ是允许存在多条一样的消息,但消费者是不允许出现消费两条一样的数据,所以幂等性一般是在消费端实现的:

状态判断:消费者把消费消息记录到redis中,再次消费时先到redis判断是否存在该数据,存在则表示消费过,直接丢弃。

业务判断:消费完数据后,都是需要插入到数据库中,使用数据库的唯一约束防止重复消费。插入数据库前先查询是否存在该数据,存在则直接丢弃消息,这种方式是比较简单粗暴地解决问题。

(2) 消息丢失的情况

(3) 消息的传输顺序性

解决思路

在生产端发布消息时,每次法发布消息都把上一条消息的ID记录到消息体中,消费者接收到消息时,做如下操作。

(4) 怎么解决百万消息积压问题

根据消息重要程度,可以分为两种情况处理:


文章名称:了解MQ,读这篇就够了
标题URL:http://cdbrznjsb.com/article/copdjoe.html

其他资讯

让你的专属顾问为你服务