随笔分类 -  分布式开源软件研究

摘要:现在docker在云计算领域发展的势头很猛,各个公司不论大小都开始研究这个开源工具和技术,围绕docker的开源项目和创业公司也多如牛毛,就是一个简单管理container的web ui都有很多开源项目。不过还是一个人说的好,docker必须要是集群才好玩,而且越大越好玩。当然这是从玩技术的... 阅读全文
posted @ 2014-10-21 20:14 蔷薇理想人生 阅读(10353) 评论(1) 推荐(2) 编辑
摘要:本博客迁移到部署在jae上的独立博客系统wordpress,博客地址:点击打开独立博客。欢迎大家一起来讨论IT技术。 消息中间件基本上是每一个大型互联网公司的标准基础技术组件配置,虽然有很多的开源消息中间件,功能也很强大,但是今天我还是想介绍一下怎样自主架构与设计并实现一套完整的分布式消息中间... 阅读全文
posted @ 2014-10-15 18:05 蔷薇理想人生 阅读(1841) 评论(0) 推荐(0) 编辑
摘要:本博客迁移到部署在jae上的独立博客系统wordpress,博客地址:点击打开独立博客。欢迎大家一起来讨论IT技术。现在很多企业都在搭建自己的私有PAAS平台,当然也有很多大型互联网公司搭建共有PAAS平台(例如SAE/BAE/JAE(jae.jd.com))。那么使用PAAS平台来部署SAAS应用... 阅读全文
posted @ 2014-08-31 16:13 蔷薇理想人生 阅读(3067) 评论(0) 推荐(0) 编辑
摘要:上一篇博客给大家推荐了目前处于免费阶段的PAAS平台,可以托管各种应用,大家反响很不错,说明大家还是很需要和认可这个免费托管各种web应用的京东云擎平台。但是很多用户还是很担心未来可能还是会收费,对于很多用户只是简单部署一个自己的博客,如果让这种用户付费是比较困难的。不过最近我发现京东618期间... 阅读全文
posted @ 2014-06-10 15:00 蔷薇理想人生 阅读(4726) 评论(4) 推荐(4) 编辑
摘要:帧传输类就是按照一帧的固定大小来传输数据,所有的写操作首先都是在内存中完成的直到调用了flush操作,然后传输节点在flush操作之后将所有数据根据数据的有效载荷写入数据的长度的二进制块发送出去,允许在接收的另一端按照固定的长度来读取。 帧传输类同样还是从缓存基类TBufferBase继承而来,实现的接口当然也基本相同,只是实现的方式不同而已,下面就来看看具体的实现过程和原理。 这个类所采用的默认缓存长度是512(static const int DEFAULT_BUFFER_SIZE = 512;),两个基本构造函数一个采用默认的缓存长度,另一个可以指定一个需要的缓存长度。下面还... 阅读全文
posted @ 2013-07-31 00:12 蔷薇理想人生 阅读(10375) 评论(0) 推荐(1) 编辑
摘要:本节主要介绍缓冲相关的传输类,缓存的作用就是为了提高读写的效率。Thrift在实现缓存传输的时候首先建立一个缓存的基类,然后需要实现缓存功能的类都可以直接从这个基类继承。下面就详细分析这个基类以及一个具体的实现类。 缓存基类TBufferBase 缓存基类就是让传输类所有的读写函数都提供缓存来提高性能。它在通常情况下采用memcpy来设计和实现快路径的读写访问操作,这些操作函数通常都是小、非虚拟和内联函数。TBufferBase是一个抽象的基类,子类必须实现慢路径的读写函数等操作,慢路径的读写等操作主要是为了在缓存已经满或空的情况下执行。首先看看缓存基类的定义,代码如下: class ... 阅读全文
posted @ 2013-07-26 00:39 蔷薇理想人生 阅读(3134) 评论(0) 推荐(0) 编辑
摘要:本节将介绍第一个实现具体传输功能的类TSocket,这个类是基于TCP socket实现TTransport的接口。下面具体介绍这个类的相关函数功能实现。 1.构造函数 分析一个类的功能首先看它的定义和构造函数实现,先看看它的定义:class TSocket : public TVirtualTransport { ......} 由定义可以看书TSocket继承至虚拟传输类,并且把自己当做模板参数传递过去,所以从虚拟传输类继承下来的虚拟函数(如read_virt)调用非虚拟函数(如read)就是TSocket自己实现的。 TSocket类的构造函数有4个,当然还有一个析构函数。四个构... 阅读全文
posted @ 2013-07-25 22:51 蔷薇理想人生 阅读(13974) 评论(0) 推荐(1) 编辑
摘要:默认传输类TTransportDefaults提供了抽象类TTransport的默认实现,实现了非虚拟的方法(*_virt) read(), readAll(), write(),borrow() and consume()。基类TTransport总是调用对应的虚拟函数,而默认传输类按照默认的方式实现而不去自己在覆盖哪些对应的虚拟函数了。 其实这个默认传输类的主要作用是作为虚拟传输类TVirtualTransport的父类,那么为什么需要这个类作为虚拟传输类的父类而不是直接采用抽象基类?由下面介绍虚拟基类的实现方式来决定的,因为为了避免采用虚基类,所以虚拟传输类采用了模板的方式来实现多继承. 阅读全文
posted @ 2013-07-25 22:49 蔷薇理想人生 阅读(1108) 评论(0) 推荐(0) 编辑
摘要:本章主要介绍Thrift的传输层功能的实现,传输的方式多种多样,可以采用压缩、分帧等,而这些功能的实现都是相互独立,和上一章介绍的协议类实现方式比较雷同,还是先看看这部分的类关系图,如下: 由上面的类关系图可以看出,这部分的功能是相当的强大,所以类比较多且关系错综复杂。但是如果理解清楚了这些类直接的关系就很容易掌握这部分的实现技术和这部分实现的功能。我们把这个类关系图分为三部分来看,第一部分看抽象基类TTransport类,它是所有传输类的基类,有很大一部分类直接从它继承实现它提供或者说定义的接口函数(纯虚函数),这些传输类功能比较单一实现也比较简单;第二部分就是TTransport抽象类的. 阅读全文
posted @ 2013-07-25 00:03 蔷薇理想人生 阅读(2260) 评论(0) 推荐(0) 编辑
摘要:我的新浪微博:http://weibo.com/freshairbrucewoo。欢迎大家相互交流,共同提高技术。第六节其他协议类主要的协议类基本上已经介绍完毕了,当然如果你有更好的实现和思路也可以实现自己的协议类,只要按照我前面介绍的类层次结构继承就可以了。除了前面几节介绍的协议类,Thrift还实现了一些自己内部使用的协议类,例如TDebugProtocol类,采用开发人员可读的文本协议,有助于调试,又例如TProtocolTap类,它可以使用两种协议类进行两次协议转换。放一个窃听装置在协议对象,任何读取这个类都是通过一个封闭的协议对象的,但也反映为写第二个协议对象,还有一个就是用于异常的 阅读全文
posted @ 2012-07-10 23:25 蔷薇理想人生 阅读(2737) 评论(0) 推荐(3) 编辑
摘要:我的新浪微博:http://weibo.com/freshairbrucewoo。欢迎大家相互交流,共同提高技术。这个协议类不建议投入到实际的生产环境(除非自己做了很强的压力和全面的测试)。这个密集协议的最大作用就是尽可能使用小的空间,密集协议类有两种类型的实例对象,一种是独立的,它不被使用在rpc通信中,而只是用于编码和解码;另一种是非独立的实例类型,它可以用于rpc通信,不过现在还不支持这种类型的实例。要使用这个密集协议类来进行编码和解码必须支持Thrift自己实现的一直特殊的记录数据类型形式:就是type_spec属性,它的主要作用就是用于本地化反射机制来进行读写数据。最佳的实践方法如下 阅读全文
posted @ 2012-07-03 22:02 蔷薇理想人生 阅读(2072) 评论(0) 推荐(2) 编辑
摘要:我的新浪微博:http://weibo.com/freshairbrucewoo。欢迎大家相互交流,共同提高技术。JSON(JavaScriptObjectNotation)是一种数据交换格式,是以JavaScript为基础的数据表示语言,是在以下两种数据结构的基础上来定义基本的数据描述格式的:1)含有名称/值对的集合;2)一个有序的列表。对于JSON,其部分数据结构的BNF定义如下所示。形如{“name”:”ldxian”,”age”:23}就表示一个JSON对象,其有两个属性,值分别为ldxian和23。其余的如数字、注释等跟其他编程语言差不多。下面就开始看看facebook的thrift 阅读全文
posted @ 2012-06-13 00:18 蔷薇理想人生 阅读(6410) 评论(0) 推荐(1) 编辑
摘要:我的新浪微博:http://weibo.com/freshairbrucewoo。欢迎大家相互交流,共同提高技术。这个协议类采用了zigzag编码,这种编码是基于Variable-lengthquantity编码提出来的,因为Variable-lengthquantity编码对于负数的编码都需要很长的字节数,而zigzag编码对于绝对值小的数字,无论正负都可以采用较少的字节来表示,充分利用了Varint技术。所以这个协议类采用zigzag编码可以节省传输空间,使数据的传输效率更高。至于zigzag具体的编码实现方式可以网上查查,其实就是把从低位到最后一个还存在1(二进制)的最高位表示出来就可以 阅读全文
posted @ 2012-06-11 23:49 蔷薇理想人生 阅读(4394) 评论(1) 推荐(1) 编辑
摘要:我的新浪微博:http://weibo.com/freshairbrucewoo。欢迎大家相互交流,共同提高技术。这个协议是Thrift支持的默认二进制协议,它以二进制的格式写所有的数据,基本上直接发送原始数据。因为它直接从TVirtualProtocol类继承,而且是一个模板类。它的模板参数就是一个封装具体传输发送的类,这个类才是真正实现数据传输的。这个类的定义上一节举例已经出现过了就不在列出来了。下面我就结合scribe的Log函数执行的具体过程来分析使用这个协议所执行的功能,看看二进制协议是怎样工作的。RPC调用使用到协议部分主要是在发送函数相关信息到服务器和接收服务器返回结果。现在.. 阅读全文
posted @ 2012-06-05 23:08 蔷薇理想人生 阅读(7602) 评论(0) 推荐(1) 编辑
摘要:我的新浪微博:http://weibo.com/freshairbrucewoo。欢迎大家相互交流,共同提高技术。这部分相关的类主要实现与协议相关的内容,这里说的协议是指对数据传输格式封装的协议,实现不同的协议来适合不同场景下的数据传输,因为在不同的场景下不同协议对于数据传输来说效率有很大的差别。下面是这个部分相关类的类关系图:由以上类图可以发现所有的协议类都从TProtocol类直接或间接继承,每一个协议类都有一个对应的生产对象工厂(协议工厂)。TProtocol是一个抽象的类,不能直接使用的,它有一个直接子类默认实现了所有方法(空实现),如果我们需要定义自己的数据传输协议可以直接从这个类继 阅读全文
posted @ 2012-06-05 00:01 蔷薇理想人生 阅读(3159) 评论(0) 推荐(1) 编辑
摘要:我的新浪微博:http://weibo.com/freshairbrucewoo。欢迎大家相互交流,共同提高技术。 之前对Thrift自动生成代码的实现细节做了详细的分析,下面进行处理层的实现做详细分析了!会利用到自动代码生成的知识。 这部分是协议层和用户提供的服务实现之间的纽带,定义了调用服务实现的接口框架,真正实现某种服务接口是通过上一章介绍的代码生成工具生成的代码。本章将介绍这个框架的基本原理,然后通过生成的一个实例来具体介绍怎样完成一次完整的服务,这个可能涉及到下面章节的一些知识,对于这些知识不详细分析其功能,只是介绍它在其中起什么作用。选择的实例是Facebook内部用这个框架实.. 阅读全文
posted @ 2012-06-03 15:47 蔷薇理想人生 阅读(6364) 评论(1) 推荐(1) 编辑
摘要:声明:本文转至IT168:因为GlusterFS实现了IB网络(RDMA协议,专用硬件网卡支持),当时就在想普通的网卡能不能实现,就找到一篇这样的文章介绍,基于TCP协议来实现。!附件RDMAoverTCP的协议栈工作过程浅析第一节RDMA概述随着网络带宽和速度的发展和大数据量数据的迁移的需求,网络带宽增长速度远远高于处理网络流量时所必需的计算节点的能力和对内存带宽的需求,数据中心网络架构已经逐步成为计算和存储技术的发展的瓶颈,迫切需要采用一种更高效的数据通讯架构。 传统的TCP/IP技术在数据包处理过程中,要经过操作系统及其他软件层,需要占用大量的服务器资源和内存总线带宽,所产生严重的延迟. 阅读全文
posted @ 2012-05-17 00:10 蔷薇理想人生 阅读(5666) 评论(0) 推荐(0) 编辑
摘要:我的新浪微博:http://weibo.com/freshairbrucewoo。欢迎大家相互交流,共同提高技术。第三节、rpc通信过程分析前面两个小节分别对rpc服务端和客户端的建立流程做了详细的分析,也就是说rpc客户端和服务器端已经能够进行正常的通信了(rpc客户端已经通过connect链接上rpc服务器了),那么这一小节主要根据一个实际的例子来分析一个完整的rpc通信过程。下面以客户端创建逻辑卷(volume)为例来分析rpc的通信过程,就以下面这个客户端的命令开始:glustervolumecreatetest-volumeserver3:/exp3server4:/exp4先简单看 阅读全文
posted @ 2012-05-16 02:23 蔷薇理想人生 阅读(2677) 评论(0) 推荐(1) 编辑
摘要:第二节、rpc客户端实现原理及代码分析rpc客户端主要发起一个rpc请求,执行完rpc请求以后就退出rpc,下面分析客户端rpc请求建立的整个过程。Rpc客户端请求建立的第一步是执行cli_rpc_init函数,主要实现代码如下: 1 this = THIS;//取得本线程的xlator列表 2 3 cli_rpc_prog = &cli_prog;//设置rpc调用过程集合(许多函数) 4 5 options = dict_new ();//新建一个字典数据结构用于存放选项信息 6 7 ret = dict_set_str... 阅读全文
posted @ 2012-05-14 22:36 蔷薇理想人生 阅读(3428) 评论(0) 推荐(1) 编辑
摘要:我的新浪微博:http://weibo.com/freshairbrucewoo。欢迎大家相互交流,共同提高技术。二、Glusterfs的rpc模块实现第一节、rpc服务器端实现原理及代码分析1.rpc服务初始化Rpc服务的初始化工作在函数rpcsvc_init中实现的,实现代码如下: 1 rpcsvc_t * rpcsvc_init (glusterfs_ctx_t *ctx, dict_t *options) 2 3 { 4 5 rpcsvc_t *svc = NULL;//所有rpc服务的全局状态描述对象 6 7 int ... 阅读全文
posted @ 2012-05-14 00:06 蔷薇理想人生 阅读(3112) 评论(0) 推荐(1) 编辑