分布式消息队列基础知识

2023年 9月 23日 34.2k 0

前言

本文主要整理消息队列的一些基本概念,为后面的RocketMQ消息队列组件深入学习打下基础。

一、什么是消息队列?

维基百科介绍:消息队列(Message Queue)是一种不同进程间通信同一进程的不同线程间的通信方式。根据这个定义可知,消息队列主要有两类:

一类是内存中的消息队列,比如在Java语言中就包括ArrayBlockingQueue,LinkedBlockingQueue等等,他们是在同一个jvm进程中通信。他们主要是应用中的线程通信方式。

另外一类是分布式消息队列,比如常见的有Kafka,RibbitMQ,RocketMQ,ActiveMQ等等,他们主要是为不同的应用之间的通信。

由于在互联网的分布式应用部署环境下,分布式消息队列应用非常广泛,因此本文将讨论分布式消息队列的话题。

二、消息队列的组成

总共有三种角色:

1、生产者:负责发送消息到消息服务器

2、消息服务器broker:负责存储消息和分发消息,在分布式消息队列中一般命名为broker

3、消费者:接收消息服务器分发的消息,处理消息

三、消息队列模式

1、点对点模式,这种模式规定一条消息只能被一个消费者消费。

2、发布订阅模式,这种模式规定一条消息可以被多个消费者订阅消费。

四、消息队列的基础功能有哪些?

1、生产者发送消息

2、消息服务端消息存储与转发消息

3、消息消费者拉取或接收消息并消费处理消息

总的来说,生产者和消费者实现了异步通信,进行数据单向的传递,生产者向消费者端发送数据。 

五、消息队列高级的功能有哪些?

1、消息服务器的高可用,横向扩展能力

2、消息高吞吐量,存储堆积消息能力

3、消息发送和消费消息重试机制

4、延迟或定时消息功能

5、顺序消息支持

6、事务型消息功能

7、多消息协议的支持,常见的消息协议如JMS(Java Message Service),AMQP(Advanced Message Queuing Protocol),MQTT(The Standard for IoT Messaging)

8、客户端多语言支持

9、消息过滤机制

10、消息回溯,按时间或者偏移量查找消息

11、管理台可视化管理支持

六、使用消息队列在业务开发中可以解决哪些问题?

1、系统之间异步通信,生产者发送消息不需要等待消费者消费消息的完成。

2、系统之间解耦,这里可以拿注册功能送积分的例子来说明,注册完整后只要发送一条消息到消息队列,积分服务消费该条注册消息来进行积分赠送,实现注册服务和积分服务的解耦。

3、流量削峰,主要是用来解决大流量请求击垮后台服务的问题,通过消息的先进先出特性和消息堆积能力,实现大流量承接。我工作中发票采集服务就使用这个功能来解决高峰期发票量大的问题。通过rocketmq来接收并存储大量发票消息,而发票数据的解析,持久化存储就开启消费者来消费。

4、消息广播功能,比如发票服务接收到新发票数据,需要通知到不同的业务服务,只要业务服务增加消费者就可以了,不需要修改生产者的功能。 

七、消息队列的功能实现技术

1、通信框架,比如消息发送者和消费者都需要和消息服务器通信,常见的有基于事件驱动的netty异步通信框架进行实现。

2、编解码器,消息的发送过程中,消息内容涉及到编码,消费者消费消息前需要对消息进行解码,常见的有json序列化,protobuf序列化,hessain序列化。

3、消息持久化存储,可以基于数据库,文件来存储,

4、消息查询,需要用到索引和内存池,类似于mysql的innodb里的bufferpool,查询消息时减少io,借助操作系统的零拷贝技术,提升性能。

5、数据刷盘,使用线程池技术并行处理,比如发送消息场景,数据刷盘是比较耗时的操作,利用多线程异步刷盘,充分利用硬件资源,提升消息系统的吞吐量。 

八、总结

本文介绍了分布式消息队列的基础概念,后续的文章将以RocketMQ为例,分析RocketMQ消息队列功能的细节,更加深入的掌握消息队列

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论