java面试---MQ

RabbitMQ介绍

consumer(消费者):使用队列Queue从Exchange中获取消息的应用

Exchange(交换机):负责接收生产者的消息并把它们转到合适的队列

Queue(队列):一个存储exchange发来的消息的缓冲,并将消息主动发送给Consumer,或者Consumer主动来获取

Binging(绑定):队列和交换机之间的关系。Exchange根据消息的属性和Bingding的属性来转发消息。绑定的一个重要属性是binding_key.

Connection(连接)和Channel(通道):生产者和消费者需要和MQ建立TCp连接。一些应用需要多个connection,为了节省TCP连接,可以使用Channel,它可以被认为是一种轻型的共享TCP连接的连接。

Message(消息):MQ转发的二进制对象,包括Header、Properties、Data。其中数据部分不是必要的。producer:消息的生产者,负责产生消息并把消息发到交换机

 

工作队列

当我们把任务当做消息发送到队列中,一个运行在后台的工作者进程就会去除任务然后处理。当运行多个工作者,任务就会在它们之前共享

工作队列就是为了避免等待一些占用大量资源、时间的操作,它会发送一些耗时的任务给多个工作者

 

发布/订阅

用于一对多的通讯,当消息发布者像一个主题topic发送一条消息后,该主题的所有订阅者都会收到这条信息

 

MQ是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务

 

MQ的不足:

1)系统更加复杂,多了一个mq组件

2)消息传递路径更长,延时会增加

3)消息的可靠性和重复性互为矛盾,消息不丢和不重难以同时同时保证

4)上游无法知道下游运行结果

 

什么时候使用MQ

1)数据驱动的任务依赖

三个任务,任务2需要依赖任务1的结果,3依赖2的结果;此时可以用MQ,首先执行1,1结束后发送消息到2,2开始执行,后面同理

MQ只用来传递上游任务执行完成的消息,不用于传递真正的输入输出数据

2)上游不关心执行结果

3)异步返回执行时间长

 

1,发送端MQ-client将消息发给服务端MQ-server

2,服务端MQ-server将消息落地

3,服务端MQ-server回ACK给发送端MQ-client

4,服务端MQ-server将消息发给接收端MQ-client

5,接收端MQ-client回ACK给服务端

6,服务端MQ-server将落地消息删除

消息队列实现消息必达

1)消息落地

2)消息超时,重传,确认

 

消息总线保证幂等

1)在上半场的消息传递生产内部消息ID,全局唯一,MQ生产生成与业务无关

2)在下半场业务发送方带入id,业务接收方去重保证幂等

 

延时消息功能

1、采用定时任务,规定时间内未完成任务执行该任务

缺点:

1)轮询效率低

2)有重复计算的嫌疑

3)时效性不够好

 

2)环形队列和任务集合

 

MQ快速实现流量削峰填谷

1、不管采用直接调用还是mq推送,都有一个缺点,下游接受消息无法控制到达自己的流程,如果调用方不限速,很有可能把下游压垮

2、优化方案:

1)业务上游队列缓冲,限制发送

2)业务下游队列缓冲,限速执行

3、MQ怎么缓冲流量

由MQ-server推模式改为MQ-client拉的模式

客户端根据自身能力,每次拉取若干条消息进行处理

4、总结

1)MQ-client提供拉模式,定时或者批量拉取,可以起到削平流量,下游自我保护的作用(MQ需要做的)

2)要想提升整体吞吐量,需要下游优化,例如批量处理等方式(消息接收方需要做的)

 

怎么解决kafka的数据丢失

producer端:

宏观上看保证数据的可靠安全性,肯定是依据分区数做好数据备份,设立副本数。

broker端:

topic设置多分区,分区自适应所在机器,为了让各分区均匀分布在所在的broker中,分区数要大于broker数。

分区是kafka进行并行读写的单位,是提升kafka速度的关键。

Consumer端

consumer端丢失消息的情形比较简单:如果在消息处理完成前就提交了offset,那么就有可能造成数据的丢失。由于Kafka consumer默认是自动提交位移的,所以在后台提交位移前一定要保证消息被正常处理了,因此不建议采用很重的处理逻辑,如果处理耗时很长,则建议把逻辑放到另一个线程中去做。为了避免数据丢失,现给出两点建议:

enable.auto.commit=false  关闭自动提交位移

在消息被完整处理之后再手动提交位移

 

 

 

### 关于Java面试中的消息队列(MQ) #### 确保消息不丢失 当提及如何确保使用MQ技术时消息100%不丢失,可以考虑多个层面的保障措施。持久化机制是其中的关键之一,在Kafka、RabbitMQ以及RocketMQ这些平台中均有所体现[^1]。对于Kafka而言,其设计允许将消息存储至磁盘并支持配置副本数以增强可靠性;同样地,RocketMQ也提供了类似的特性,并且特别强调了通过零拷贝提高性能的同时不影响数据的安全性。 #### 结合实际项目经验作答 面对此类问题的回答应当紧密联系个人参与过的具体案例来进行阐述。例如,在某个电商系统的订单处理模块里引入了消息队列用于异步通知库存更新状态的变化,从而有效缓解高并发场景下的压力。在此基础上讨论所采取的技术手段如设置合理的确认机制、重试策略等来防止任何可能的消息遗失情况发生[^2]。 #### 零拷贝优化与文件传输效率 深入探讨不同类型的MQ产品是如何利用操作系统级别的特性提升效能也是加分项。比如提到RocketMQ采用`mmap()`函数映射内存区域直接访问物理设备上的文件片段,减少了不必要的上下文切换次数;相比之下,尽管Kafka的部分组件依赖传统的I/O模型完成工作流,但在特定条件下依然能够借助Linux特有的sendfile()接口加速网络间的数据交换过程[^3]。 ```java // 示例代码展示了一个简单的生产者发送消息给消费者的过程 ProducerRecord<String, String> record = new ProducerRecord<>("topic-name", "key", "value"); producer.send(record); ``` #### 实现分布式事务的一致性 最后还应该准备好解释怎样运用MQ达成跨服务间的协调一致效果。一种常见做法是在业务逻辑层面上构建两阶段提交协议或者TCC模式(Try-Confirm-Cancel),并通过可靠的消息传递作为桥梁连接各个独立单元之间的交互行为,以此保证全局视角下所有操作要么全部成功执行要么完全回滚撤销。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值