浅谈如何自我实现一个消息队列服务器(4)—— broker server部分使用virtualHost进行整合

一、使用VirtualHost类整合broker server 中的数据

在前面的博客中,我们已经了解到 broker server 想要进行不同逻辑业务上的区分,就是用 VirtualHost(虚拟主机)将数据进行逻辑上的区分。因此此时我们就需要使用 VirtualHost 对咱们 broker server 上的重要概念:交换机、队列、绑定、消息 进行 管理。每个VirtualHost 可把咱们的exchange、queue、binding、message 彼此间隔开来,互不干扰。

故在VirtualHost中,我们需要提供9 个核心API对 broker server 里的数据进行整合,同时也给上层调用者进行调用。 这些核心API会将硬盘、内存中的数据串起来。

1、exchangeDeclare() 创建交换机
2、exchangeDelete() 删除交换机
3、queueDeclare() 创建队列
4、queueDelete() 删除队列
5、queueBind() 创建绑定
6、queueUnbind() 删除绑定
7、basicPublish() 发布消息
8、basicConsume() 订阅消息
9、basicAck() 确认应答

再拿出这张图:
在这里插入图片描述
这张图非常重要,能看懂这张图,起码对这个项目已经有了一定的系统了解。

1.2 虚拟主机的设计

首先来了解一下虚拟主机的设计,在VirtualHost类里,我们定义5个成员变量,分别是 private String virtualHostName,以及前面定义过的 DiskDataCenter类,MemoryDataCenter类,Router类、consumerManager类。以及对VirtualHost的初始化,以及9个API。

在这里插入图片描述

注意,这里有一个问题:VirtualHost 用来管理 交换机、队列、消息、绑定 这些数据。那么 VirtualHost 与 这些数据的 从属关系 如何表示呢?? 很显然是一对多的关系,一个VirtualHost里可以有多个 交换机、队列、消息、绑定。但是该怎么表示他们之间的关系呢?

以交换机为例:如果 在 VirtualHost1 中有一个交换机1,那么VirtualHost2 中还能有一个 交换机1 吗??理论上来说,完全可以!因为不同的VirtualHost里的数据是互不干扰,相互隔开的。但是问题来了,在我们代码的设定中,我们使用了交换机名字作为交换机的唯一身份标识(name是主键),也就是说,当交换机1已经存在 VirtualHost1中时,交换机1已经不能插入VirtualHost2了,一插入就会报错。那此时该怎么解决这个问题呢?

我们有两个方案解决此类问题:
1、参考数据库设计,一对多的方案,譬如给交换机添加一个属性,虚拟主机id/name…
2、重新约定,exchangeName = virtualHostName + exchangeName

由于方案1需要对前面的代码进行改动,实现起来比较复杂,因此在项目中我们使用方案2,实现起来简单快捷,同时也不会对前面实现的代码产生其他影响。

交换机名 = 虚拟主机名+交换机名,此时同一个交换机就可以存储在多个虚拟主机上了,同时还能够一眼区分此时的交换机是在哪个虚拟机里。同理像队列、绑定,我们也可以在其name加上虚拟主机名进行区分。此时我们就约定,在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值