奇虎 360 和 Go

未匹配的标注

本文为官方 Go Blog 的中文翻译,详见 翻译说明

Yang Zhou
2015年7月6日

*这篇客座博客文章是由奇虎360的软件工程师Yang Zhou撰写的。

奇虎360是中国互联网和移动安全产品与服务的主要提供商,并运营者一个主要的基于Android的的移动分发平台。截止2014年6月,奇虎每月大约有活跃PC互联网用户,超过6.4亿移动用户。奇虎还运营者中国最受欢迎的互联网浏览器和PC搜索引擎之一。

我的团队,推送服务团队,为公司的50多种产品(包括PC和移动产品)提供基本的消息传递服务,其中包括我们开房平台中的数千种应用程序。

我们与Go的”恋情“可以追溯到2012年,当时我们首次尝试为奇虎产品之一提供推送服务。最初的版本使用nginx + lua + redis创建,由于负载过大,无法满足我们对实时性能的要求。在这种情况下,新发布的Go 1.0.3版本引起了我们的注意。我们在几周内完成了原型,这很大程度上要归功于它提供的goroutine和channel功能。

最初,我们基于Go的系统在20台服务器上运行,总共具有2000万个实时连接。该系统每天发送200万条消息。该系统现在可以在400台服务器上运行,支持2亿多个实时连接。现在,它每天发送超过100亿条消息。

随着业务的快速扩展和对推送服务的应用程序需求的增加,最初的Go系统迅速达到了瓶颈:堆大小达到69G,最大垃圾回收(GC)暂停时间为3-6秒。更糟糕的是,我们不得不每周启动系统以释放内存。如果我们说我们不曾考虑放弃Go而使用C重新编写整个核心组件,这是不诚实的。但是,事情并没有按照我们的计划进行,我们在迁移业务逻辑层的代码时遇到了麻烦。结果,对于当时的唯一人员(本人)不可能在确保逻辑转移到C服务框架的同时维护Go系统。

因此,我决定继续使用Go系统(可能是我不得不做的最明智的选择),并且很快取得了长足的进步。

以下是我们进行的一些调整和主要注意事项:

  • 将短连接替换为持久连接(使用连接池),以减少在通信期间创建缓冲区和对象。
  • 适当的使用对象和内存池,以减少GC的负载。

  • 使用”任务池“,一种具有一组长期使用的goroutine的机制,这些goroutine消费由连接goroutine发送的全局任务或消息队列,来替代短期goroutine。

  • 监视和控制程序中的goroutine编号。缺乏控制权可能会导致由于无法接受外部请求而导致goroutine激增,从而给GC带来难以承受的负担,因为发送到内部服务器的RPC调用可能会阻塞最近创建的goroutine。

  • 请记住在移动网络下向连接添加读写期限;否则,可能会导致goroutine阻塞。在LAN网络中时,请正确谨慎地应用它,否则会影响RPC通信效率。

  • 使用流水线(在TCP全双工功能下)可提高RPC框架的通信效率。

结果是,即使人力资源有限,我们也成功启动了架构的三次迭代,和RPC框架的两次迭代。这全部归因于Go的开发便利性。您可以在下面找到最新的系统架构:

持续改进的过程可以通过表格来说明:

同样,在进行这些优化以后,不需要临时释放内存或重新启动系统。

更令人兴奋的是,我们开发了一个在线实时可见性平台,用于对Go程序进行性能分析。现在,我们可以轻松访问和诊断系统状态,从而确定任何潜在风险。这是运行中的系统的屏幕截图:

这个平台的妙处在于,我们可以通过应用Distributed Stress Test Tool(也是用Go构建)来模拟数百万在线用户的连接和行为,并观察所有实时可视化数据。这使我们能够评估任何优化的有效性,并通过识别系统瓶颈来排除问题。

到目前为止,几乎所有可能的系统优化都已得到实践。我们期待着来自GC团队的更多好消息,以便我们免于繁重的开发工作。我想随着Go的不断发展,有一天我们的经验也可能会过时。

这就是为什么我想通过衷心感谢可以参加Gopher China的机会来结束我的分享的原因。这是我们学习、分享和提供展示Go在中国的受欢迎和繁荣的窗口的盛宴。奇虎内部的许多其他团队已经了解Go,或者尝试使用Go。

我坚信,将有更多的中国互联网公司与我们一起在Go中重新创建他们的系统,而Go团队的努力将在可预见的将来使更多的开发人员和企业受益。

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/go-blog/qihoo/6...

译文地址:https://learnku.com/docs/go-blog/qihoo/6...

上一篇 下一篇
Summer
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~