project1_ MQ
文章平均质量分 95
基于RabbitMQ自我实现的 MQ
zhenzhizz`
这个作者很懒,什么都没留下…
展开
-
浅谈如何自我实现一个消息队列服务器(8)——编写客户端部分
6.2、如果响应是针对请求的响应,此时就将响应的payload解析出来,变成 BasicReturns ,根据 BasicReturns 里面的 channelId 在 channelMap里查询对应的 Channel 对象,如果 Channel 对象不存在,说明当前响应对应的客户端并不存在,直接抛异常,如果不为空,就将当前响应存入记录服务器返回响应的哈希表basicReturnsMap里,使用方法 putReturns(basicReturns)处理。(2)、服务器推送给客户端(订阅者)的消息。原创 2024-05-11 17:16:15 · 1002 阅读 · 2 评论 -
浅谈如何自我实现一个消息队列服务器(7)——编写服务器部分
再次拿出这张图,前面我们已经将重要概念:VirtualHost、exchange、msgQueue、message、binding 都实现了,此时就可以开始编写消息队列MQ的本体:BrokerServer (服务器),由于消息队列的服务器是一个基于 TCP 协议进行通信的服务器,因此消息队列的 BrokerServer 也叫做 TCP服务器。构造响应对象,设置好响应对象中的值,然后打印 rid、channelId、响应 type、响应 length。方便后续判断当前是哪个连接,连接中的哪一对请求、响应。原创 2024-05-10 17:13:48 · 1033 阅读 · 0 评论 -
浅谈如何自我实现一个消息队列服务器(6)—— 网络通信设计
既然是进行网络通信,那必然既会有 请求,也会有 响应。此处我为了简化项目代码,便将请求、响应 的协议格式设成一致。请求格式:响应格式:接下来来简述一下请求、响应里的3部分,分别是什么意思。type:描述当前 请求 和 响应 分别是干什么的。原创 2024-04-23 18:46:47 · 1015 阅读 · 0 评论 -
浅谈如何自我实现一个消息队列服务器(5)—— 实现9个核心API中的basicComsume()
1)、自定义一个接口。2)、该接口中只能含有1个方法。3)、该接口必须添加注解 @FunctionInteface 后才能使用此时,我们在 common 包下创建一个 Comsumer 接口,作为我们的 回调方法,同时 Comsumer 回调接口中定义一个 handleDelivery()用来消费消息。原创 2024-04-10 23:29:28 · 779 阅读 · 0 评论 -
浅谈如何自我实现一个消息队列服务器(4)—— broker server部分使用virtualHost进行整合
因为不同的交换机类型,其转发消息到队列中的转发规则不一样。5)、(获取到队列名之后,查看当前队列是否存在,存在,就构造一个消息对象,再判定一下该消息是否存在,不存在,抛异常,存在,下一步。2)、如果不存在,先对bindingKey进行合法性校验,如果bindingKey不存在,抛异常,如果bindingKey合法,创建Binding对象,然后再判定一下Exchange和MSGQueue是否都存在,如果其一不存在,都需要抛异常,如果存在,3)、判定交换机、队列是否都是持久化,是的话就写硬盘,然后再写内存。原创 2024-04-03 08:51:18 · 694 阅读 · 0 评论 -
浅谈如何自我实现一个消息队列服务器(3)—— 细节分析
在 broker server 运行的过程中,会收到很多消息并进行存储,如果 broker server 重启了,我们就期望将硬盘中之前保存的消息数据还原到内存中,方便 broker server 高效读取数据。咱们这个删除消息的方法中,也必须包含删除哪个队列中的哪个消息这两个重要参数,传入的消息对象参数必须是包含有效的 offsetBeg、offsetEnd 因为后续读取文件中的消息时,需要使用 offsetEnd - offsetBeg 作为 字节数组的容量,表示读取这样大小的消息数据到字节数组中。原创 2024-03-26 23:06:17 · 693 阅读 · 0 评论 -
浅谈如何自我实现一个消息队列服务器(1)——需求分析
消息队列是将阻塞队列这样的数据结构,单独提取成一个程序,独立部署在一组服务器上。但阻塞队列是在一个进程内部进行的,而消息队列是在进程与进程(服务与服务)之间进行的。如果有同学不知道什么是阻塞队列,点击我前面写的博客多线程的典型例子——阻塞队列进行查漏补缺。1、需要实现 生产者、消费者、broker server 三个部分。2、针对生产者(producer client)和消费者(consumer client)来说,主要编写的是 客户端(client)和服务器(server) 进行网络通信的部分。原创 2024-03-13 17:04:49 · 1244 阅读 · 0 评论 -
浅谈如何自我实现一个消息队列服务器(2)——实现 broker server 服务器
由于在对象中的arguments它的数据类型是Map类型,此时对象中提供的getArguments()方法,其返回值类型是Map类型,当数据库调用这个getter方法时,数据库获取到的是一个Map类型的arguments,由于arguments在数据库中的存储类型是字符串,因此此时数据类型不匹配,获取到的Map类型的arguments无法存入数据库,就会出错。使用逻辑删除衍生出来一个问题:要知道,逻辑删除只是一种标记手段,不是真正的删除,此时就会造成文件越来越大,但是实际里面的有效内容很少。原创 2024-03-18 22:43:56 · 1090 阅读 · 0 评论