分布式系统学习(五)——组通信、发送-订阅、消息队列、元组空间

间接通信 是在分布式系统中,实体通过中介者进行通信,借助中介者,实现时间或空间解耦。
时间维度:发送方和接收方是否需要在同一生命周期(与异步通信的差别)。
空间维度:发送方和接收方是否需要知道对方的(IP)地址。

时间耦合 时间解耦
空间耦合 发送方与接收者直接通信,双方同时在线。例:消息传递、RPC 发送方与接收者直接通信,双方可有各自的生命周期。例:邮件发送
空间解耦 发送方无需知道接收者的身份,但双方需同时在线。例:IP组播 发送方无需知道接收者身份,且双方都有各自的生命周期。例:消息队列等

组通信

网络系统中,一个相互作用的进程集合成为组。一个发送进程在一次操作中将一个消息发送给组内其他进程的通信,称为组通信。组内每个成员都是平等的。进程可以加入或离开组。
组通信是对组播通信的抽象,可以通过IP组播或者对等网络实现。

组播通信类型
  • 按照组播通信的实体,可划分为:
    进程组:组播通信的实体是进程,这种通信方式较为低级,例如使用socket的IP组播通信;
    对象组:组播通信的实体是对象,这些实体可以并发的处理统一组调用。
  • 按照组外通信实体是否能发送消息给组,可划分为:开放组和封闭组。
  • 按照通信实体是否只属于一个组,可分为:非重叠组和重叠组。
  • 按照通信时序可分为:异步系统和同步系统。
    单播、多播、广播
可靠性组播

对消息可靠性的保障:完整性、有效性、agreement
对消息相对顺序的保障,提供含有以下一个或多个特性的有序组播:

  • FIFO序(源序)
    来自同一发送者的消息A和消息B,他们在组内传递的顺序与发送者发送的顺序一致。但是不会保障来自不同组成员的消息传递顺序。
  • 因果序(Causal Order)
    在分布式系统中一个消息()在另一个消息()之前发送,那么传递相关消息到所有进程时,这种因果关系将被保留。此处不考虑消息的源,同时没有因果关系的消息在组内传递是无序的。
  • 全序 ( Total Order)
    如果一个进程中,一个消息在另一个之前被传递,那么在所有进程中,两个消息都保持相同的顺序。
    浅谈高可用系统中的组通信的研究和实现
组成员管理

组成员管理服务主要有以下四个任务

  • 提供组成员改变的接口,包括:创建和删除进程组、增加和删除组成员等。
  • 故障检测。使用检测器,将存在崩溃或不可到达的进程标记为可疑组成员,由管理服务决策是否去除可疑组成员。
  • 通知各成员组内变动
  • 扩展组地址。服务通过控制组地址扩展来协调成员改变时的组播传递。当成员组播消息时,管理服务会提供一个组标识(而不是组内其他成员的地址),由服务将该标识扩展为要传递的当前组成员。

应用:基于Socket的组播通讯

发布-订阅系统

发布-订阅系统是基于事件的分布式系统。区别于请求-应答交互模型,发布-订阅系统的建模是由事件提供的解耦和反应式交互模型。发布-订阅系统的任务是把订阅与发布的事件相匹配,保证事件通知的正确性传递。

发布-订阅系统的特征
  • 异构性:发布者和订阅者无需可互操作。
  • 异步性:事件的通知是由事件的发布者异步地发送到所有对事件感兴趣的订阅者处,发布者和订阅者需要解耦。
编程模型

发布-订阅系统中包含的基本操作:
public——发布操作
subscribe ——订阅操作
unsubscribe ——取消订阅操作
notify ——传递事件操作
advertise ——声明即将发生事件的特性(广告)
unadvertise ——取消广告

发布-订阅系统常见模型:
  • 基于渠道: 发布者发布事件到命名的渠道,订阅者订阅其中一个已命名的渠道,并接收所有发送到该渠道的事件。
  • 基于主题:假定每个通知都包含不同主题的域,订阅者可对感兴趣的域进行订阅。
  • 基于内容:是基于内容的一般化,使用事件属性值的约束组合定义订阅查询。
  • 基于类型:订阅根据事件类型来定义,匹配根据给定的过滤器的类型或是子类型来定义。该模型通常是基于对象的方法中,根据对象指定的类型进行筛选。
  • 基于概念:过滤器根据事件的语义和语法进行表述,其中对包含语义上下文的数据项进行翻译,得到不同的数据结构,并通知相关的订阅者。

应用:基于主题的发布-订阅消息中间件 Kafka!!!

消息队列

消息队列是通过队列作为中间件提供点对点的服务,实现发送方和接收方间的空间和时间解耦。

编程模型

生产者进程发送消息到特定队列,其他消费者进程从该队列中接收消息。接收方式有:

  • 阻塞接收: 保持阻塞直到有合适的消息可用为止;
  • 非阻塞接收(轮询操作):检查队列的状态,返回可用消息,或者不可用指示;
  • 通知操作:当在相关的队列有一条消息可用时,会发出一个事件通知。

消息队列的特性之一是消息是持久的。消息队列会存储消息至磁盘中,并保留直到消费端返回ACK。
应用:RabbitMQ中文、 Rabbit官网

元组空间

元组空间是可以通过内容模式匹配的内存空间。元组是由一个或者多个带类型的数据域组成,如<“fred”,1958>、<1,12,“Tom”>

编程模型

进程通过元组空间进行通信,其作为一种通信工具,需要实现read、write、take三种语义。
对于分布式元组空间(元组空间被拷贝到多个节点),三个操作的功能分别为:
(1) read:

  • 向分布式节点中所有成员组播read请求;
  • 接收到该请求后,一个成员将一个匹配的元组返回给请求者;
  • 请求者受到第一个匹配的元组后,作为操作结果返回;
  • 重复第一步,直到收到至少一个响应。(阻塞直到收到第一个副本响应为止)

(2) write

  • 向分布式节点中所有成员组播write请求;
  • 接收到该请求后,所有节点将元组插入到他们的副本中,并确认该动作;
  • 重复第一步,收到所有节点的确认。

(3) take

阶段1:选择要删除的元组

  • 向分布式节点中所有成员组播take请求;
  • 每个节点收到请求后,每个副本请求相关元组集合上的锁,如果不能获得锁,那么该take请求被拒绝;
  • 重复第一步,直到所有节点接受请求并用它们的元组集合响应而且交集是非空的;
  • 选中一个元组作为操作的结果;
  • 如果只有少量成员接受了请求,所有节点要求释放锁,并重复第一步。(阻塞直到第一阶段完成)

阶段2:删除选中的元组

  • 向分布式节点中所有成员组播remove请求,并在请求中引用这个要删除的元组;
  • 接到该请求后,成员从它们的副本中删除元组,发送确认,并释放锁;
  • 重复第一步,直到收到所有的确认。

你可能感兴趣的:(分布式)