关于think2go的介绍,我自己是写了一篇,但因为第一次写的内容不慎消失,后面是重写的。心情和精力都不佳了。
摘选 :
首先是谢大闪亮登场,为我们分享他用Go语言在盛大的CDN系统中的应用,大家鼓掌。
我觉得讲的主要内容上可以分两大块来看,一部分是从中心结点到IDC的文件分发过程,另一部分是用户请求到达之后的调度设计。
主要应用场景像什么游戏客户端的分发之类的。先说中心结点服务器到IDC服务器的分发过程。
谢大在讲这些东西时还给我们展示了一下代码,很赞!
上一部分的内容基本是内部传输部分,从中心服务器分发到IDC。接下来是另一部分,调度器的设计部分。
调度器设计就是要考虑,根据网络情况,地理位置,当前各个服务器负载等等,来一个下载请求,决定取哪一台机器给用户提供下载服务。
CDN的基本技术,就是通过用户的IP段,查找他属于哪个网络,电信,网通?然后分配相应网络的服务器给用户提供下载。他们以前的做法是,只要找到同网络的服务器后,随机分配一台给用户提供服务。随机分配存在的问题是,服务器的负载不均衡,可能有的机器忙不过来了,而另一些却闲着。
盛大有个IP库,记录了各个IP段所处的网络,对应的分配服务器。这个在代码中谢大是用treap数据结构体存的,treap是一个kv数据结构,通过二叉树进行查找,通过一个随机权值保证树的平衡。我尚不明白这里为什么选用treap数据结构。使用treap数据结构的结点权值,和服务器负载之间是否有关系?不是吧(期间我去WC了,这里漏了一些内容)。
现在添加了负载分配的部分,会给服务器加上状态。比如优先挑选同网络服务器上负荷较低的机器,如果各个机器负荷都是中等的,则随机挑选一个。如果都到满负荷了,这时则不局限于同网络了,从全局服务器中随机挑一个,总不至于给用户返回404吧。
据谢大称,用Go语言实现以后,目前的系统相比以前的传输速度大大提升,传大文件速度是几乎原来的十倍了,小文件的提升也有30%。用户下载也明显变快了。最后谈到了下阶段可做的优化。其中有一点就是处理上行和下载之间的带宽。有时候几十G的文件任务啪一下就过来了,目前是没有限制的,这样会占用大量带宽,对已在进行中的用户服务造成影响。
接着是邵天宇带来的分享。其实我个人觉得他分享的内容跟Go语言的主题并不算太搭,个人觉得他项目中做的很多事情选择别的语言,别的开源库可能会做得更好,并没有突出Go语言的优势,选择Go只是他强烈的个人偏好而已,这个我持保留态度。这是这位同学第一次做这种分享,不管怎么样,即然使用了Go也算是Go语言的实践了,并且内容方面我认为还是比较精彩的。
微博数据分析中,我觉得可以分以下部分看吧,先是数据源的获取,接着是数据存储,然后是数据分析。
他先给我们介绍了他的开源库的选型。数据源的获取中,他是自己写的爬虫抓取微博的数据,给我们展示了Go的interface在这里的使用,一个url加一个handler。分词和索引方面之前他尝试用wukong的Go语言开源库,但是这个库有个问题是不做持久化,数据全部存放在内存的。内存占用量非常大,在与作者沟通并没得到满意的解决之后,转而使用Es..search(名字记不清了)【是:Elasticsearch + IK 】。列举了好多的开源项目,相信他是做了不少的调研工作。
还提到了他们以前系统是用php做的,硬件用的16核CPU,32G内存,而现在改用Go语言之后只用普通的PC机就能跑了。他还列举了好多数据,微博的活跃用户数啦,抓取的记录数啦,各种...反正是用数据说话,不明觉历啊,呵呵。【在这里我要提一下,他说原来是用python的】
golang与高强度在线服务
由韩拓给我们分享的,标题临时换了一下,他坦承"golang与高强度在线服务"这个标题有点太装B了。这个分享就比较高度抽象了,没有谈具体的项目,算是一些Go的使用经验吧。
中间有很多,我能记得的包括他们公司的panic是不能抛到进程级别的,必须在goroutine捕获。
像内存使用方面,不使用Go做大内存(大于1G)的服务。合适的东西做合适的事,这是我的感触,比如Go+memcached。主要是Go的垃圾回收不算完善,大量内存分配,回收时会卡。而C语言写的像memcached什么,肯定更专业。
http作为最基本的通信协议。
cgo是尽量避免不要使用的,即使像音频视频转码这类的,只有C的库,他们的做法是用C程序写成服务了让Go去调。
还有什么内存对齐,大多都是七牛公司踩过坑之后约定的一些使用习惯。给我印象比较深的是他们的log处理,他们重写了log的包,提供程序log和事务log两类日志。
---
更详细的请看上述链接。比我写的好多了啦 。