中间件-面试题

这篇博客主要探讨了中间件的相关面试问题,涵盖了Dubbo的服务请求失败处理、负载均衡、服务感知,以及与SpringCloud的区别。此外,还介绍了Zookeeper的分布式锁和选举机制,Nacos的配置更新流程和与Zookeeper的对比,Mybatis的分页和缓存机制,以及ES、Docker和K8S的基本概念。最后提到了消息队列的概念和作用。

一、Dubbo

1、Dubbo 的服务请求失败怎么处理

  • dubbo2默认重试次数2,dubbo3默认重试次数-1
  • 可以根据不同场景选择容错策略
    • 失败自动切换:当出现失败时,重试其它服务器
    • 失败自动恢复:后台记录失败请求,定时重发。这种策略通常用于消息通知操作
    • 失败安全策略,如果出现服务通信异常,直接把这个异常吞掉不做任何处理
    • 快速失败策略,服务消费者只发起一次请求,如果请求失败,就直接把错误抛出去。这种比较适合在非幂等性场景中使用

2、Dubbo负载均衡

  • 随机(默认)
  • 一致性hash:每次相同参数的请求都会访问固定服务器
  • 最小活跃数
  • 权重

3、Dubbo 是如何感知服务下线

  • Dubbo 默认采用ZK实现服务的注册与服务发现,即ZK维护Dubbo服务之间的通信地址。在ZK上,会采用树形结构的方式来维护Dubbo 服务提供端的协议地址,Dubbo 服务消费端会从Zookeeper Server 上去查找目标服务的地址列表,从而完成服务的注册和消费的功能。
  • ZK会通过心跳检测机制,来判断Dubbo 服务提供端的运行状态,来决定是否应该把这个服务从地址列表剔除。

4、Dubbo和SpringCloud区别

  • Dubbo 底层使用Netty-NIO 框架,是基于TCP 协议,配合以Hession 序列化完成RPC 通信。
  • SpringCloud 是基于Http 协议+Rest 接口调用远程过程的通信,相对来说,Http 请求会有更大的报文,占的带宽也会更多。但是REST 相比RPC 更为灵活,服务提供方和调用方的依赖只依靠一纸契约,不存在代码级别的强依赖。

5、RPC和HTTP的区别

  • 功能特性
    • http是一个属于应用层的超文本传输协议,是万维网数据通信的基础,主要服务在网页端和服务端的数据传输上。
    • RPC 是一个远程过程调用协议,目的是实现不同计算机应用之间的数据通信,屏蔽通信底层的复杂性,让开发者就像调用本地服务一样完成远程服务的调用。
  • 实现原理
    • http协议是一个已经实现并且成熟的应用层协议,它定义了通
消息中间件在现代分布式系统中扮演着至关重要的角色,主要用于实现系统组件之间的异步通信、解耦和负载均衡。以下是几个常见的消息中间件面试题及答案解析: ### 1. 什么是消息中间件?它的作用是什么? 消息中间件是一种软件组件,用于在不同的应用程序或服务之间传递消息。它主要的作用包括: - **解耦**:发送方和接收方不需要直接连接,从而降低了系统组件之间的耦合度。 - **异步通信**:允许发送方和接收方在不同的时间进行操作,提高了系统的响应速度和吞吐量。 - **缓冲**:可以作为缓冲区,防止因消费者处理速度慢而导致生产者阻塞。 - **可靠传输**:确保消息能够可靠地从发送方传送到接收方,即使在网络不稳定的情况下也能保证消息不丢失。 ### 2. 常见的消息中间件有哪些?它们之间有什么区别? 常见的消息中间件包括: - **RabbitMQ**:基于AMQP协议的消息中间件,支持复杂的路由规则,适合需要高可靠性和复杂消息路由的场景。 - **Kafka**:分布式流处理平台,支持高吞吐量的发布-订阅模型,适用于大数据实时处理和日志聚合等场景。 - **ActiveMQ**:支持多种协议的消息中间件,功能丰富,但性能不如RabbitMQ和Kafka。 - **RocketMQ**:由阿里巴巴开发的消息中间件,支持高并发访问,适用于大规模分布式系统。 每种消息中间件都有其特点和适用场景,选择合适的消息中间件需要根据具体的业务需求和技术环境来决定。 ### 3. 如何保证消息的顺序性? 在某些业务场景下,消息的顺序性非常重要。为了保证消息的顺序性,可以采取以下措施: - **单一分区**:对于Kafka来说,可以通过设置单一分区来保证消息的顺序性。 - **消息分组**:对于RabbitMQ,可以通过将相关消息分组,确保同一组的消息被同一个消费者处理,从而保持顺序性。 - **顺序ID**:为每条消息分配一个顺序ID,消费者根据顺序ID来处理消息,确保消息按序处理。 ### 4. 如何处理消息丢失的问题? 消息丢失是消息中间件中常见的问题之一,可以通过以下方式来减少或避免消息丢失: - **持久化**:将消息写入磁盘,确保即使在系统崩溃的情况下消息也不会丢失。 - **确认机制**:消费者处理完消息后向消息中间件发送确认,如果未收到确认,则重新发送消息。 - **事务支持**:部分消息中间件支持事务,确保消息的发送和处理是原子性的。 ### 5. 如何处理消息重复的问题? 消息重复也是消息中间件中常见的问题之一,可以通过以下方式来处理: - **幂等性设计**:在业务逻辑中设计幂等性,确保即使消息被多次处理也不会影响最终结果。 - **唯一标识**:为每条消息分配一个唯一标识,消费者在处理消息时记录已处理的消息标识,避免重复处理。 ### 6. 如何实现消息的延迟投递? 消息的延迟投递是指消息在发送后不会立即被消费者消费,而是等待一段时间后再被消费。实现消息延迟投递的方法包括: - **定时任务**:使用定时任务来检查是否有消息需要投递。 - **延迟队列**:某些消息中间件(如RabbitMQ)支持延迟队列插件,可以直接实现消息的延迟投递。 - **时间轮**:使用时间轮算法来管理延迟消息,适用于需要大量延迟消息的场景。 ### 7. 如何监控消息中间件的健康状况? 监控消息中间件的健康状况对于系统的稳定运行至关重要。可以通过以下方式进行监控: - **内置监控工具**:大多数消息中间件都提供了内置的监控工具,可以查看队列长度、消息堆积情况等。 - **第三方监控工具**:使用第三方监控工具(如Prometheus、Grafana等)来收集和展示监控数据。 - **日志分析**:通过分析消息中间件的日志,发现潜在的问题和异常。 ### 8. 如何实现消息的广播? 消息的广播是指一条消息被发送给多个消费者。实现消息广播的方法包括: - **发布-订阅模型**:使用发布-订阅模型,消息被发布到一个主题,所有订阅该主题的消费者都会收到消息。 - **复制消息**:在消息中间件中复制消息,将同一消息发送给多个队列,每个队列对应一个消费者。 ### 9. 如何实现消息的优先级? 消息的优先级是指某些消息需要优先于其他消息被处理。实现消息优先级的方法包括: - **优先级队列**:某些消息中间件(如RabbitMQ)支持优先级队列,可以根据消息的优先级来决定处理顺序。 - **多队列策略**:将不同优先级的消息放入不同的队列中,消费者优先处理高优先级队列中的消息。 ### 10. 如何选择合适的消息中间件? 选择合适的消息中间件需要考虑以下几个因素: - **性能需求**:根据系统的吞吐量和延迟要求选择合适的消息中间件- **可靠性需求**:根据业务对消息可靠性的要求选择支持持久化和确认机制的消息中间件- **扩展性需求**:根据系统的规模和未来的扩展需求选择支持水平扩展的消息中间件- **运维成本**:考虑消息中间件的部署、维护和管理成本。 ### 示例代码:使用RabbitMQ发送和接收消息 ```python import pika # 连接到RabbitMQ服务器 connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # 声明一个队列 channel.queue_declare(queue='hello') # 发送消息 channel.basic_publish(exchange='', routing_key='hello', body='Hello World!') print(" [x] Sent 'Hello World!'") # 关闭连接 connection.close() ``` ```python import pika # 连接到RabbitMQ服务器 connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # 声明一个队列 channel.queue_declare(queue='hello') # 定义回调函数 def callback(ch, method, properties, body): print(" [x] Received %r" % body) # 订阅队列 channel.basic_consume(queue='hello', auto_ack=True, on_message_callback=callback) print(' [*] Waiting for messages. To exit press CTRL+C') # 开始消费消息 channel.start_consuming() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值