去中心化概念模型与架构设计

去中心化概念模型与架构设计

今天打算写写关于 IM 去中心化涉及的架构模型变化和设计思路,去中心化的概念就是说用户的访问不是集中在一个数据中心,这里的去中心是针对数据中心而言的。

站在这个角度而言,实际上并非所有的业务都能做去中心化设计,对于一致性要求越高的业务去中心化越难做。比如电商领域的库存就是一个对一致性要求很高的业务,不能超卖也不能少卖,这在单中心容易实现,但多中心纯从技术层面感觉无解,可能需要从业务和技术层面一起去做个折衷。

反过来看 IM 的业务场景是非常适合做去中心化设计的,因为其业务场景都是弱一致性需求。打开你的微信或 QQ 仔细观察下,对大部分人来说与你联系最频繁的实际多是在地域上离你最近的人,人与人之间的心理距离和物理距离会随着时间渐趋保持一致。所以根据这个特点,按地域来分布数据中心和聚合人群是比较合适的。

在进入去中心化 IM 架构模型之前,我们先看看中心化架构是怎样的,分析其关键设计再来看如果要去中心化需要做哪些变化?

中心化

IM 的中心化架构并不意味着只有一个数据中心,它也可以是多数据中心的,如下图。

之所以说它是中心化架构,关键特征是其存在共享的数据存储。部署在两个数据中心的应用需要共享访问统一的数据存储,而这种共享访问实际是依赖数据中心之间的专线连通,这样的架构也限制了能选取的数据中心地理位置的距离。而实现去中心架构的关键点就在于规避跨数据中心的共享存储访问,使得应用在其自身数据中心实现访问闭环。

我们这里只分析下实现 IM 消息互通这个最重要场景下共享数据存储里需要存些什么数据呢?一个是用户上线后的「座标」,主要指用户本次在线接入了哪台机器的哪根连接,这个「座标」用于在线消息投递。而另一方面若用户离线时,别人给它发消息,这些消息也需要存储下来,一般称为用户的「离线消息」,下次用户上线就可以自动收取自己的离线消息。

中心化架构实际能做到的极致就是把读实现自有数据中心闭环,而写依然需要向主数据中心所在的存储写入。而 IM 的写入场景还不算是一个低频操作,那么要实现去中心化架构关键点就在如何解决写的问题上。

去中心化

在设计 IM 的去中心化架构之前,希望去实现这个架构并编写代码时,不需要去考虑最终部署到底是去中心的还是中心的。编码时就像开发中心化架构一样去实现场景的功能,而去中心化的能力做为纯基础的技术能力,通过附加的方式来获得,先看看架构图的变化,如下。

这里的变化是为「座标」增加一个「数据中心」纬度,当按通用的方式去本地存储定位用户时,发现一个非本地的座标时消息该怎么投递?这里可以在每个本地数据中心额外添加一个消息网关程序,注册到本地存储中,并负责接收所有非本地座标的消息,这有点像路由网络中的边界网关。

消息网关统一接收应当发往其他数据中心的消息,以实现跨数据中心的消息流转。这里有个疑问是其他数据中心的「座标」是怎么跑到本地来的?离线消息的场景又该如何处理呢?关于这两个问题,就涉及到我们解决跨数据中心同步数据的关键技术了。

关键技术

结合 IM 的业务场景,实际它对同步的延时具有一定的容忍度。所以我觉得基于 Gossip 协议的小道消息传播特性就能很好的满足这个同步场景。

关于 Gossip 我是在新近的 NoSQL 数据库 Cassandra 上听说的,后来 Redis Cluster 也利用了该协议来实现无中心化集群架构。但 Gossip 协议可不是什么新东西,实际关于它的诞生可以追溯到好几十年前的施乐研究中心,就是为了解决数据库同步问题被我们的前前前辈想出来的。

这个协议的灵感来自于办公室小道消息的传播路径,当一个人知道了一条小道消息,他碰到一个朋友并随口告诉了他,朋友又告诉了朋友的朋友,没多久整个办公室都知道了,也就完成了信息的同步。借用这个模型,实际上我们需要同步的信息就是用户的在线「座标」和「离线消息」。

因为 Gossip 自好几十年前已经有很多论文证明并公开发表,而且近年也有 Cassandra 和 Redis 的成功工程实践,所以我就先不用去怀疑其可行性,而是直接利用其结论了。根据其特性,分析 IM 的去中心场景在引入 Gossip 后有些什么可供观察的变化和值得注意的方面。

在一个稍具规模的 IM 场景下,用户总是在上上下下,消息也在不停的在「在线」和「离线」之间变化,所以需要通过 Gossip 同步的信息是时时存在的。所以假设我们在某个时刻去拍一个快照(实际做不到),得到的结果是多个数据中心的数据肯定是不一致的,几乎不存在所谓的全局最终一致性的某一时刻。在这样的客观环境下,对 IM 的业务场景有多大影响?

当用户A在 IDC#1 在线,用户B 在 IDC#2 刚上线,这里存在一个同步时差,那么此时用户A给用户B发消息,在本地没有用户B的座标,所以进入离线消息池。用户B此时不能立刻收到用户A的消息,但离线消息池会在随后通过 Gossip 协议同步到用户B所在的 IDC#2,用户B此时就可以通过离线消息收取用户A的消息。

上面描述了一种临界场景,在这种临界场景下,用户收消息存在延时。而这种临界场景实际上并不是常态,而且 IM 用户实际对这种刚上线的消息延时存在很高的容忍度。这一点我想大家用 QQ 可能体会过,有时一上线都一分钟了,还会收到之前的离线消息,我不知道这是有意的延时还是真有这么长的系统延时。

那么使用 Gossip 协议从理论上来估算下会产生多久的延时?假设我们在全国东西南北中各部署一个数据中心,一共五个。五个数据中心之间无专线,走公网互通,网络延时最大 200 ms。使用 Gossip 完成在五个数据中心的最终一致性同步最大需要多长时间?这里我直接引用 Gossip 论文结论:

Cycles = log(N) + ln(N) + O(1)

当 N=5 时,完成全部同步,需要节点间私下传播的次数,套用公式得到 3.3 次,取整得 4 次。按最大网络延时 200 ms,每次 Gossip 交换信息间隔 100 ms,那么协议本身固有延时大约 4x200 + 4x100 = 1.2s,而再算上程序开销,这个延时很可能在数秒内波动,这个量级的延时对于少数的临界场景是完全可以接受的。

总结

本文的标题是概念模型,但它不像另外一篇《RPC 的概念模型与实现解析》跟了实现解析,说明这只是一个理论推导。因为里面最关键的是如何配合 Gossip 的共享存储似乎没有找到特别适合的产品,要是自己做一个呢就会产生一种今天只想出去兜兜风,却要先自己动手造辆车的感觉。

参考

[1]. Wikipedia. Gossip protocol. 2016.03.29
[2]. ALVARO VIDELA. GOSSIP PROTOCOLS, WHERE TO START. 2015.12.02
[3]. Anne-Marie et al. Gossiping in Distributed Systems. 2007
[4]. Márk Jelasity. Gossip Protocols
[5]. Alberto Montresor. Gossip protocols for large-scale distributed systems. 2010

时间: 2024-10-24 15:33:03

去中心化概念模型与架构设计的相关文章

一个轻客户端,多语言支持,去中心化,自动负载,可扩展的实时数据写服务的实现方案讨论

背景 背景是设计一个实时数据接入的模块,负责接收客户端的实时数据写入(如日志流,点击流),数据支持直接下沉到HBase上(后续提供HBase上的查询),或先持久化到Kafka里,方便后续进行一些计算和处理,再下沉到文件系统或做别的输出. 在设计中,对于客户端和服务端有这么些目标. 客户端需要支持多语言(Java,C++),做得尽量轻量级,只要连上服务端的ip:port,以RPC的形式调用简单的write就可以把数据写出去.客户端不承担任何逻辑的处理,服务端的负载均衡对客户端是透明的. 服务端想要

区块链对人工智能的变革:去中心化将带来数据新范式

区块链对人工智能的变革:去中心化将带来数据新范式 2017-01-03 14:59:27  来源:网络大数据  CIO时代抢沙发 摘要:本文基于我个人在人工智能和区块链研究方面的经验,描述了区块链技术可以如何辅助人工智能.二者结合一处即发!区块链技术--尤其是行星尺度的--可以帮助实现人工智能和数据团体长期以来的一些梦想,并打开一些机会.关键词: 区块链 人工智能 近年,从围棋到人类水平的语音识别,人工智能(AI)研究者终于在他们几十年一直努力探索的领域取得了突破.取得突破进展的关键一点是研究者

从微商乱象 看去中心化的崩溃

最近微商圈子最热门的事,无疑是接二连三在多地以各种名义召开的微商大会.这些带有明显意味的各种秀,抛开产品本来的价值竞争不谈,把焦点聚光在依靠各种手法赚得盆满钵满的微商明星上.和电商平台相比,这种脱离平台约束,将流量.关系网归还用户的去中心社交状态让他们得到爆发式发展. 曾经何时,各种伪好友.夸产品.秀赚钱的信息内容充斥于整个朋友圈中.虽然管理者也出手试图阻止这种乱象的发生,但没有中心,却促成无数信息漩涡的生态,正在逐步走向它的崩溃边缘.  没有中心 导流超越服务成第一要素 "完整意义上的分布式架

我们开发了一个去中心化虚拟互联网,请评测。

经过40天的努力,新的去中化虚拟互联网DVPN,中文名字昆仑网发布了. 在这个网络中,网络中的基础架构最主要体现在如下几个版块: 1.实现P2P域名系统,域名可以无阻碍使用任何文字和后缀,域名实现和传统域名并用,不发生冲突,同一个网站,可以在两个网中同时运行.:(a.传统互联网上所有的域名都可以再注册一遍,也可以是单词,也可以是一句话:b.秒杀花生壳) 2.实现P2P远程代理功能.既我能上这个网,我邀请你,你能通过我上这个网:(这个是一个非常个性化的代理上网方式,比如你有亲人和朋友在国外,你就可

以太坊开发完整去中心化应用 —— 区块链投票系统

第一节 课程概述 本课程面向初学者,内容涵盖以太坊开发相关的基本概念,并将手把手地教大家如何构建一个 基于以太坊的完整去中心化应用 -- 区块链投票系统. ethereum logo 通过本课程的学习,你将掌握: 以太坊区块链的基本知识 开发和部署以太坊合约所需的软件环境 使用高级语言(solidity)编写以太坊合约 使用NodeJS编译.部署合约并与之交互 使用Truffle框架开发分布式应用 使用控制台或网页与合约进行交互 前序知识要求 为了顺利完成本课程,最好对以下技术已经有一些基本了解

谈互联网开放平台:“去中心化”大势所趋 zz

文/磐石之心 几天前与好友聊到众筹咖啡馆的事情,他向我讲述了一个非常具有特色的众筹咖啡馆案例.而这个案例也引发我对当前互联网开放.去中心和集权的一些思考,今天就简单写出来与大家分享. 一个无赚钱目的的众筹咖啡馆案例 众筹咖啡馆其实听起来并无新意,无非是有一个发起人,找一群人入股,然后通过咖啡馆进行营利,然后众筹者参与分成.而众筹项目的发起人是咖啡馆的最大股东,对咖啡馆具有所有权和经营权. 但是我今天要讲的众筹咖啡馆案例与普通的众筹案例完全不同.这个特色众筹咖啡馆项目是在北大毕业的人群中发起,这群

《区块链100问》第52集:区块链资产能去中心化记账

区块链资产的第三大特点是记账去中心化. 你给别人的转账,不会因为记账机构要放假,所以延迟几天到账:不会因为记账机构要盈利,所以要付很高手续费:更不会因为记账机构作弊,而受到损失. 因为它的记账是全网共同进行的.你给别人转账记录的账本,不会因为你这里或者对方那里的账本数据丢失,而无法统一,因为这个账本是全网共同维护,每个全节点都有备份.如果你转账0.5个币给火币牛牛,你们俩一起看全网的记录数据就好:有没有到账.几个确认了等等,十分透明公正. 原文地址:https://www.cnblogs.com

BLOCKCHAIN 区块链的去中心化P2P服务的JAVA代码的实现

为什么要用去中心化? 借贷关系证明举例 中心化借贷关系证明带来的问题: 机器挂了,公司倒闭了,被黑客黑了,借贷关系就不存在了 借贷关系涉及到个人隐私,中心化的机构会拿去做大数据分析.例如各大电子商务公司,会根据购物习惯,分析个人喜好,继而指导利益可图的商业行为,但这本身是侵犯隐私的. 去中心化可以解决上述的问题: 去中心化的一个节点挂了,对数据丢失影响很小,节点越多,黑客越难攻击. 使用复杂的密码学,保证隐私 区块链中的P2P概念 P2P(Peer to Peer)对等计算机或对等网络,一种计算

区块链入门与去中心化应用实战

第1章 课程简介与学习安排 本章主要介绍为什么要开设这门课,课程目标是什么,谁适合学习这门课以及学习这门课需要哪些要求,然后详细介绍本课程要讲的主要内容,希望通过这章的学习,可以让大家对课程有一个整体的,清晰的了解. 第2章 区块链技术的核心概念和原理 本章会讲解比特币的由来,比特币概念及原理,如:账本如何验证,如何确定账户所有权问题,如何保护用户隐私,什么是工作量证明(POW),如何形成权威账本等,通过这部分内容的学习,大家基本上可以告别纯小白阶段了,无论是和别人聊区块链技术,或者是要继续深入