Golang websocket结合一致性杂凑演算法构建高并发推送服务
报价宝综合消息Golang websocket结合一致性杂凑演算法构建高并发推送服务
Go语言中文网,致力于每日分享编码知识,欢迎关注我,会有意想不到的收获!

1 场景介绍
web应用中,常有业务状态需要实时更新的场景。如一个较长的后台任务,从浏览器使用者触发执行到执行完成可能需几十秒的时间,这时前端需隔几秒请求一次后台,查询任务执行进度。此种方式是长轮询的方式,是存在一定弊端的,增加了后台服务的负载,若并发操作量太大,后台压力会成倍激增。业界常采用http1.1的websocket扩充套件协议与浏览器建立长连线来实现实时业务状态更新。2 实现方案
本文采用golang实现一个长连线服务,对外提供两个界面,一个是基于http的rest讯息传送界面,一个是基于websocket的client接入界面,如下图所示。
为使前端的接入更简单,从建立连线到使用者关闭浏览器,中间前端无须传送讯息来告知服务器client是否下线。我们将检测放在后台,后台采用定时心跳方式保持对client的监听,若心跳失败,则将该client剔除。如下图所示。

3 golang实现程式码
comet服务内有两个模组,http server负责接收讯息,comet server负责维护websocket client,每个client启用一个go routine对客户端保持心跳检测。3.1 核心模组

3.2 完整程式码
https://github.com/olzhy/comet
4 一致性杂凑包装
考虑到单服务的同时线上人数支援是有限的,所以在其上层用一致性杂凑算法包装。这样同一user_id建立连线会打到同一台后台服务器,给此user_id传送讯息也会打到同样的服务器。这样后台部署多个comet服务形成一个丛集即可支撑高并发讯息推送场景。如下图所示,最外层nginx挂接公网域名,对外提供基于wss的讯息接收界面及基于http的讯息传送界面。中间采用haproxy对user_id引数作一致性杂凑转发,对同一user_id的操作会打到同一台comet server。底层扩充套件为多台comet server即可构建一个高并发的讯息推送服务。
原文地址:https://leileiluoluo.com/posts/golang-websocket-combine-consistent-hashing.html
本文作者:磊磊落落的部落格,原创授权释出
