网站首页 > 精选教程 正文
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
本文作者:磊磊落落的博客,原创授权发布
猜你喜欢
- 2024-10-16 九种跨域方式实现原理(完整版) 跨域几种方式
- 2024-10-16 数字人的开发接口及调用 数字人科技有限公司
- 2024-10-16 JavaScript 九种跨域方式实现原理
- 2024-10-16 「Web应用架构」WebSocket用例,性能和性能检查列表
- 2024-10-16 websocket入门案例:构建微信扫小程序码登录系统
- 2024-10-16 WebSocket 连接失败的根本原因及解决方法
- 2024-10-16 5分钟了解游戏加速器的原理与搭建
- 2024-10-16 HTTPS通信的C++实现 实现验证通信双方真实性的技术手段是
- 2024-10-16 使用 inlets 和 kubernetes 访问本地服务
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)