文章目录
一、使用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加上虚拟主机名进行区分。此时我们就约定,在