前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >websocket+队列(先进先出)解决PSS云计算书排队难题

websocket+队列(先进先出)解决PSS云计算书排队难题

作者头像
hotqin888
发布2021-08-05 15:46:18
3320
发布2021-08-05 15:46:18
举报
文章被收录于专栏:hotqin888的专栏hotqin888的专栏

PSS云计算书介绍在这里

原来想用NSQ消息队列,原来不适合我的场景。 NSQ无序?也不晓得什么无序,是否先进先出。 而http协议又是只能一次请求一个回复。而排队就必须不断的广播目前前面有多少人,过几秒再刷新一下还有几人,后面又来了几个人……甚是热闹,这不就是直播(聊天室)刷弹幕嘛…… 只能硬着头皮弄成websocket了,其实就3行+2行代码而已: 服务端:

代码语言:javascript
复制
ws, err := upgrader.Upgrade(c.Ctx.ResponseWriter, c.Ctx.Request, nil)//服务端建立websocket连接
err := client.WriteJSON(msg)//向浏览器客户端写入信息
err := ws.ReadJSON(&msg)//从浏览器读取计算参数

页面:

代码语言:javascript
复制
var ws = new WebSocket('ws://' + window.location.host + '/v1/mathcad/postmath2');//与服务端建立websocket连接
ws.send(obj);//向服务器发送计算信息

要计算前面有多少人就必须用队列吧(还有其他啥法子么?) golang队列我搜…… 代码也就几行

代码语言:javascript
复制
//向队列中添加元素
func (entry *sliceEntry) Offer(e Element) {
entry.element = append(entry.element, e)
}
//移除队列中最前面的额元素
func (entry *sliceEntry) Poll() Element {
if entry.IsEmpty() {
fmt.Println("queue is empty!") return nil
}
firstElement := entry.element[0]
entry.element = entry.element[1:]//从index=1开始,即移除了
return firstElement
}

那如果说这都没怎么体现咱们设计要素?继续看。 不同的人使用同一个模板计算,就必须排队。而不同的人用不同的模板计算,则用多线程计算即可,不用排队(当然也是要有限度……) 看出来了吧,给用户浏览器发送消息的时候就必须考虑哪些用户是一个组的,即,使用同一个模板的用户是一个组,排队信息就只能发给这个组的所有人,而这个组的每个人收到的前面还剩多少人在排队的数量是不同的。 利用上面这个队列代码,稍加改造,即element里要存用户websocket连接信息,templeID模板id,userID,websocket连接信息为var clients = make(map[*websocket.Conn]bool)

map是无序的。map用来对数组去重似乎是最佳方案(还有更好的去重方法吗?) 先到这了,继续探索。 某些队列组件是支持分组的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-06-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档