本文主要介绍了消息队列的概念性质和应用场景,介绍了kafka、rabbitMq常用消息队列中间件的应用模型及消息队列的实现方式,并实战了在Spring中基于redis stream 的消息队列实现方法。
一、消息队列
消息队列是一种进程间通信或者同一个进程中不同线程间的通信方式,主要解决异步处理、应用耦合、流量消峰、负载均衡等问题,实现高性能、高可用、可伸缩和最终一致性架构,是大型分布式系统不可缺少的中间件。
1、异步处理
收到订单消息后,各子系统(库存、支付、消息)可以同步进行。
2、应用解耦
收到订单消息后,各子系统(库存、支付、消息)可以不用被调用或按顺序进行,解决调用失败造成的数据错误
3、流量削峰
在应用和数据库操作之间设置消息队列,消息队列配置请求最大数(低于数据库最大并发数),避免数据库超负荷运行。
4、负载均衡
Kafka、rabbitMq等支持主从架构,在多台服务器进行同步和自动选主。
二、消息队列实现方法
1、四大类方法
内存队列:消息队列通常在内存中实现
文件系统队列:消息可以被写入到文件系统中,持久化存储消息,但需要额外的磁盘空间和I/O操作。
数据库队列:消息可以被添加到数据库的特定表中,然后由另一个进程或线程从表中读取并处理。例如redis、tdengine都可以实现
消息队列中间件:如RabbitMQ、 Kafka等
2、kafka概念
Kafka 的核心架构由以下几个主要组件组成:
- Producer(生产者):发送消息的一方,负责发布消息到 Kafka 主题(Topic)。
- Consumer(消费者):接受消息的一方,订阅主题并处理消息。
- Broker(代理):服务代理节点,Kafka 集群中的一台服务器就是一个 broker,可以水平无限扩展,同一个 Topic 的消息可以分布在多个 broker 中。