Java项目--仿RabbitMQ的消息队列--需求分析

目录

一、引言

二、需求分析

三、核心API

一、交换机类型

二、持久化

三、网络通信

(1)Connection和Channel的作用:

(2)消息应答

四、模块划分

五、小结


一、引言

我们之前了解过阻塞队列(BlockingQueue),其最大的用途就是用来实现生产者消费者模型,便于我们解耦合和削峰填谷。

但在分布式系统中,我们通常会把阻塞队列封装成一个独立的服务器程序,这样的程序我们叫做消息队列(Message Queue)

常见的消息队列有

RabbitMQ

Kafka

RocketMQ等。所以本次Java项目,我们就仿照RabbitMQ进行一个模拟消息队列的实现。

二、需求分析

|---------------|
| 核心概念 |
| 生产者(producer) |
| 消费者(consumer) |
| 中间人(broker) |
| 发布(publish) |
| 订阅(Subscribe) |

其中,broker是最核心的部分,负责消息的存储和转发

在Broker中有存在以下概念:

|-------------------|
| 虚拟机(VirtualHost) |
| 交换机(ExchangeName) |
| 队列(Queue) |
| 绑定(Binding) |
| 消息(Message) |

Exchange和Queue是多对多的关系,一个Exchange可以绑定多个Queue,一个Queue也可以被多个Exchange绑定。

内存存储:方便使用

硬盘存储:不易丢失

三、核心API

1.创建队列(queueDeclare)

2.销毁队列(queueDelete)

3.创建交换机(exchangeDeclare)

4.销毁交换机(exchangeDelete)

5.创建绑定(queueBind)

6.销毁绑定(queueUnBind)

7.发布消息(basicPublish)、

8.订阅消息(basicConsume)

9.消息确认(basicAck)

一、交换机类型

1.Direct(直接交换机):⽣产者发送消息时, 直接指定被该交换机绑定的队列名

2.Fanout(fanout交换机):⽣产者发送的消息会被复制到该交换机的所有队列中

3.Topic(主题交换机):绑定队列到交换机上时, 指定⼀个字符串为bindingKey,发送消息指定一个字符串为routingKey,当routingKey和bindingKey满足一定的匹配条件时,才将消息投递到该队列。

二、持久化

Exchange,Queue,Binding,Message都有持久化需求

当程序重启/主机重启,保证上述内容不丢失。

三、网络通信

⽣产者和消费者都是客⼾端程序, broker 则是作为服务器. 通过⽹络进⾏通信.

在⽹络通信的过程中, 客⼾端部分要提供对应的 api, 来实现对服务器的操作.

1.创建Connection

2.关闭Connection

3.创建Channel

4.关闭Channel

5.创建队列

6.销毁队列

7.创建交换机

8.销毁交换机

9.创建绑定

10.解除绑定

11.发布消息

12.订阅消息

13.确认消息

(1)Connection和Channel的作用:

Connection 对应⼀个 TCP 连接. Channel 则是 Connection 中的逻辑通道. ⼀个 Connection 中可以包含多个 Channel. Channel 和 Channel 之间的数据是独⽴的. 不会相互⼲扰. 这样的设定主要是为了能够更好的复⽤ TCP 连接, 达到⻓连接的效果, 避免频繁的创建关闭 TCP 连接.

(2)消息应答

⾃动应答: 消费者只要消费了消息, 就算应答完毕了. Broker 直接删除这个消息。

⼿动应答: 消费者⼿动调⽤应答接⼝, Broker 收到应答请求之后, 才真正删除这个消息。

四、模块划分

可以看到, 像 交换机, 队列, 绑定, 消息, 这⼏个核⼼概念在内存和硬盘中都是存储了的。

其中内存为主, 是⽤来实现消息转发的关键; 硬盘为辅, 主要是保证服务器重启之后, 之前的信息都可以正常保持。

五、小结

以上就是Java项目--模拟消息队列的需求分析,接下来的文章我们就将在IDEA上实际写代码了。感谢大家观看!

相关推荐
weixin_399380691 分钟前
TongWeb7.0.4.9M11如何接入到idea(by lqw)
java·ide·intellij-idea
paopaokaka_luck13 分钟前
社区服务平台(加权协同过滤推荐、Jieba中文词频分析、WebSocket实时聊天、求助处理闭环、 活动积分闭环、ECharts多维分析)
java·前端·spring boot·mysql·echarts·mybatis
.Bryce.20 分钟前
T2-LLM评测不等于Agent评测
android·java·人工智能·后端·gpt·agent·1024程序员节
Wang's Blog21 分钟前
Java 项目实战: 交友项目 - 用户体系集成:查询用户环信账号密码
java·交友
Wang's Blog33 分钟前
Java 项目实战: 交友项目 - 发布评论
java·开发语言·交友
qq_364682151 小时前
录音APP怎么切换语言?多语言版本如何使用
java·服务器·前端
Wang's Blog1 小时前
Java 项目实战: 交友项目 - 用户体系集成:根据环信id查询用户详情
java·lua·交友
摇滚侠1 小时前
《On Java 中文版 基础卷》阅读笔记 复用 13
java·笔记·python
2601_968900771 小时前
玻璃深加工的工艺窗口:4 道工序的温度与时间参数边界
android·java·javascript
薛之谦_1 小时前
用 Java 实现阿里云式 IAM 子用户管理:架构设计与表结构详解
java·python·阿里云