1 绪 论
1.1 课题背景
随着互联网的发展 网络带宽也越来越大 网站也从过去偏向与文本的形式转向到偏向于多媒体形式。在这种形势下各种视频分享网站也逐渐成为网络的主流使得每个人都有机会成为生活的导演。随着用户数量的飞速增长这些视频分享网站需要付出高昂的带宽费用来满足用户的最佳体验。在这种背景之下一种能充分利用网络带宽来减少用户的缓冲等待时间给用户带来更流畅播放体验 同时也能为这些视频网站分担带宽压力的解决方案应运而生。
这种方案的核心思想是在用户与视频分享网站之间加入一层缓存将所有播放的视频在本地保存一份并在不同的用户之间进行共享。这样除了视频服务器能给用户提供数据外用户也可以从其他拥有同样资源的用户那里去获取数据加快了视频数据的下载速度减少了缓冲时间使得视频观看更加流畅 同时从视频分享网站的角度来看一部分流量被分担到了用户与用户的共享之中相当于以更低的带宽成本满足了同样规模用户的最佳播放体验。
在这个方案中要让用户之间进行共享需要有一个服务器来告诉用户它正在播放的资源被其他哪些用户拥有这样它才能去向这些用户请求数据以实现共享或者下载的加速。这个服务器就是本文要研究的Tracke r服务器它的任务就是动态的记录当前哪些用户拥有哪些资源并能提供查询服务供用户查询资源的拥有者以实现资源共享。
1.2 研究意义
从1 .1节的描述可以看到 当用户需要从其他用户那里获取数据时它首先得向Tracke r服务器进行查询 同时当用户需要分享自己的数据时也必须首先告诉Tracke r 服务器自己拥有哪些资源。因此可以说 Tracke r服务器是整个客户端P2 P网络的入口点 Tracke r服务器记录了当前每个客户端节点拥有哪些资源 以及每个资源被哪些客户端节点拥有并且这些信息还需要有较高的实时性。 Tracke r服务器能承载的客户端节点个数就决定整个系统能承载的用户数量 同样 Tracke r服务器能承载的资源总量也决定了系统的容量。因此提高Tracke r服务器的性能或者通过增加服务器来
1
扩充容量具有很实际的意义。
1.3 本文研究内容与结构
本文将主要研究如何设计实现单个Tracke r服务器并研究多个Tracke r服务器之间如何进行负载均衡以便能增加整个系统的容量。最后设计实现相应的测试工具对服务器进行正确性测试和压力测试。本文共分六章 内容安排如下
第一章绪论
本文的项目概况和项目实现技术的总体综述。这一章首先介绍了项目背景概述了本文研究课题的来源、 目的与意义然后对本文内容及整体结构作了说明。
第二章技术背景介绍
介绍了本系统用到的一些技术包括Boost库[1]、ASIO库[2]以及JSON[3]的语法。
第三章系统分析与架构
本章首先从整体的角度介绍了整个P2P应用的架构并介绍了各个模块之间的是如何交互的。重点讲了Tracke r服务器模块在整个系统中所处的位置与需要实现的功能。接下来提出了一种能支持多Tracke r服务器合作扩容和负载均衡的方案。最后详细分析了每个Tracke r服务器内部的设计和实现细节。
第四章测试模块分析与设计
本章主要分析测试需求设计测试脚本的格式和元素。最后实现整个测试工具。
第五章系统性能测试
本章主要介绍如何部署系统以及设计测试数据。最后对测试结果进行了分析。
第六章总结与展望
论文的总结以及对研究课题的预测和展望。
2
2 技术背景介绍
本章主要介绍在分析和设计整个系统的过程中考虑到会选用的一些技术并指出了选用它们的原因。技术背景的介绍主要包括Boost库、ASIO库和JSON。这里Boost 主要用做基本库作为底层的平台在其上构建所有的组件 ASIO库主要用做网络编程的平台所有的网络层组件都是在ASIO库的基础上搭建而成而JSON是作为一个轻量级的数据交换格式本文将其扩展之后用来描述测试脚本的行为。
1.4 Boost介绍
2.1.1 Boost简介
Boost是一个由C++标准库委员会发起在Boost软件许可协议[4]下开源的C++模板库其由哈佛大学法学院协助撰写的协议同时鼓励商业和非商业的用途并且和GPL或者其他商业不友好的协议没有任何关系。 Boost的库都能够很好的和C++保准库兼容并且最重要的是它是一个高质量跨平台的C++模板库实现了众多的常用模块和多种高质量的算法模块。可以极大的提高产品的质量减少臭虫的产生并带来更小的维护代价。并且Boost库即将成为事实上的标准库 已经有十个Boost库被加入了C++技术报告的第一版更多的库被排到C++技术报告第二版。
Boost库旨在提供全新的、有创造性的设计。它们并不是其他那些拥有知识产权库的拷贝、克隆或者演绎。 Boost库有严格的政策来尊重其他库的知识产权。 Boost 库的开发和文档的撰写都是邮件列表或者版本控制系统公开进行的。其源代码已经被许许多多经验丰富的程序员所审查过。许多的商业机构或者组织也愿意将自己维护、改进的代码贡献给开源社区这样他们可以更加关注于自己的核心事务。
2.1.2 Boost支持的库
Boost主要包含一下几个大类字符串及文本处理、容器、迭代子、算法、函数对象和高阶编程、泛型编程、模板元编程、预处理元编程、并发编程、数学相关、纠错和测试、数据结构、输入/输出、跨语言支持、 内存相关、语法分析、杂项。
3
1.5 Boost基本知识
本章将介绍需要用到的Boost库。主要包括一些最基本最常用的库智能指针、函数绑定、多容器索引、语法分析以及字符串格式化。
2.1.3智能指针
资源泄露曾经是C++程序的噩梦垃圾回收一时备受瞩目。然而垃圾回收机制并不能满足内存管理的及时性和可视性往往使得程序设计者不自在况且C++的实现也没有引入这样的机制。在探索的过程中 C++程序员创造了智能指针一定程度上解决了资源泄露的问题。智能指针的关键技术在于用栈上构造对象的生命期控制堆上构造对象的生命期 因为在智能指针内部存储者堆上对象的的指针而且在析构函数中调用delete行为。智能指针机制作为C++垃圾回收机制的核心必须足够的强大、具有工业强度和安全性 Boost的智能指针库正是为此目的而设计的。
Boost的智能指针库[5]提供了多种不同类型的智能指针[6]类模板每种智能指针都有不同的目的和用途。这些智能指针列举如下
表2.1 Boost智能指针的类型
止内存泄露[8]。一个简单几乎能完全消灭内存泄露的原则是 总是使用一个已命名的智能指针变量接手new的对象。每次出现new关键字都应该是这样的形式
名的智能指针变量下面看看匿名的智能变量是如何的危险
量这就可能导致内存泄露。因为函数参数的求值顺序是不确定的 new i nt(2)首先被求值 g()可能是接下来求值的如果这个时候函数g抛出异常那么sha red_ptr<i nt>的构造函数就永远无法达到了也就意味着分配的内存无法被释放了。
那么在实际运用中对类的封装可以采取如下的方式
针时必须使用shared_fro m_this()函数只有这样才会将当前指针所属的智能指针的引用数加一。如果使用shared_ptr<A>(this)传入那就相当于构造了一个新的shared_ptr 指针也拥有新的引用计数并且它不会跟以前的智能指针共享所有权最后会导致this被delete两次这将是非常严重的错误。
1.6函数绑定
Boost提供了一个Bind库用于将各种函数绑定成一个仿函数对象。这样的好处是可以绑定函数的参数状态并延迟对一个函数的调用。在ASIO库中广泛的用到了这些技巧。boost: :bind[9]是标准函数std: :bind 1 st和std: :bi nd2nd的泛化。它支持任意函数对象 函数 函数指针和成员函数指针它能将任何参数绑定为一个特定的值或者
5
将输入的参数发送到任意位置。 bi nd对函数对象没有任何限制特别是 它不需要result_type first_arg ument_type和second_argument_type这样的标准typedefs。bi nd有多种用途这里只介绍会被使用到的情形
1) 和函数以及函数指针一起使用
给定这些定义
bi nd(g, 1 ,2,3)()等价于g(1 ,2,3)。
有可能只绑定一部分选定的参数。 bi nd(f,_1 , 5)(x)等价于f(x, 5)这里 _1是一个占位符参数[10] 它的含义是“代替第一个输入参数”。
作为对照这是用标准库原始形式表达的同样操作s td: :b i nd 2 nd(s td: :ptr_fu n(f),5)(x);
bind(g,_1 ,9,_1 )(x); //等价于g(x,9, x)
悄悄地忽略就像在第三个示例中第一和第二个参数被忽略。
2) 和指向成员的指针一起使用
指向成员函数的指针和指向非函数对象的数据成员的指针 因为它们不支持operator()。为了方便 bi nd接受成员指针作为它的第一个参数而它的行为就像使用boost: :mem_fn将成员指针转换成一个函数对象一样。换句话说 当R是X: :f 作为成员函数的返回类型或成员作为数据成员本身的类型时表达式b i n d(&X: :f,a rg s)
等价于
示例
存储x的一个拷贝。 bind(&X: :f, p, _1)存储p的一个拷贝而且因为p是一个boost: :shared_ptr这个函数对象保存一个属于它自己的X的实例的引用而且当p 离开它的作用域或者被re s e t()之后这个引用依然保持有效。
1.7多索引容器
Boost多索引容器Multi-Index Containers库[1 1]提供了名为multi_index_container 的类模板可以用于建造拥有一个或多个索引indices的容器不同的索引具有不同的排序和访问语义。这些索引都提供了类似于STL[12]容器的接口 因此使用起来也非常相似。在一组元素之上维护多个索引的想法来自于关系数据库并且考虑到简单的set和map无法满足多索引表中的复杂数据结构的规范。有多种的索引类型可供选用它们分别模仿了多种STL容器如std: :set,std: : l ist和hashed set。
Boost.Multi Index还具有其它功能如子对象查找、范围查询和就地更新元素这些功能使得即使在不需要多索引的时候也值得用它来替换std: :set和set: :multiset。
STL容器被设计为遵循这样一个概念 即每个容器控制它所拥有的一组元素只允许按一种方式来访问容器的类型决定了访问的方式如一个std: :se t按某种特定的排序标准维护它的元素 std: : l ist则允许按线性的顺序随意放置元素等等。
有时候需要按不同的访问接口来访问同一组元素例如某些数据可能需要按一个以上的比较谓词来排序或者一个双向列表需要对数复杂度的查找接口。在这些情况下程序员通常只能手工地把元素重排到另一个容器中这种方法通常需要一段
7
代码来负责保证不同容器间的同步。 Boost.Multi Index就提供了由一组元素及其一个或多个索引组成的mu lti_i ndex_co ntai ners。这个工具比手工编写程序要漂亮得多而且通常性能也更好。一个重要的设计策略是在multi_index_container实例化时给定索引方式索引的指定发生在编译期这提供了静态类型检查和代码优化的充足空间。
Boost.Multi Index是从关系数据库理论中的索引概念获得灵感的但是它并不是为了提供一个关系数据库框架。 m ulti_i ndex_co ntai ne r被无缝地集成到了S TL容器/算法的设计之中并提供了额外的功能主要是关于查找操作和元素更新这对于单索引容器来说是很有用的扩展。
图2.1带有三个索引的multi_index_container
图 2.1 带有三个索引的 multi_index_co ntainer描绘了一个带有三个索引的multi_index_co ntaine r 头两个索引提供了类似于set的接口分别按形状和id来排序元素第三个索引则提供了std: : l ist的双向列表功能。这些索引相当于内部元素的“视图”但它们不仅提供了对集合的读访问插入/删除操作也已实现就象在s td: :s e t 或std: : l ist中的对应操作一样。通过一个给定的索引插入元素仅当所有索引的唯一性约束均被满足时方能成功。
在本系统中多索引容器被用来作为基本的数据容器使用并且使用到了其中的哈希索引和顺序索引来对数据进行查找和遍历操作 以发挥这两种数据结构各自的优势。
1.8语法分析
本系统的测试模块由于借鉴了JSON作为其表达语言需要一个能解析JSON语
8
法的脚本解析器。而Boost.Spi rit库[13]就是一个面向对象的递归下降语法分析器框架使用模板元编程Template Meta-Programmi ng [14]技术实现。表达式模板使得用户能够完全使用C++来以一种近似扩展巴克斯范式Extended Backus Normal Form [15][16]表达式的方式描述一个语法。例如
1.9字符串格式化
Boost.Format库[17]提供了一个把参数格式化到一个字符串格式的类就像printf 所做的但是有两个主要的不同
1) format将参数发送给合适的stream所以它是完全类型安全的并且自然地支
持所有的用户自定义的类型。
2) 在format强类型转换中省略号不能被正确使用需要不确定参数的函数被连
续调用操作符%来替代。
一个format对象从一个格式化字符串构造它以重复的操作符给出参数。接着每个参数转换成字符串它们被按照格式合成一个字符串。cout<<boost: :form at("writing%1%, x=%2%:%3%-th try")%"toto"%4023%50; //打印出"writing toto,
而能为stream所用的类。 forma t被设计来提供以下的特性
1) 支持定位的参数(国际化的需要)
2) 接受不限制个数的参数
3) 使格式化命令看起来自然
4) 支持操纵子的使用来修改显式参数。加入到格式化串语法
5) 通过依赖于流上的实际传唤接受任何类型的变量。特别是用户自定义的类型
对这样的类型来说格式化选项作用会很直观自然
6) 提供printf兼容尽可能的使它类型安全和类型可扩展
9
ftlcloud怎么样?ftlcloud(超云)目前正在搞暑假促销,美国圣何塞数据中心的云服务器低至9元/月,系统盘与数据盘分离,支持Windows和Linux,免费防御CC攻击,自带10Gbps的DDoS防御。FTL-超云服务器的主要特色:稳定、安全、弹性、高性能的云端计算服务,快速部署,并且可根据业务需要扩展计算能力,按需付费,节约成本,提高资源的有效利用率。点击进入:ftlcloud官方网站...
桔子数据(徐州铭联信息科技有限公司)成立于2020年,是国内领先的互联网业务平台服务提供商。公司专注为用户提供低价高性能云计算产品,致力于云计算应用的易用性开发,并引导云计算在国内普及。目前公司研发以及运营云服务基础设施服务平台(IaaS),面向全球客户提供基于云计算的IT解决方案与客户服务,拥有丰富的国内BGP、双线高防、香港等优质的IDC资源。 公司一直秉承”以人为本、客户为尊、永...
justhost怎么样?justhost是一家俄罗斯主机商,2006年成立,提供各种主机服务,vps基于kvm,有HDD和SSD硬盘两种,特色是200Mbps不限流量(之前是100Mbps,现在升级为200Mbps)。下面是HDD硬盘的KVM VPS,性价比最高,此外还有SSD硬盘的KVM VPS,价格略高。支持Paypal付款。国内建议选择新西伯利亚或者莫斯科DataLine。支持Paypal付...