Disqus用Go取代Python来开发实时系统

翻译自:Update On Disqus: It’s Still About Realtime, But Go Demolishes Python

disqus realtime system

disqus realtime system

我们上一篇关于Disqus的文章:“如何让Disqus在2秒的延迟内,能够每秒处理16.5万条消息”,已经过时了,当时Disqus的码农们曾为忙于开发,不说话,所以他们现在在干什么我们知道的不多,不过我们在 C1MM and NGINX 上由John Watson做了个小的分享,还有一篇文章Trying out this Go thing

 

现在Disqus有了一点提升:

  • 13亿的UV
  • 100亿PV
  • 5亿用户在线用户
  • 300万个社区
  • 2500万条评论

这些都和实时性相关,但在他们的实时系统中,Go语言取代了Python:

  • 最初的实时后端是用轻量级的Python+gevent写的
  • 实时服务混合了CPU密集型任务和大量网络IO。Gevent处理网络IO没有什么问题,只是CPU竞争比较高,成为瓶颈
  • 换成Go语言解决了CPU竞争的这个主要问题
  • 仍然在5台Nginx机器上运行
    • 使用NginxPushStream,它支持EventSource、WebSockt、Long Polling和Forever Iframe
    • 所有的用户都链接到这写机器上
    • 通常一天每台机器承载每秒3200个连接,100万连接,每秒传送15万数据包并接收13万数据包,数据发送速度150mbits/s,数据接收速度80mbits/s,端到端的延迟在15ms内(比javascript选人一条评论还要快)
    • 有许多资源消耗问题。Nginx和操作系统的配置缓解了这些问题,优化了一个场景:连接很多但传输的数据很少
  • 在别的优化前,先把网络带宽用完
    • 用10G的网卡帮助很大
    • 启用gzip压缩作用很大,不过在gzip模式下,Nginx为每个连接预分配不少内存,而评论大都很小,这导致内存消耗更厉害了。因为减少Nginx的缓存大小可避免内存溢出的问题。
  • 随着消息速度的增加,高峰期每秒需处理1万多消息,到了机器的极限,端到端的延迟可能会达到几秒甚至几分钟
  • 切换到Go语言
    • 使用Go是因为它的的性能、天生就支持并发、Python码农易上手
    • 在一周时间里,Go语言版的系统就完成了,并拿到了很好的效果:
      • 端到端延迟平均少于10ms
      • 目前CPU消耗大概在10-20%,降低了很多
    • 没有选择Node是因为Node不适合处理CPU密集型的任务
    • Go不直接访问数据库。它从RabbitMQ队列中消费事件并发布到Nginx前端。
    • 没有使用Go语言相关的框架。这只是一个很小的部分,其他部分仍然是使用Django
  • 要的是把资源利用得更好,而不是堆机器:
    • 做了这么多的工作,但我们不是横向的扩展机器,因为堆很多机器并不总是解决问题最好方案。最后,速度更快的产品也能体现其价值。

 

原创文章:Disqus用Go取代Python来开发实时系统,转载请注明:转载自戎码一生

Post Footer automatically generated by wp-posturl plugin for wordpress.