05:消息队列篇(8)

目录

一、MQ有什么用?有哪些具体的使用场景?

二、如何进行产品选型?

三、如何保证消息不丢失?

四、如何保证消息消费的幂等性?

五、如何保证消息的顺序?

六、如何保证消息的高效读写?

七、使用MQ如何保证分布式事务的最终一致性?

八、让你设计一个MQ,你会如何设计?


一、MQ有什么用?有哪些具体的使用场景?

MQ: MessageQueue,消息队列。 队列是一种FIFO先进先出的数据结构。消息由生产者发送到MQ进行排队,然后由消费者对消息进行处理。QQ、 微信 就是典型的MQ场景。

MQ的作用:

1、异步:
例子:快递。 快递员-> 菜鸟驿站<- 客户
作用:异步能提高系统的响应速度和吞吐量。
2、解耦:
例子:《Thinking in java》 -> 编辑社
作用:服务之间进行解耦,可以减少服务之间的影响,提高系统的稳定性和可扩展性。
另外,解耦之后可以实现数据分发。生产者发送一个消息后,可以由多个消费者来处理。
3、削峰:
例子:长江涨水->三峡大坝
作用:以稳定的系统资源应对突发的流量冲击。

MQ的缺点:

1、系统可用性降低:
一旦MQ宕机,整个业务就会产生影响。高可用
2、系统的复杂度提高:
引入MQ之后,数据链路就会变得很复杂。如何保证消息不丢失?消息不会重复调用?怎么保证消息的顺序性?
3、数据一致性:
A系统发消息,需要由B、C两个系统一同处理。如果B系统处理成功、C系统处理失败,这就会造成数据一致性的问题。

二、如何进行产品选型?

Kafka

优点: 吞吐量非常大,性能非常好,集群高可用。
缺点:会丢数据,功能比较单一。
使用场景:日志分析、大数据采集

RabbitMQ

优点: 消息可靠性高,功能全面。
缺点:吞吐量比较低,消息积累会严重影响性能。erlang语言不好定制。
使用场景:小规模场景。

RocketMQ

优点:高吞吐、高性能、高可用,功能非常全面。
缺点:开源版功能不如云上商业版。官方文档和周边生态还不够成熟。客户端只支持java。
使用场景:几乎是全场景。

三、如何保证消息不丢失?

请参考:

消息队列面试连环问:如何保证消息不丢失?处理重复消息?消息有序性?消息堆积处理? - JavaShuo你们好,我是 yes。web 最近我一直扎在消息队列实现细节之中没法自拔,已经写了 3 篇Kafka源码分析,还剩不少没肝完。以前还存着RocketMQ源码分析还没整理。今儿暂时先跳出来盘一盘大方向上的消息队列有哪些核心注意点。面试 核心点有不少,为了更贴合实际场景,我从常见的面试问题入手:算法 如何保证消息不丢失? 若是处理重复消息? 如何保证消息的有序性? 若是处理消息堆积? 固然在剖析这几个http://www.javashuo.com/article/p-mhifbshw-mx.html


四、如何保证消息消费的幂等性?

幂等性:一个请求,不管重复来多少次,结果是不会改变的。

每个消息都会有唯一的消息 id。


1)先查再保存
每次保存数据的时候,都先查一下,如果数据存在了那么就不保存。这个情况是并发不高的情况。

2)业务表添加约束条件
如果你的数据库将来都不会分库分表,那么可以在业务表字段加上唯一约束条件(UNIQUE),这样相同的数据就不会保存为多份。

3)添加消息表
再数据库里面,添加一张消息消费记录表,表字段加上唯一约束条件(UNIQUE),消费完之后就往表里插入一条数据。因为加了唯一约束条件,第二次保存的时候,mysql 就会报错,就插入不进去;通过数据库可以限制重复消费。

4)使用 redis
如果你的系统是分布式的,又做了分库分表,那么可以使用 redis 来做记录,把消息 id 存在 redis 里,下次再有重复消息 id 在消费的时候,如果发现 redis 里面有了就不能进行消费。

5)高并发下
如果你的系统并发很高,那么可以使用 redis 或者 zookeeper 的分布式对消息 id 加锁,然后使用上面的几个方法进行幂等性控制。


五、如何保证消息的顺序?

全局有序和局部有序: MQ只需要保证局部有序,不需要保证全局有序。

生产者把一组有序的消息放到同一个队列当中,而消费者一次消费整个队列当中的消息。
RocketMQ:有完整的设计。
RabbitMQ:要保证目标exchange只对应一个队列。并且一个队列只对应一个消费者。
Kafka:生产者通过定制partition分配规则,将消息分配到同一个partition。 Topic 下只对应一个消费者。

六、如何保证消息的高效读写?

零拷贝: kafka和RocketMQ都是通过零拷贝技术来优化文件读写。传统文件复制方式: 需要对文件在内存中进行四次拷贝。
零拷贝: 有两种方式, mmap和transfile
Java当中对零拷贝进行了封装, Mmap方式通过MappedByteBuffer对象进行操作,而transfile通过FileChannel来进行操作。
Mmap 适合比较小的文件,通常文件大小不要超过1.5G ~2G 之间。
Transfile没有文件大小限制。RocketMQ当中使用Mmap方式来对他的文件进行读写。
在kafka当中,他的index日志文件也是通过mmap的方式来读写的。在其他日志文件当中,并没有使用零拷贝的方式。
kafka使用transfile方式将硬盘数据加载到网卡。

七、使用MQ如何保证分布式事务的最终一致性?

分布式事务:业务相关的多个操作,保证他们同时成功或者同时失败。
最终一致性: 与之对应的就是强一致性
MQ中要保护事务的最终一致性,就需要做到两点
1)生产者要保证100%的消息投递。 事务消息机制
2)消费者这一端需要保证幂等消费。 唯一ID+ 业务自己实现幂等
分布式MQ的三种语义:
at least once
at most once
exactly once:
RocketMQ 并不能保证exactly once。商业版本当中提供了exactly once的实现机制。
kafka: 在最新版本的源码当中,提供了exactly once的demo。
RabbitMQ: erlang天生就成为了一种屏障。

八、让你设计一个MQ,你会如何设计?

两个误区: 1、 放飞自我,漫无边际。 2、纠结技术细节。
好的方式: 1、 从整体到细节,从业务场景到技术实现。2、以现有产品为基础。
答题思路: MQ作用、项目大概的样子。
1、实现一个单机的队列数据结构。 高效、可扩展。
2、将单机队列扩展成为分布式队列。- 分布式集群管理
3、基于Topic定制消息路由策略。- 发送者路由策略,消费者与队列对应关系,消费者路由策略
4、实现高效的网络通信。- Netty Http
5、规划日志文件,实现文件高效读写。- 零拷贝,顺序写。 服务重启后,快速还原运行现场。
6、定制高级功能,死信队列、延迟队列、事务消息等等。 - 贴合实际,随意发挥。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thomas.Sir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值