介绍)
这次的内容其实与上篇学习的内容正好是相对的,之前的各种通讯方式其实说的都是直接通讯,而这次我学习的内容是间接通讯,二者的本质区别在于间接通讯把时间和空间进行了分离,直接通讯在这2点上都进行了耦合,有点事操作直接简单,但是缺点也是非常明显的,扩展性差,不能很好的面对变化。根据空间和时间2个维点,可以有4种不同的类型的通信方式,时间的分离是这样的形式:消息的本质在传送的过程中有一定的生存时间,并不要求一定要实时的去接受。空间的分离是这样的形式:消息的发送不需要去知道接受者是谁,就是说无须知道接受者的标识。下面将会说到的Message Queue恰好符号了这2点要求。下面将会列举出几个主要的间接通信的方式。
组通信)
1.组通信的含义正如其字面上的意思,消息将会传达到组内的每个成员。组通信可以用在一些场景上1,.用于副本的更新,在容错的方面上。2.用于系统的监视和管理。
2.组通信非常类似于之前提过的多播传送。
3.组通信分为closed group(封闭组),open group(开发组) ,前者是只用于组内部的组间信息传递,而open group是可以与外界进程进行信息传播的。
4.组通信的主要有2个,一个是可靠性,还有一个是有序性。在组通信中,有序性的问题有下列3种方法:(1).FIFO先进先出,如果哪个进程先于其他进程发送消息了,那么在之后的整个过程中都保持这样的顺序。2.causal ordering,因果有序性,在整个分布式系统中,按照消息的先后顺序排。3.Total Ordering,在单个process里比较。
5.组间关系的管理有后面的几个内容:1.组间关系的改变的接口操作。2.组通信中失败的监测。3.组间关系改变的通知。4.通信时由组标识到具体的地址的扩展服务。
6.组通信目前还是更加适用于小规模的系统,在大型的系统中的操作性能还不是太好。
7.JGroup是一个现成的学习组通信的很好的例子,基于channel表现的通信方式。
发布---订阅系统)
发布订阅系统是一种用的非常广泛的间接通信的方式。他是一种基于事件的实现了时间和空间上的解耦分离。
1.发布订阅系统的实现的应用类型有:1.金融信息系统。2.要求实时性数据的应用,比如RSS。2.参与者被通知兴趣爱好的事件。3.监视应用类型,比如网络状况的监视。
2.金融系统是一种很好的展示了发布-订阅模式的一个例子,信息提供者不定时将信息提供给发布者,发布者即时将信息实时的进行显示,不同的关注者只会看到自己感兴趣的某某价格的变化等等。
3.在发布订阅模式中,他的订阅模式有不少的分类,平常我们说的兴趣点太笼统了,主要有:1.基于channel通道的。2.基于topic话题的,其实就是兴趣点。3.基于内容的,这个比较高级,需要系统进行智能的判断,根据关键字判断到底是否需要订阅某某事件。4.基于类型的订阅模型。与2类似。
4.发布订阅系统的实现方式是怎样的呢?在中间会有个broker中节点,所以的中节点其实在负责着事件的过滤功能,系统比较小的时候也许不会有什么问题,但是系统大了会有单点瓶颈的问题,所以演变成了一个中节点网络的方式,其实就是一个集群的形式。
5.在事件发往接受的途中,这里还有许多路由的算法,最简单直接的就是泛洪flooding的方式,向每一个接受者发过去,谁真正需要的谁就去接受,但是往往不怎么好用,造成了大量的不必要的网络开销。还有一些比如filter过滤法等都会第一种好。
消息队列)
消息队列通过队列这个载体实现了点对点的服务。目前开源的这种消息还是很多的,比如Apache ActiveMq,IBM 的Websphere MQ,还有JMS java消息服务等等。
1.消息队列的程序模型可以有3种,1阻塞的接收模式。2.非阻塞的接收模式。3.主动通知的模式。每个消息都会有一个目标的唯一标示。
2,.消息的的实现中用到了一个或者多个队列管理器负责管理多个消息队列。在WebSphere中还实现了消息队里管理器的集群化。
3.java 消息服务就作为你一个学习的例子包含了发布订阅模式和消息队列的2种方式的间接通信,但是他在这里多出了2个概念,1个是连接,1个是session会话。所以实现的步骤分为先创建连接,二是从连接中 创建会话,最后根据会话发布或者接受消息。
共享内存的方法)
这里要纠正一下,这里提到的共享内存绝非是共享计算机中上的物理内存,而是指的是一种内容空间。这里要以DSM,分布式共享内存和Tuple space Coummunication,元组空间通信。
1.DSM,全称Distributed System Memory,分布式共享内存,其实更应该被翻译成分布式共享数据。在远端的分布式共享内存中一一的映射了对于各个pc上的物理内存到的数据。
2.在DSM上你可以读取到别的机子上的数据。
3.在普通的消息传递服务于DSM相比有许多不同的地方,前者在并发的数据操作中是采用了额外的锁服务的形式,而DSM是采用了更加原生态的锁和信息量机制,更直接,因为他是受底层的直接支持的。
4.而Tuple Space元组空间则能更好的让我理解什么是数据共享空间。所有的数据保存在共有的空间内,你可以有read读操作,write写操作,还有take移除操作,他是没有modify修改操作,值能通过先移除,在添加一个新的实现了另类的"修改"效果,更应该说这是一种replace替换的作用。
5.元组空间很好的诠释了什么叫做时间和空间的完全分离:1.任何元组都可能被传送给潜在的一个或多个接受者,这是空间分离的一种表现。2.任何一个元组数据将会一直存在于空间中直到被移除掉,这是空间分离的一种表现。
6.在元组空间里为了容错的实现,在新的模型中里面存在了许多的副本,因为这又造成了并发的问题,所以这里提供几个策略针对读,写,取3种分别有不同的策略;1.读操作一直阻塞,直到第一个副本的回应当做结果返回给请求者。2,.写操作可以直接被所有副本立马执行,因为不用有结果。3.取操作最麻烦,一直阻塞,直到收到了所有副本的移除成功的回复。
7.元组空间通信的一个很好的例子就是JavaSpaces,也有read,write,take 3个相应的方法存在,里面还定义了阻塞模式和非阻塞的读取模式的API。
总结)
学习完间接通信的组通信,发布订阅模式,消息队列,DSM分布式共享内存,Tuple Spaces元组空间,在结合之前学习的直接通信的方式,对于整个分布式系统的轮廓的确清楚了很多。
参考文献:<<Distributed Sysytems Concepts And Design>>原版第五版,author:George Coulouris,Jean Dollimore, Tim Kindberg,Gordon Blair