-
消息传递模式:
- 点对点模式(Point-to-Point):一个消息只能被一个消费者接收。
- 发布/订阅模式(Publish/Subscribe):一个消息可以被多个消费者接收。
-
消息队列:
- 用于存储待发送的消息。
- 提供消息的入队和出队操作。
- 可以支持多种消息存储方式,如内存、磁盘等。
-
消息持久化:
- 确保消息在中间件故障或重启后不会丢失。
- 可以将消息存储在磁盘或其他持久存储介质中。
-
可靠性保证:
- 消息确认机制:消费者在处理完消息后向中间件发送确认,确保消息被正确处理。
- 消息重发机制:如果消息发送失败或未得到确认,中间件会自动重发消息。
-
高可用性:
- 集群部署:通过多个中间件节点组成集群,提高系统的可用性和容错性。
- 故障转移:当某个节点故障时,其他节点可以接管消息的处理。
-
性能优化:
- 消息压缩:减少消息的传输和存储开销。
- 批量处理:将多个消息合并成一批进行处理,提高效率。
- 异步处理:允许发送者和接收者在不同的时间处理消息,提高系统的并发性能。
-
常见的消息中间件:
- RabbitMQ:支持多种消息传递模式,具有良好的可靠性和扩展性。
- Kafka:高吞吐量的分布式消息中间件,适用于大数据处理场景。
- ActiveMQ:成熟的开源消息中间件,支持多种协议。
- RocketMQ:阿里巴巴开源的消息中间件,具有高性能和高可靠性。
-
应用场景:
- 系统集成:不同系统之间通过消息中间件进行通信和数据交换。
- 异步处理:将耗时的操作异步化,提高系统的响应速度。
- 流量削峰:在高并发场景下,通过消息中间件来缓冲请求,避免系统崩溃。
- 分布式事务:通过消息中间件来实现分布式事务的最终一致性。
-
消息格式:
- 常见的消息格式包括文本、JSON、二进制等。
- 中间件通常提供消息的序列化和反序列化功能,以方便消息的传输和存储。
1. **RabbitMQ**:
- **如何保证消息不丢失**:从生产者、队列和消费者三个层面考虑,包括开启生产者确认机制、持久化功能和消费者确认机制,并设置重试次数,将失败消息投递到异常交换机交由人工处理。
- **消息的重复消费问题如何解决**:通过查询数据库判断业务唯一标识是否已存在,若不存在则处理消息,否则说明重复消费,无需再处理。还可以使用redis分布式锁、数据库的锁等解决幂等问题。
- **死信交换机**:延迟队列使用死信交换机和TTL(消息存活时间)实现,若消息超时未消费变成死信,队列可绑定死信交换机,死信交换机上可绑定其他队列,发送消息时可指定TTL时间实现延迟队列功能。还可安装死信插件更方便实现。
- **100万消息堆积的解决方法**:提高消费者消费能力(多线程消费任务)、增加更多消费者、扩大队列容积(使用RabbitMQ惰性队列)。
- **高可用机制**:生产环境使用镜像模式集群,镜像队列结构一主多从,主节点完成所有操作并同步给镜像节点,主节点宕机后镜像节点可替代,但主从同步完成前主节点宕机可能出现数据丢失,可采用仲裁队列解决,仲裁队列与镜像队列类似,主从同步基于Raft协议,强一致,声明队列时指定即可。
2. **Kafka**:
- **如何保证消息不丢失**:生产者发送消息时使用异步回调发送并设置重试,broker中通过复制机制确保消息不丢失(设置acks为all,确保所有副本保存确认后才算成功发送),消费者端禁用自动提交偏移量改为手动提交,消费成功后报告给broker消费位置。
- **消息的重复消费问题如何解决**:禁用消费者自动按期提交偏移量,改为手动提交,当消费成功后再报告给broker消费的位置;设置唯一主键或加锁(数据库锁或redis分布式锁)解决幂等问题。
- **如何保证消费的顺序性**:把消息存储在同一个分区下,可通过发送消息时指定分区号或按照相同业务设置相同key(默认根据key的hashcode值选择分区)来实现。
- **高可用机制**:集群由多个broker实例组成,某一台宕机不影响其他broker服务;复制机制保证高可用,一个topic有多个分区,每个分区有多个副本,有一个leader,其余为follower,副本存储在不同broker中,所有分区副本内容相同,leader故障时从ISR副本列表中选取一个作为leader,ISR副本与leader副本同步保存数据。
- **解释复制机制中的ISR**:ISR是in - sync replica的缩写,指与leader副本同步保存数据的follower副本,分区副本中的follower分为ISR和普通副本,leader挂掉后优先从ISR副本列表中选取leader,因为ISR数据更完整。
- **数据清理机制**:Kafka中topic的数据存储在分区上,分区文件过大时分段存储segment,每个分段以索引和日志文件形式存储在磁盘上。提供两个日志清理策略,根据消息保留时间(默认168小时)或topic存储数据大小(默认关闭)进行清理,可通过broker中的配置文件设置。
- **实现高性能的设计**:包括消息分区、顺序读写、页缓存、零拷贝、消息压缩、分批发送等方面,不受单台服务器限制,顺序读写提升效率,利用页缓存和零拷贝减少磁盘和网络访问,消息压缩减少IO,分批发送减少网络开销。