单一世界架构初探之主动模式

主动模式在大型服务系统中,是完全必须的。在设计模式中,有个监听模式可以概括这种情况,而不完全如此。在监听模式中,往往需要先往目标注册,然后 根据目标的状态变化,由目标通知监听者。但在这里,监听者却并不知道需要监听哪些东西。也就是说监听者和被监听者之间往往没有固定和必然的联系。

我 们可以想象,当一个人进入白骨荒野,这是个眼界很开阔的地图,对于你的进入,已经在白骨荒野的人应该可以看到你的存在,而事实上,他们并不会向你注册他是 否监听你,你也不需要监听他的存在。之所以我们举这个例子,是因为白骨荒野比较大。任何一个进入这个地区的人来说,他不可能知道所有在这个地区的人,注册 就无从说起了。

这是个很矛盾的事情,因为对于你和一个你并不知道的人来说,你们两个的关系并不是由你们自己决定的,而是由你们同处于一个视野这个事实决定的。因此我们需要一个管理器,负责模拟生成客观世界需要生成的事实,就像进入视野这种事情。我们在前面的讨论过程,有个很重要的原则,就是减少关联性,比如N个实体之间,关联性将为(N-1)^2,如果存在一个管理器,那么实体之间只有N个关联。

我们假设白骨荒野有个事件管理器,那么当所有进入白骨荒野的人,都会向管理器注册,由管理器判断并且产生事件。我感觉这个模式有些问题,但还没有仔细研究。从理论上来说,应该具有很好的优点,很简单,这种方式减少了关联度,必然减少由此引起的计算量,可同样会导致复杂度。

我们在前面讨论过数据抽象的事情,试图将所有的实体抽象并表格化,同时还会每个字段绑定一个函数,这个函数可能会被外界驱动,比如客户端的键盘操作。当一个角色行走时,那么行走函数会被调用,新的坐标可以通过这个函数通知给管理器,这种方法让我们在很高的实时性以及很小的粒度上获取主动性。

管理器的存在是个很麻烦的事情,因为他具备全局属性,给我们试图将所有局部化的理论带来很大的颠覆,同样的,管理器为我们提供方便的主动模式。

考虑暴风城和闪金镇2个分区,我们无法假设他们具备同一个管理器,因为这样会导致我们必须假设西部荒野也使用这个管理器,以致于整个世界都是用相同的管理器。为了更变态一点,我们将白骨荒野切割成2个分区AB,在分区的边缘各站1个人P1/P2,显然,管理器模式无法解决这种情况,因为一个分区的管理器无法知道另外一个分区的信息。P1就站在P2面前,却不知道P2在转身,显然很荒谬。

这里有2个方案,方案1是让分区管理器将某些事件向周围进行广播,需要广播哪些事件,由分区管理器决定,这个方案使得管理器是扁平的,但可能导致广播风暴。

方案2是在分区管理器之上,建立一个公共的父管理器,由父管理器负责决定向哪些分区发播哪些事件。这个方案可以降低事件广播的量,但管理器就比较多,呈树状结构。个人感觉方案2更具竞争力,可以更多架构上的好处。

相关文章

什么是设计模式一套被反复使用、多数人知晓的、经过分类编目...
单一职责原则定义(Single Responsibility Principle,SRP)...
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强...
适配器模式将一个类的接口转换成客户期望的另一个接口,使得...
策略模式定义了一系列算法族,并封装在类中,它们之间可以互...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,...