葡京在线开户MySpace DataRelay 分布式数据缓存源码分析[转]

5 DataRelay消息(RelayMessage)

RelayMessage是DataRelay框架的通信数据基础,它担负承接得缓存的数额在服务端和客户端里交互。RelayMessage设计具有以下特征:

<!–[if !supportLists]–>1)
<!–[endif]–>规范信息的类型定义,包括get,update,save,delete
等等,随着框架的壮大,添加扩展的品类。

<!–[if !supportLists]–>2)
<!–[endif]–>为了提供导性能,减少网络传输量,消息让序列化成Byte数组存放到服务端,客户端取到数码之后需要反序列。

<!–[if !supportLists]–>3)
<!–[endif]–>每个消息具有唯一的ID,如果ID不克确定唯一性,还有ExtendedID
组合使用。

<!–[if !supportLists]–>4) <!–[endif]–>消息TypeID,
针对每种型的音都用分配一个TypeID,用来恒定缓存的多寡位置。

另外补偿

Go学习笔记
by 雨痕大神
Golang在线开发环境
由Go语言中文网和实验楼一同做,通过浏览器直接访问Golang在线开发条件,进行Go编程。

MySpace虽然开源出来datarelay,但是从未特别好之文档帮助大家读,下面将针对整个代码分析,让大家打大局认识DataRelay这套于.net平台达成不可多得的精品。

视频材料

《Go编程基础》视频教程:由@Unknown活,与书籍配套。
《Go
Web基础》视频教程
《Go名库讲解》视频教程

3 DataRelay内部模块组成

DataRelay各个模块之间和谐工作,保障了网的正规运转,各个模块的计划来分别的责任,DataRelay的中间模块组成如图3所著,主要职责如下:

<!–[if !supportLists]–>1)
<!–[endif]–>DataRelay.Client:是一体系统提供给客户端采用的接口,客户端通过该接口就多少操作。

<!–[if !supportLists]–>2)
<!–[endif]–>DataRelay.Server:服务端的管住组件,控制服务之生命周期,以及扩大组件的热插拔。

葡京在线开户 1

图3 DataRelay的内模块结构图

<!–[if !supportLists]–>3)
<!–[endif]–>DataRelay.Transports.Socket:管理客户端以及劳务端的TCP连接池管理。

<!–[if !supportLists]–>4)
<!–[endif]–>DataRelay.Common:主要封装了DataRelay体系受到通用操作与接口定义,主要包括:

<!–[if !supportLists]–>a)
<!–[endif]–>RelayComponent.Interface
定义DataRelay的零部件接口规范,扩展组件必须实现该接口。

<!–[if !supportLists]–>b) <!–[endif]–>RelayMessage
定义了服务端和客户端交互的信息类型,是整个系统通信的基本功。

<!–[if !supportLists]–>c)
<!–[endif]–>RelayConfiguration Schemas
对系统中之部署文件进行格式验证,保证配置的准确性。

<!–[if !supportLists]–>5)
<!–[endif]–>DataRelay.Components:组件模块,包含了着力模块,以及扩大模块

<!–[if !supportLists]–>a)
<!–[endif]–>Storage是确实存放Cache的地方,对于存放的介质有强,采用Berkeley
DB用来持久化存储数据,也可以为胜性能,采用内存保存Cache。这有些应用DataRelay组件设计规范,可以因缓存的数据类型以及数据操作方法,扩展合适的仓储组件模块。

<!–[if !supportLists]–>b) <!–[endif]–>Forwarding
:网络消息分发组件,该零件模块是一切DataRelay的为主器件,它负责RelayMessage的传递,以及消息之处理,它的成包含以下几独中心模块:

<!–[if !supportLists]–>l <!–[endif]–>CCR
是微软资的异步编程组件,在Forwarding中她负责管理消息的异步、并发、协调以及挫败处理。

<!–[if !supportLists]–>l <!–[endif]–>NodeManager
对DataRelay服务器节点的管住,Forwarding通过其特别好的针对节点开展分配与调用,完成网络消息的散发及一头。

<!–[if !supportLists]–>l <!–[endif]–>PerfCounter
性能计数器\[10\]主要职责是监督服务器各个节点的服务状态。

<!–[if !supportLists]–>6)
<!–[endif]–>DataRelay.Logging:负责记录DataRelay的日记。

社区交流

StudyGolang
Golang中国
Go友团

2 DataRelay的大体架构

DataRelay的物理架构图如图1所著,标明了DataRelay在普网站体系被所处的地位。DataRelay处于整个网站体系中之中间层,不同为一般中间层设计,Web服务器就连续数据库服务器,也还要连接中间层,这样设计可以防止单点,如果Web服务器就连接中间层,一旦中间层服务器荡机,整个网站以无可知办事,而使用图被设计方案,一旦中间层服务器当机,Web服务器同样好直接看数据库服务器,不至于不做事。当Web服务器请求被Cache的事务对象时,首先要DataRelay系统,如果该数量在DataRelay系统中有,将直归给Web服务器,当不在DataRelay系统中,系统将请转向数据库请求,请求到数量首先以数据保存至DataRelay系统中,过后返回给Web服务器。

 葡京在线开户 2
<!–[endif]–>

贪图1 网站物理架构图

一切DataRelay集群部署如图2所展示,对于DataRelay的服务器的团伙结构,主要发生以下三碰定义:

<!–[if !supportLists]–>1) <!–[endif]–>Groups

<!–[if !supportLists]–>l
<!–[endif]–>不同之组存储不同之数,在DataRelay系统中,可以定义多个组,可以针对组进行走访模式设置。

<!–[if !supportLists]–>2) <!–[endif]–>Clusters

<!–[if !supportLists]–>l
<!–[endif]–>多只集群是一个组中,缓存业务的多寡对象根据Distributed
Cache模式分配选择要保留的集群地址。

<!–[if !supportLists]–>3) <!–[endif]–>Servers

<!–[if !supportLists]–>l
<!–[endif]–>DataRelay集群中之服务器,每个集众多被服务器之间采用Replicated
Cache模式并保存数据。

葡京在线开户 3

祈求2 DataRelay集群部署图

在这个布局中,每一样组Cluster中之服务器之间会并数据,保存同样的数据备份,当Web服务器请求数据,获取数据服务器节点的算法:

Cluster Index = ObjectID %(# Cluster)

Server Node = Random (Cluster Index)

注:ObjectID 表示存储数据的类别ID,# Cluster
表示一个Group中发出多少个Cluster

当确定了Cluster
Index过后,就肆意从该Cluster中取出一雅可用之节点服务器处理多少请求。

看了汪汪汪不是我之言语的GO语言零基础入门资料整理,个人感觉还不够健全,忍不住过来补充部分情。

6 DataRelay组件

DataRelay是相同效基于组件的系架构,网络消息分发是独零件,持久化存储是个零部件,内存存储是单零件,在DataRelay中其他成效的开销都是一个组件,这样能挺好之供了网的扩展性。

本来对和设计组件本身,还存有非常强之自主性,每个组件可以定义自己的部署文件,在部署文件中经过反射生成处理我配备信息的实例,如DataRelay设计的Berkeley
DB存储组件,由于Berkeley
DB本身配置就相当复杂,所以DataRelay在规划该零件时,单独对Berkeley
DB配置进行保管,

每当DataRelay组件接口定义中,主要是概念了组件要处理消息之接口及组件自身运行时的信。特点如下:

<!–[if !supportLists]–>1)
<!–[endif]–>服务框架依赖组件的接口操作RelayMessage。

<!–[if !supportLists]–>2)
<!–[endif]–>组件可以由定义的部署文件,服务框架通过反射,获取组件配置信息。

<!–[if !supportLists]–>3)
<!–[endif]–>当组件配置文件变动,服务框架会自动读取重新读取配置信息。

入门书籍

《Go
入门指南》(《The
Way to Go》中文版)
《Go
编程基础》
《学习 Go
语言》
《GO
标准库》:
Polaris出品,一本起价之入门书籍。
《Go Web
编程》
《Go并发编程实战》
and
《Go命令教程》由@特价萝卜出品。

1.DataRelay的着力特征

DataRelay在参考各种数码缓存功能和计划性理念基础及,在.NET平台系统下统筹并实现的同一仿照分布式缓存体系,具有以下特征:

<!–[if !supportLists]–>1)
<!–[endif]–>利用现有的Cache解决方案来就地方Cache功能。现有的Berkeley
DB、Memcached、
本地Cache模块都得以当作插件,接抱该网被,作为本地Cache机制。

<!–[if !supportLists]–>2)
<!–[endif]–>自定义序列化和反序列接口,减少囤空间,提供网络传输效率。

<!–[if !supportLists]–>3)
<!–[endif]–>服务配置简单,对劳务节点支持热插拔。

<!–[if !supportLists]–>4)
<!–[endif]–>对入DataRelay组件接口定义的模块,通过联之零件接口管理模块,对服务端组件支持动态更新。

<!–[if !supportLists]–>5)
<!–[endif]–>规范的机件开发接口,大大简化了组件开发,提高扩展性。

<!–[if !supportLists]–>6)
<!–[endif]–>网络信息分发及协办结合了Replicated
Cache和Distributed Cache模式,保证了系的可靠行。

<!–[if !supportLists]–>7)
<!–[endif]–>利用微软CCR组件(并发与和谐运转时(Concurrency and
Coordination
Runtime))很好之管住信息之异步、并发、协调及破产处理,保证了系的快速,稳定。

网站教程:

GO语言编程
and
GO语言开发2048
from 实验楼
Go语言后台应用开发
form 优才网
Go语言第一课
form 慕课网

7 DataRelay 组件容器

DataRelay体系是根据组件模块的,对于组件的周转需要一个环境,DataRelay提供组件容器,组件容器的主要职责就是保安组件的生命周期,以及调度信息于组件中传。该类实现两单接口,分别是IRelayNode和IDataHandler。

<!–[if !supportLists]–>1)
<!–[endif]–>IRelayNode:该接口定义容器中组件节点的生命周期,以及部署信息,通过该接口,我们得抱到容器被各个零部件当前的运行状况,以及有关部署信息。

<!–[if !supportLists]–>2)
<!–[endif]–>IDataHandler:该接口是传信息之接口定义,同样以组件接口定义中也得并该接口,该接口定义在漫天体系中信息之传。

服务端消息将收取到消息满传输至零部件容器中,有组件容器进行信息分发,所以在RelayNode类的规划达到,对大量高并发的信,也运用CCR组件管理。

8 DataRelay 网络信息分发机制

网络消息分发以DataRelay中凡出于Forwarding组件模块形成的,Forwarding是DataRelay的一个核心模块,在服务端和客户端都要利用。它就DataRelay分布式缓存系统的纱消息分发及一起。它对信息分发及一头机制分成两种办法,一栽是只要实时操作信息,一种植是异步操作信息。对于获得Cache数据,需要实时操作,对于创新、保存、删除Cache数据足以根据工作场景选择异步操作。

DataRelay以网遭到落实的分布式Cache是Replicated Cache和Distributed
Cache相结合的做法:

<!–[if !supportLists]–>1)
<!–[endif]–>在对跟一个组下缓存对象的选项在某集众多被贮存是行使Distributed
Cache方式,根据Mod运算定位存放的集群位置。

<!–[if !supportLists]–>2)
<!–[endif]–>对于以同一个组下同一个汇众多被节点机器上的Cache数据分布采用的是Replicated
Cache,即凡是依靠在和一个组中的同一个集群下之每个节点所蕴涵的Cache数据是同样的。

Forwarding组件模块处理Cache数据要分为2单方面,一方面是获取数据,另一个点是创新数据。如图10表示了当保存与沾之逻辑过程。假设当前DataRelay系统4大服务器节点,分成2只集群,在同一App组中,需要处理的苏存业务对象数据来2个,2单数据对象的ID分别是120跟121。下面分别证实数据在得与封存之逻辑过程。

<!–[if !supportLists]–>1)
<!–[endif]–>获取对象Id为121的缓存数据:

<!–[if !supportLists]–>a)
<!–[endif]–>获取对象Id为121安排描述着安装的组名称:App。

<!–[if !supportLists]–>b) <!–[endif]–>选择Cluster
Index:首先根据Cluster Index 算法,计算得出 Cluster Index = 1 ( 121 % 2
= 1 ) mod ( 业务对象ID,集群数量 )

<!–[if !supportLists]–>c)
<!–[endif]–>从该Cluster中随机选择同一台服务节点,获取数据。

<!–[if !supportLists]–>2)
<!–[endif]–>保存对象Id为120的缓存数据:

<!–[if !supportLists]–>a)
<!–[endif]–>获取对象Id为120安排描述着安的组名称:App。

<!–[if !supportLists]–>b) <!–[endif]–>选择Cluster
Index: 首先根据Cluster Index算法,计算得出 Cluster Index = 0 ( 120 % 2
)。

<!–[if !supportLists]–>c)
<!–[endif]–>从该Cluster中随机选择一样玉服务器节点,保存数据

<!–[if !supportLists]–>d)
<!–[endif]–>该服务器节点会异步发送网络消息,同步该缓存数据到拖欠Cluster的别节点受到。

葡京在线开户 4

贪图10 网络消息分发模型

DataRelay在Forwarding的计划性达到独具以下几只特性:

<!–[if !supportLists]–>1)
<!–[endif]–>结合了Replicated Cache 和Distributed
Cache各自特点,很好的拍卖了Cache数据以集群达之数据分布与联合。

<!–[if !supportLists]–>2)
<!–[endif]–>CCR组件模块的并轨,使得网络信息处理具有快速履,可靠性。

<!–[if !supportLists]–>3)
<!–[endif]–>通过配备可以对信息批量封装,一次性交给,减少网络通信。

CodePlex代码下载地址:http://datarelay.codeplex.com

MySpace作为.NET架构在互联网平台最成功之案例之一,其中大重要的系统datarelay分布式数据缓存也开源了,DataRelay提供了高性能的休息存系统以及信处理机制,并支持从定义计算Component组件,支持Cluster,有完全的Replication和负载均衡机制,组件都是以windows服务之款式,可以非常灵活的拓展配备,客户端和服务端使用Socket进行通信通讯,另外还可以老有利的壮大各种自定义组件,譬如缓存部分可以以Memcached,还有最近于流行Redis。

MIX 10达到的演说:Robots at MySpace: Massive Scaling a .NET Website with
the Microsoft Robotic Studio
http://ecn.channel9.msdn.com/o9/mix/10/pptx/EX04.pptx

4序列化和倒序列化

DataRelay为了提升序列化效率,对工作缓存对象进行了起定义序列化和倒序列化的兑现,自定义的序列化数据结构非常窘迫凑,如图4自定义序列化数据结构图所显示,32个整型(int32)只占4只字节,布尔型(bool)占用1只字节,一个尺寸为2之16位之整型数组(int16[2])占用总共8独字节,数组长度占4单字节,每位16员数占2只字节。可以见见,DataRelay自行编码的序列化数据结构相当的一体。

葡京在线开户 5

图4 自定义序列化数据结构

通过对序列化和反序列化的实现,做了对待测试,在含一多样System.Int32种的数目对象中,使用.NET序列化体系,做序列化生成的字节流是190
KB,如果运用从定义序列化实现,将转变仅仅14
KB,字节约流减少超过85%,并且序列化的辰压缩14.4s,减少了字节流就减少了网的传输量以及序列化时间缩短,网络传输性能显加强。

DataRelay架构分析

要害分析DataRelay的架,分别由DataRelay的特性,系统的大体部署架构,以及系统的内部结构和依据组件规范接口分析,详细地介绍了DataRelay系统的构架思想和贯彻方案。

9 DataRelay 服务配置

以服务配置这块,datarelay也起特别之远在,利用了.net
appdomain这个特点,做到可热插拔,在计划这有些职能时,采用DataRelay系统框架和组件模块使用不同之AppDomain来加载,将以一个单身的
AppDomain将享有组件模块程序集加载到零部件容器中,这样当添加或更新组件dll和部署文件时,DataRelay将可动态卸载
AppDomain,过后在打新创建新的 AppDomain,然后用目前组件加载到里头。

如此这般尽管得毫无从新启动DataRelay服务管理组件更新,在线上运维还是坏便于的,设想一下如发几十台Relay服务器需要更新组件,这样安排十分便宜很迅猛。

《程序员2012.11期》 作者:张庆化

原文:http://www.tita.com/blog/tech/myspace-datarelay-分布式数据缓存源码分析