消息队列(Message Queue,MQ)是一种数据传输方式,用于在分布式系统中解耦服务,异步处理任务和提高系统的可伸缩性。消息队列通过一个中间件系统来存储和分发消息,实现生产者(发送消息方)和消费者(接收消息方)之间的通信。

应用场景

解耦:将系统的不同模块解耦,使得生产者和消费者独立开发、部署和扩展。

异步:将需要耗时的任务放入消息队列中异步执行,提高系统的响应速度。例如,用户上传图片后立即返回请求,图片处理由消费者异步完成。

削峰填谷:在流量高峰期缓存请求量,平滑分配处理资源,防止系统过载。

分布式事务:在涉及多服务的数据处理时,保证各服务的操作一致性,适用于金融支付、库存管理等场景。

如何确保消息不丢失

从生产到中间件再到消费者都需要一些处理来保证消息不丢失。

生产者:
  使用确认机制,将消息传递给中间件后需要收到中间件的消息接收确认,则后将重试
中间件:
  收到消息后在返回消息接收确认前将消息持久化,以免异常宕机引起的数据丢失。
消费者:
  消费消息后将消费成功信息返回给中间件,中间件也可以主动尝试询问消息消费情况。


唯一标识符:为每条消息分配唯一标识符,以便在重试时能够识别并避免重复发送相同的消息。通过这种方式,消费者可以识别并处理相同的消息而不产生副作用。

死信队列:多次重试仍未成功消费的消息,会将其移至死信队列中,供后续人工干预或分析处理。

使用消息队列的注意事项

消息重复:消费端要确保业务幂等性,即重复消息处理不会导致数据不一致。

消息积压:消费者处理速度低于生产速度时,会导致消息积压,需进行消费优化或增加消费者。

监控与告警:实时监控消息队列的状态(延迟、积压、错误),保证系统的健康运行。

数据一致性:在分布式事务场景下,合理设计消息队列的确认和重试机制,以保证数据一致性。

消息积压应对:
  紧急:扩容,增加消费者
  事后:检查消息发布频率,单消费者消息消费能力,与总消费信息速率,做出合适的优化和调整

主流消息队列工具

RocketMQ

支持高吞吐量和低延迟,适用于大规模消息传递。
它提供了可靠的消息投递和事务消息功能,广泛应用于金融、电商等领域。
支持灵活的消息订阅和消费模式,适合多种业务场景。

RabbitMQ

使用AMQP协议,具有丰富的路由功能(Direct、Topic、Fanout、Headers交换机)。
支持可靠性高的消息确认机制。
适合需要复杂路由的系统,提供易用的管理界面。


Kafka

高吞吐量,适用于实时数据流和日志聚合等场景。
数据持久化和顺序性保证,通过分区和副本机制提升可靠性和并发性能。
常用于数据分析、事件流处理、日志采集等场景。


ActiveMQ

支持多种消息协议(JMS、AMQP、MQTT等),具有较高的灵活性。
常用于企业系统集成,适合传统企业级应用的消息队列需求。


Redis 作为消息队列

通过List结构实现简单的队列功能,支持高性能、轻量级的队列。
常用于短期任务队列和缓存,但缺乏传统消息队列的高级功能,如持久化和复杂路由。

总结

使用MQ的主要是异步、解耦、削峰填谷,并且消息不会丢失,也方便追溯和排查。
注意消费者消费时的幂等处理。
注意生产者生产时的消息大小。

问题

1.MQ的作用
2.如何确保消息不丢失

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注