消息队列模拟实现
文章平均质量分 82
我不是大叔丶
努力否?反省否?深思否?
展开
-
RabbitMQ 模拟实现【二】:模块划分
虚拟主机:为了便于简单实现,此处只支持一个虚拟主机,但是按道理来讲要有多个虚拟主机,类似于MySQL中的database,整合一系列相关的业务数据。主要实现通过TCP与服务器建立联系,通过远程调用服务器API来实现用户需求。(交换机、队列、绑定、文件)原创 2024-03-14 13:01:32 · 368 阅读 · 0 评论 -
RabbitMQ 模拟实现【六】:程序模拟实现
【代码】RabbitMQ 模拟实现【六】:程序模拟实现。原创 2024-03-14 13:03:12 · 789 阅读 · 0 评论 -
RabbitMQ 模拟实现【五】:网络通信设计
Type 希望客户端能远程调用服务器的核心API,type就是描述调用哪一个API的Length 表示接下来的Payload的长度Payload 是真正需要用到的数据.Type表示请求响应不同功能,取值如下:0x1 创建channel0x2 关闭channel0x3 创建 exchange0x4 销毁 exchange0x5 创建 queue0x6 销毁 queue0x7 创建 binding0x8 销毁 binding0x9 发送 message。原创 2024-03-14 13:02:52 · 989 阅读 · 0 评论 -
RabbitMQ 模拟实现【四】:虚拟主机设计
咱们实现的方法是,使用一个阻塞队列,当生产者发布消息到交换机时,交换机转发消息到对应的队列后,就把队列名当作令牌添加到这个阻塞队列中,再配置一个扫描线程,去时刻扫描这个阻塞队列中是否有新的令牌了,有了新令牌,则根据令牌去对应的队列中,去把新消息安装轮询策略转发给消费者.关于消费者,咱们并不打算持久化存储消费者的信息,即只在内存中存储消费者信息,如果服务器重启后,那么内存中的消费者信息也会清空,此时消费者就需要重新订阅消息.自动应答:将消息发送给消费者就算应答了(不关心消费者收没收到,相当于没应答)原创 2024-03-14 13:02:33 · 1233 阅读 · 0 评论 -
RabbitMQ 模拟实现【三】:存储设计
我们知道在存储时,我们需要保存到文件,而文件只能存储字符串/二进制数据,无法直接存储消息对象,同时通过socket套接字在网络中传输时,也需要转为二进制,因此消息的序列化与反序列化尤为重要。, 因为⼀个完整的 SQLite 数据库,只有⼀个单独的不到1M的可执⾏⽂件,在Java中使用SQLite,不需要额外安装,只需要引入依赖即可,同时采用。上述我们存储在硬盘中的数据,分为了两个,⼀个是存放数据库中,⼀个是存放在⽂件中。消息是依托于队列的,因此存储的时候,就要把 消息 按照 队列 维度展开。原创 2024-03-14 13:02:06 · 984 阅读 · 1 评论 -
RabbitMQ 模拟实现【一】:需求分析
简单理解为一个使用阻塞队列来通信的组件,本质上就是个转发器,包含发消息,存消息,消费消息的过程。此处采用 推 的实现方式:Broker把收到的数据主动发送给订阅的消费者(订阅:哪些消费者要从中间人这里取数据,这个注册的过程,称为“订阅”)结合实际,我们多使用消息队列在分布式系统中,一对一或者一对多的关系无法满足我们服务器对于消息队列的需求,因此以多对多的方式来实现。数据的存储主要有两点需要注意:持久化 + 高效,因此采用 内存 + 硬盘 的方式来存储。交换机类型:用于描述不同的转发规则。原创 2024-03-14 13:01:11 · 827 阅读 · 0 评论