文章目录

东篱南山

采菊东篱下,悠然现南山

面试篇--分布式消息

消息队列

1.使用过哪些MQ?和其他mq比较有什么优缺点?
activeMQ和RocketMQ
2.消息队列的使用场景
1.异步化2.应用解耦 3.应用解耦
3.消息的重发,补充策略
消息重发指的是borker发送给消费者,但消费者处理失败,borker会去重发消息,超过设定次数,消费者会给borker发送一个毒ACK消息,borker将该消息放入死信队列中
默认是6次,
重发时间间隔,默认为1s
重投延时
重发需要有幂等性考虑

4.如何保证消息的有序性
在MQ中创建多条QUEUE,针对同一规则的数据放入相同队列,比如订单(下单,支付,),把相同订单号的放入一个队列中,后端消费者消费就行了,
这种可能会有消息重复问题
5.消息重复问题
1.保证业务的幂等性(需要在消费段做)
2.保证每条消息都有唯一编号且保证消息处理成功与去重表的日志同时出现

5.MQ的连接是线程安全的吗,你们公司的MQ服务架构怎样的。

6.MQ系统的数据如何保证不丢失
消息丢失场景:
1.生产者消息丢失
1.消息确认模式,分配唯一的ID,只有队列写成功了,回传一个确认的ACK
2.开启一个事务,没有被消费者消费,就事务回滚
2.消息队列消息丢失
1.数据持久化
2.消费完成确认后再删除消息
3.消费端消息丢失
消息丢失,未收到确认的ACK,就重发一次,但是做幂等性处理

7.MQ消息如何做到幂等
1.消息队列分配无关业务、全局唯一的ID
2.业务上自己做消息幂等性
8.MQ的消息延迟了怎么处理,

9.利用mq怎么实现最终一致性
1.保证消息不丢失
2.保证消息能被消费正常处理
3.由数据库来做最终的一致性保证

10.如何保证消息队列是高可用的
多种Master/slave模式的集群

11.消息可以设置过期时间么,过期了你们一般怎么处理
消息可以设置过期时间,一般过期后会被放入死信队列
死信处理策略:
1.不使用默认死信队列,不便于管理
2.持久化消息不放入死信队列
3.非持久化消息放入
4.过期消息不保存到死信队列
5.丢弃所有死信
6.丢弃指定死信
7.丢弃正则死信

12.MQ消息积压问题
一般MQ消息积压是因为消费者这边出了问题,所以思路是:
1.先解决消费者的问题,让其能正常消费
2.提升消费者的消费能力,紧急扩容
3.假如队列满了,就粗暴一点,临时写程序来介入数据消费,写完就丢掉消息
15.MQ的技术选型
ActiveMQ
优点:Java开发,相对简单,功能比较完备
缺点:社区不活跃
RocketMQ
优点:社区活跃,大公司里技术支持,功能完备,经得起考验
缺点:
RabbitMQ
优点:
缺点:erlang语言比较少,出问题了不好处理
JMS----->ActiveMq
AMQP----->RockerMQ

1.JMS
JMS是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。
2.JMS消息模型
点对点和发布订阅
3.MOM 就是面向消息中间件(Message-oriented middleware),是用于以分布式应用或系统中的异步、松耦合、可靠、可扩展和安全通信的一类软件。MOM 的总体思想是它作为消息发送器和消息接收器之间的消息中介,这种中介提供了一个全新水平的松耦合。”
ActiveMq相关知识
1.ActiveMq流程
生产者工作流程:
1.创建连接工厂:ConnectionFactory factory = new ActiveMQConnectionFactory(userName,password,url)
2.创建连接:Connection conn= factory.createConnection();
3.开始连接:conn.start()
4.创建会话并设置会话级别:Session session = conn.createSession(true,Session.SESSION_TRANSACTED);
5.创建消息队列:Queue queue = session.createQueue(name);
6.创建或者获取生产者:MessageProducer produer = session.createProducer(queue);
7.生成者发送消息:producer.send();
8.提交会话事务:session.commit();
消费者工作流程:
1.创建连接工厂:ConnectionFactory factory = new ActiveMQConnectionFactory(userName,password,url)
2.创建连接:Connection conn= factory.createConnection();
3.开始连接:conn.start()
4.创建会话并设置会话级别:Session session = conn.createSession(true,Session.SESSION_TRANSACTED);
5.创建消息队列:Queue queue = session.createQueue(name);
6.创建或者获取生产者:MessageProducer produer = session.createProducer(queue);
7.生成者发送消息:producer.send();
8.提交会话事务:session.commit();

2.消息存储方式
1.KahaDB存储(默认方式)
KahaDB的存储原理:
在data/kahadb这个目录下,会生成四个文件:
Ø db.data 它是消息的索引文件,本质上是B-Tree(B树),使用B-Tree作为索引指向db-.log里面存储的消息
Ø db.redo 用来进行消息恢复
Ø db-.log 存储消息内容。新的数据以APPEND的方式追加到日志文件末尾。属于顺序写入,因此消息存储是比较快的。默认是32M,达到阀值会自动递增
Ø lock文件 锁,表示当前获得kahadb读写权限的broker
2.JDBC存储
3.内存
3. 支持同步、异步两种发送模式将消息发送到broker上,
同步会要求broker给一个响应,因为是阻塞操作,会影响到客户端
异步发送者不需要等待broker提供反馈,所以性能相对较高。但是可能会出现消息丢失的情况。


标题:面试篇--分布式消息
作者:zc1249274251
地址:https://www.fanyueba.com/articles/2019/09/26/1569470895320.html