# 发消息啦 **Repository Path**: glser-oioi/send-a-message ## Basic Information - **Project Name**: 发消息啦 - **Description**: 本项目为消息队列的实现,从0-1的自主实现 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-11-22 - **Last Updated**: 2024-01-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 发消息啦 #### 基本介绍 目前中间件的使用已经越来越流行,比如Redis,RabbitMQ等,这里主要要介绍的就是消息队列,并以RabbitMQ为蓝本使用Java从0-1实现一个消息队列。这里参考了RabbitMQ的接口设计,使用Java进行实现。 #### 项目整体思路 ![输入图片说明](mq/image.png) #### 项目具体设计 - **生产者(Producer)** 生产消息 - **发布(Publish)** 调用这个接口推送消息 - **中间人(BrokerServer)** 服务器用于存储和转发消息 - **订阅(Subscribe)** 订阅消息 - **消费者(Consumer)** 消费队列中的消息 ![输入图片说明](mq/image2.png) #### BrokerServer服务器设计 - **虚拟机(VirtualHost)** 逻辑上的隔离,一个服务器有多个虚拟机,他们互不干涉。用这个类进一步封装交换机、队列、绑定相关的类。 - **交换机(Exchange)** 生产者将消息发送到BrokerServer的Exchange中,通过不同的匹配规则,将消息发送给不同的队列 - **队列(Queue)** 用来存储和推送消息 - **绑定关系(Binding)** 交换机和队列可以有多种绑定关系(多对多):Direct、Fanout、Topic。 - **消息(Message)** 具体要传输的消息 ![输入图片说明](mq/image3.png) #### 交换机模块 ![输入图片说明](mq/image5.png) #### 队列模块 ![输入图片说明](mq/image6.png) #### 绑定模块 ![输入图片说明](mq/image7.png) #### 消息模块 ![输入图片说明](mq/image8.png) #### 持久化模块 ![输入图片说明](mq/image9.png) #### 内存模块 ![输入图片说明](mq/image10.png) #### 客户端模块 ![输入图片说明](mq/image11.png) #### 公共模块 ![输入图片说明](mq/image12.png) 在通信协议的设计上采取一个字节的数字来表示不同的请求/响应的内容 #### 通信协议是自定义的,基于TCP协议自定义应用层协议 ![输入图片说明](mq/image13.png) ![输入图片说明](mq/image14.png) 其中type是请求和响应的类型,每个类型对应一种功能。length对应的是消息体的长度,payload对应的整个消息内容 ![输入图片说明](mq/image21.png) #### 项目效果 首先启动服务器 ![输入图片说明](mq/image15.png) 编写生产者发送消息 ![输入图片说明](mq/image16.png) 编写消费者订阅消息 ![输入图片说明](mq/image19.png) 更多详情请参考 https://www.yuque.com/endeavor-4qufs/ul0gmq/gc3700rscmrs6ds8?singleDoc#