消息中间件面试宝典主要涉及了消息队列(MQ)在系统架构中的应用及其关键特性。以下是关于消息中间件的一些重要知识点:
1. **MQ 的应用场景**:
- 异步处理:通过MQ将耗时任务从主线程中剥离,提高系统响应速度。
- 解耦:MQ作为组件间的通信桥梁,允许服务之间不直接依赖,降低耦合度。
- 流量削峰:在高并发场景下,MQ可以暂时存储大量请求,防止系统过载。
2. **MQ 与多线程的异步区别**:
- 多线程可能导致CPU资源竞争,影响业务性能。
- MQ实现异步完全解耦,更适合大规模互联网项目。
- 对于小型项目,可考虑使用多线程实现异步,大型项目推荐使用MQ。
3. **避免消息堆积**:
- 当生产者的发送速率超过消费者的消费速率时,消息会堆积。
- 解决方法包括增加消费者数量(集群)、消费者批量获取消息以减少网络传输次数。
4. **消息丢失的防护**:
- 消息持久化:确保消息在硬盘中保存,即使MQ宕机也能恢复。
- 生产者确认机制:确保消息写入硬盘后才认为发送成功。
- 消费者确认:如RabbitMQ,消费者确认后消息才会被删除;Kafka或RocketMQ则需要提交offset。
5. **MQ宕机处理**:
- 生产者记录消息日志,以便在宕机后进行补偿操作。
- 补偿机制:重新尝试发送未成功投递的消息。
6. **消息顺序一致性**:
- 在特定场景下(如MySQL与Redis同步),可能需要保证消息顺序。
- 使用相同的消息Key计算哈希,确保消息存放在同一分区,由同一消费者处理。
7. **消息幂等性**:
- 消费者消费失败时,MQ会自动重试。
- 确保业务幂等性,例如通过全局消息ID检查是否已执行过。
- 数据库层面的幂等性保障,如唯一主键约束和乐观锁。
8. **MQ与Redis的数据一致性**:
- 直接删除Redis缓存,简单但可能导致数据丢失。
- 基于MQ异步同步更新,保证数据最终一致性。
- 使用canal订阅binlog同步,实时性强,但实现复杂。
以上知识点是消息中间件在面试中常见的讨论点,理解和掌握这些概念对于面试和实际工作都有很大帮助。在实际使用中,应根据项目需求选择合适的解决方案,并充分考虑系统的可扩展性、容错性和性能。