消息队列 | 青训营笔记
消息队列是什么?
消息队列,我们一般会称为MQ(Message Queue),也就是说消息队列的本质就是一个队列,而队列是一种先进先出的数据结构,提供消息传递和消息排队模型,可以在分布式环境下提供应用解耦、弹性伸缩、流量削峰、异步通信、数据同步、微服务之间通信等功能,作为分布式系统架构中的一个重要组件,有着举足轻重的地位 我们会将要传输的数据、消息放在消息队列中 其中,往MQ里放东西的叫做生产者 从MQ里面取消息的叫做消费者
解耦

可以看出mq的引入让用户对商品的搜索和用户行为的记录解耦了,如果未引入mq,那么就会一条直线走下去,假如我们想要修改某部分,那么整个模块都要修改,引入mq后,用户搜索商品和行为记录就解耦合了,就算行为记录这里挂了,用户搜索商品这块服务也能继续
削峰
当请求来的时候,先把请求放在mq中,然后系统再根据自己能够处理的请求数去mq里面拿数据,这里就是每秒只能拿10个请,求这样即使每秒请求数很大,系统也不会挂掉
异步

异步的话,用户这里下单后就可以直接返回下单成功了,用户就不需要等数据库那里处理和商家的通知,大大减少了用户等待的时间
日志搜集
通过将日志数据发送到消息队列,可以将其集中到一个位置,方便进行监控和分析。并且可以使用专业的日志搜集工具对消息队列中的日志进行搜索、过滤、聚合和可视化,以便进行故障排查、性能分析和安全审计等工作。
各种mq的对比
- RabbitMQ:
- 开源、跨平台的消息队列系统。
- 基于AMQP(高级消息队列协议)标准,支持多种编程语言。
- 提供广泛的特性,如消息持久化、消息路由、消息确认机制等。
- 社区活跃,拥有丰富的文档和资源。
- Kafka:
- 开源、分布式的流式平台。
- 高吞吐量、低延迟,适用于大规模、高并发的数据处理场景。
- 支持发布-订阅和批量消费模式。
- 可以持久化大量的数据流,并支持数据回放和数据流处理。
- ActiveMQ:
- 开源、跨平台的消息队列和消息中间件。
- 支持多种通信协议和消息模式,如点对点和发布-订阅。
- 提供高可用性和可伸缩性,支持集群和分布式部署。
- 具备事务支持、消息持久化、消息过滤等特性。
- RocketMQ:
- 开源的分布式消息队列系统,由阿里巴巴集团开发。
- 支持高吞吐量、低延迟的消息传递。
- 提供多种消息模式,如发布-订阅和点对点。
- 具备消息顺序保证、分布式事务、消息回溯等特性。
- NSQ:
- 开源的实时分布式消息平台。
- 轻量级、易于部署和扩展。
- 支持发布-订阅模式。
- 具备消息持久化、故障恢复和可伸缩性等特性。
- Pulsar:
- 开源的分布式流式平台和消息队列系统。
- 具备高性能、低延迟、可伸缩性和高可用性。
- 支持多租户、多语言和多协议。
- 提供持久化存储、数据分段、事务支持等特性。
kafka
- 操作:
- 创建主题(Topic):使用Kafka命令行工具或API创建主题,定义了消息的分类。
- 发布消息:使用生产者(Producer)将消息发布到指定的主题。
- 消费消息:使用消费者(Consumer)从主题中读取和处理消息。
- 核心原理:
- 分布式存储:Kafka将消息分布在多个Broker节点上,通过分区(Partition)和副本(Replica)实现高可靠性和可伸缩性。
- 发布-订阅模式:生产者将消息发布到主题,消费者订阅感兴趣的主题并消费消息。
- 批量处理和零拷贝:Kafka通过批量处理和零拷贝技术实现高吞吐量和低延迟。
- 消息持久化:Kafka将消息持久化到磁盘,支持数据的长期存储和回放。
- 分区和偏移量:消息以分区的方式存储,并使用偏移量(Offset)进行唯一标识和定位。
RabbitMQ:
- 操作:
- 创建队列(Queue):使用RabbitMQ管理界面或API创建队列,作为消息的目的地。
- 发布消息:生产者将消息发布到指定的队列。
- 消费消息:消费者从队列中获取并处理消息。
- 核心原理:
- 消息队列:RabbitMQ使用消息队列来存储和传递消息,确保消息的可靠性和顺序性。
- 生产者-消费者模式:生产者将消息发布到队列,消费者从队列中获取消息并进行处理。
- 消息确认机制:RabbitMQ支持消息的确认机制,确保消息的可靠投递和处理。
- 路由和交换器:RabbitMQ使用交换器(Exchange)和绑定(Binding)来路由消息到相应的队列。
- 消息持久化:RabbitMQ可以将消息持久化到磁盘,确保消息的持久性和可靠性