一种分布式框架设计(四)

我们设计的分布式系统,在正常工作时呈现出网状。服务有层次性,客户的请求会逐步经历各层服务进行处理,当遍历完所有服务后才会完成一次请求。每层服务会有若干台机器,上游节点的机器可以把输出结果传递到下游节点的任意一台机器上。

当服务所依赖的数据需要更新时,我们需要做好同步工作,并保证在数据更新过程中服务是可用的。这儿介绍两类更新的操作方式,它们都需要用到zookeeper来实现。

第一类更新只局限于一个服务的所有机器。我们需要给它们的更新设定一个顺序,避免出现该服务所有机器同时更新这种极端情况。Zookeeper鼓励使用异步的api进行编程,在实现过程中至少有两种方式来实现这种分布式锁。第一种是试图去创建一个既定的结点,如果成功则表示锁已经拿到,可以开始更新,否则创建观察点,等待别的机器完成更新后释放这个锁(当然仍然可能拿不到);第二种则去创建一个顺序节点(sequence),zookeeper能保证创建节点的唯一性,然后服务只需要监控顺序在自己之前的节点是否完成了更新(释放锁)。当数据量不大时,两种实现方式的性能应该差别不大,数据量大时推荐使用第二种方式,因为它可以降低通知时产生的网络流量。第一种方式在抢锁过程中,网络更快的机器更容易抢到,第二种方式是基于排队机制的。虽然逻辑简单,但实际编程过程中还是会比较麻烦,需要考虑网络传输等问题等。

第二类更新是多个服务中有数据依赖的情况。比如服务A和B,它们均有两台机器a1, a2, b1, b2。初始时的数据时间戳相同,即服务A的数据是da_t1, 服务B的数据是db_t1。如果我们有了新的数据da_t2和db_t2,我们只允许首先同时更新A和B的其中一台机器,如a1, b1;这是更新数据后的服务器也只会把自己的下游数据发送到已经更新数据的下游服务器中去,即由原先的a1和a2都可以把下游数据发送给b1和b2的任意一台,现在a1只能给b1,a2只能给b2。直到a2,
b2均更新为新数据的时候,才能恢复原先的传输方式。具体的实施方式是首先我们需要知道整个数据更新的总服务器的情况, 以数据的名来命名(index),如下: /data/index/A/a1, /data/index/A/a2, /data/index/B/b1,/data/index/B/b2, 一旦时间戳为t2的数据包都准备好了,那么修改节点/data/index的值为t2(可以一级一级的更新,即/data/index/A, /data/index/B的时间戳都修改为t2后,再修改/data/index),并且选取每类服务的若干机器开始更新,即增加/updating/index/A/a1,
/updating/index/B/b1,并赋值为t2。每台服务器会监控自己所属的结点,即a1会监控/updating/index/A/a1,一旦发现该节点出现,就开始进行数据更新,更新完成后会删除自己的所属节点。监控服务一旦发现/updating/index/A/a1, /updating/index/B/b1均被删除了,就会重新赋值/updating/index/A/a2,/updating/index/B/b2。当时间戳为t2的所有数据均完成更新后,对/updated/index进行赋值为t2。但是在实际编程过程中,完全按照上面的描述进行会非常的麻烦,所以我们还是进行了简化,但其逻辑还是得以保证。

至此,对于我设计的分布式框架系统已经介绍完毕。

时间: 2024-10-10 09:53:08

一种分布式框架设计(四)的相关文章

一种分布式框架设计(一)

通常,当服务涉及到的数据量大到一定程度以后,我们会考虑拆分数据.在这种分布式架构中,每个结点只拥有总数据量的其中一部分,而最终的输出结果会汇总所有结点的结果.这种Map-reduce思想的架构,是尽量不去查分程序,而只是拆分数据来支持大数据的处理,如下图所示.这种框架对每个worker结点的可靠性要求比较高,如果某一个worker结点挂掉了,那么最后的输出结果将是不全的. 我设计的这个分布式框架解决的是另一个问题.比如一个程序中含有A, B, C, D四个逻辑,它们在程序中是串行执行的,彼此之间

一种分布式框架设计(三)

本文讨论在分布式框架中使用到的两个数据结构.为了实现高性能,这两个数据结构都是无锁的. 第一个数据结构存储的是客户端发过来的socket.由于我们的框架只有一个线程接受用户的请求,所以很容易对每一个socket创建一个unique number(稍候我们再来看unique number包含了哪些信息).框架中有一个线程专门来做清理工作,同时关闭没有返回给客户端的socket.最后框架中有多个线程去查询所需的socket,由于是根据unique number进行查找,那么它保证了每一个socket

一种分布式框架设计(二)

本篇主要介绍分布式框架的模块和其主要使用的通信方式zmq. 首先,对于任意的上游结点,它都有可能会把处理的结果发送到任意的一台下游结点中,同时如果下游结点有新增的结点,上游结点还能自动感知并处理.另一方面,任意的下游结点也会要和所有的上游结点保持心跳.如果使用原始的socket,解决上述的问题会比较麻烦,所以我们运用了zmq来解决上述的问题.Zmq具有下述的优点:1. 是一个跨协议的通信方式,目前支持inproc, ipc, tcp, tpic, multicast:2. 具有丰富且功能强大的设

游戏UI框架设计(四) : 模态窗体管理

游戏UI框架设计(四) --模态窗体管理 我们在开发UI窗体时,对于"弹出窗体"往往因为需要玩家优先处理弹出小窗体,则要求玩家不能(无法)点击"父窗体",这种窗体就是典型的"模态窗体".在此笔者设计了四种模式类型:完全透明.半透明.低透明度.透明且可以穿透. (透明不能穿透) (半透明不能穿透) (低透明度,不能穿透) 对于"模态窗体"的基本实现原理是: 在弹出窗体的后面增加一层"UI遮罩窗体",当需要弹出

WisDom.Net 框架设计(四)

WisDom.Net  ----用户安全 1.用户单机登录 正如其名这里要求其实就是显示用户只能在一台电脑上登录.防止多处登录,这里简单的说一下实现原理,我们在这里使用session +cookie 的方法来实现  如下图所示 (1) 输入用户名密码 (2) 校验用户名密码格式是否正确 (3) 传入用户名密码 (4) 校验用户密码是否正确,返回登录LoginGuid (5) 用户名密码是否正确 (6) 判断用户在session中是否存在,存在即更新用户LoginGuid,不存在则新增,并在coo

niubi-job:一个分布式的任务调度框架设计原理以及实现

niubi-job的框架设计是非常简单实用的一套设计,去掉了很多其它调度框架中,锦上添花但并非必须的组件,例如MQ消息通讯组件(kafka等).它的框架设计核心思想是,让每一个jar包可以相对之间独立的运行,并且由zk辅助进行集群中任务的调度. 接下来,咱们就一步一步的来看下niubi-job整个的框架设计与实现. 框架设计概述 讲解之前,让我们先来看一张niubi-job的框架设计图.如下: 可以看到,该图的结构非常简单,只有四个部分组成. web控制台:负责发布任务,监控任务的状态信息,上传

分布式事务的四种解决方案

转:https://www.cnblogs.com/mayundalao/p/11798502.html 分布式事务指事务的操作位于不同的节点上,需要保证事务的 AICD 特性. 例如在下单场景下,库存和订单如果不在同一个节点上,就涉及分布式事务. 解决方案 在分布式系统中,要实现分布式事务,无外乎那几种解决方案. 一.两阶段提交(2PC) 两阶段提交(Two-phase Commit,2PC),XA协议的实现,通过引入协调者(Coordinator)来协调参与者的行为,并最终决定这些参与者是否

分布式搭建ssm框架(四)

注意:!!!!!!! 在将之前所有操作完成之前一定要将parent和common先安装进中央仓库(clean install), 之后将业务项目依次安装到中央仓库(clean install), 之后进行web测试( clean tomcat7:run),测试分布式框架是否成功!. 原文地址:https://www.cnblogs.com/mollie-x/p/10306674.html

企业级应用框架(四)我的这个系列到底要说什么

前言 这个系列已经写了三篇,得到了一些朋友的肯定,也收到了一些朋友的反对.在前面的三篇中,我一直至力于编码,很少涉及到理论,因此很多朋友认为我写的东西很肤浅,毫无亮点,或许我的水平真的很有限,辜负了大家的期待.这个系列已经20多天没有更新了,一个是因为时间有点点紧,另一个是因为我现在正在全力的搭建一个案例,然而要搭建起一个能尽量涵盖企业级应用框架方方面面知识的案例并不简单,但是如果没有案例就来写企业级应用框架无异于纸上谈兵.目前我的案例框架尚未完成,还有些东西没有理顺,但是我清楚的知道,我要诠释