七叶笔记 » golang编程 » Golang websocket结合一致性哈希算法构建高并发推送服务

Golang websocket结合一致性哈希算法构建高并发推送服务

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 完整代码

4 一致性哈希 包装

考虑到单服务的同时在线人数支持是有限的,所以在其上层用一致性哈希算法包装。这样同一user_id建立连接会打到同一台后台服务器,给此user_id发送消息也会打到同样的服务器。这样后台部署多个comet服务形成一个集群即可支撑高并发消息推送场景。如下图所示,最外层 nginx 挂接公网域名,对外提供基于wss的消息接收接口及基于http的消息发送接口。中间采用 haproxy 对user_id参数作一致性哈希转发,对同一user_id的操作会打到同一台comet server。底层扩展为多台comet server即可构建一个高并发的消息推送服务。

原文地址:

本文作者:磊磊落落的博客,原创授权发布

相关文章