消息队列
消息队列(Message Queue,MQ)是一种数据传输方式,用于在分布式系统中解耦服务,异步处理任务和提高系统的可伸缩性。消息队列通过一个中间件系统来存储和分发消息,实现生产者(发送消息方)和消费者(接收消息方)之间的通信。
应用场景
解耦:将系统的不同模块解耦,使得生产者和消费者独立开发、部署和扩展。 异步:将需要耗时的任务放入消息队列中异步执行,提高系统的响应速度。例如,用户上传图片后立即返回请求,图片处理由消费者异步完成。 削峰填谷:在流量高峰期缓存请求量,平滑分配处理资源,防止系统过载。 分布式事务:在涉及多服务的数据处理时,保证各服务的操作一致性,适用于金融支付、库存管理等场景。
如何确保消息不丢失
从生产到中间件再到消费者都需要一些处理来保证消息不丢失。 生产者: 使用确认机制,将消息传递给中间件后需要收到中间件的消息接收确认,则后将重试 中间件: 收到消息后在返回消息接收确认前将消息持久化,以免异常宕机引起的数据丢失。 消费者: 消费消息后将消费成功信息返回给中间件,中间件也可以主动尝试询问消息消费情况。 唯一标识符:为每条消息分配唯一标识符,以便在重试时能够识别并避免重复发送相同的消息。通过这种方式,消费者可以识别并处理相同的消息而不产生副作用。 死信队列:多次重试仍未成功消费的消息,会将其移至死信队列中,供后续人工干预或分析处理。
使用消息队列的注意事项
消息重复:消费端要确保业务幂等性,即重复消息处理不会导致数据不一致。 消息积压:消费者处理速度低于生产速度时,会导致消息积压,需进行消费优化或增加消费者。 监控与告警:实时监控消息队列的状态(延迟、积压、错误),保证系统的健康运行。 数据一致性:在分布式事务场景下,合理设计消息队列的确认和重试机制,以保证数据一致性。 消息积压应对: 紧急:扩容,增加消费者 事后:检查消息发布频率,单消费者消息消费能力,与总消费信息速率,做出合适的优化和调整
主流消息队列工具
RocketMQ 支持高吞吐量和低延迟,适用于大规模消息传递。 它提供了可靠的消息投递和事务消息功能,广泛应用于金融、电商等领域。 支持灵活的消息订阅和消费模式,适合多种业务场景。 RabbitMQ 使用AMQP协议,具有丰富的路由功能(Direct、Topic、Fanout、Headers交换机)。 支持可靠性高的消息确认机制。 适合需要复杂路由的系统,提供易用的管理界面。 Kafka 高吞吐量,适用于实时数据流和日志聚合等场景。 数据持久化和顺序性保证,通过分区和副本机制提升可靠性和并发性能。 常用于数据分析、事件流处理、日志采集等场景。 ActiveMQ 支持多种消息协议(JMS、AMQP、MQTT等),具有较高的灵活性。 常用于企业系统集成,适合传统企业级应用的消息队列需求。 Redis 作为消息队列 通过List结构实现简单的队列功能,支持高性能、轻量级的队列。 常用于短期任务队列和缓存,但缺乏传统消息队列的高级功能,如持久化和复杂路由。
总结
使用MQ的主要是异步、解耦、削峰填谷,并且消息不会丢失,也方便追溯和排查。 注意消费者消费时的幂等处理。 注意生产者生产时的消息大小。
问题
1.MQ的作用 2.如何确保消息不丢失