webman/push版本号: "v1.0.17"
webman/redis-queue版本号: "v1.3.1"
想解决的问题就是通过webman/push插件和redis消息队列来向订阅用户频道的用户发送即时消息时,需要针对用户来识别哪些消息被读取了或者是发送消息前能否感知到用户是否在线
1、向浏览器发送消息首先将要发送的消息加入redis队列,有即时发送和延迟发送两种方式
2、在redis的消费进程中触发webman/push的动作,框架本身是否存在函数或者全局变量来感知某用户是否在线,还是只能通过db去记录用户在线状态,会造成性能和mysql的压力问题
3、webhook的代码看了下,一般做为统计,或者检测用户上线后去触发消息推送,以及一些定制化动作
1、服务端只负责推,不考虑用户是否在线
2、客户端在接收到服务端的消息后,请求一个回调接口给到服务端,服务端根据接口请求参数来感知该消息用户是否已读,并从消息队列中移除该用户的该条消息
3、用户登录时,将用户的全部未读消息发送出去
顾虑:
1、这样的话,每条消息都会触发一次接口回调请求,是否合理
2、服务端只管推送,浪费的服务器资源不可控
十分推荐使用Gateway,非常成熟且丝滑。
https://www.workerman.net/doc/gateway-worker/is-online.html
https://www.workerman.net/doc/gateway-worker/send-to-client.html
https://www.workerman.net/doc/gateway-worker/bind-uid.html
👌,感谢,目前我是在webman的webhook里封装了类似gateway的isonlie函数来处理用户在线状态,redis集群的话性能也扛得住
websocket业务同时在线低于5万的用不到gatewayWorker,用webman/push更轻量好用。
建议以下方案:
消息队列用不到,除非你有什么特殊业务。
webhook可以用来做用户上线离线标记,在线离线可以记录到数据库当中。不过根据上面架构不用判断用户是否在线,这部分可以不做。
了解
1、我现在是消息记录到数据库,webhook中redis维护监听用户的上下线状态(这样可以去除对方收到消息后触发回调接口,因为页面本身的埋点数据接口已经比较多了)
2、推送前还是加一层在线状态的判断,极限的情况下可能存在消息发了,用户正好关了浏览器,不care,本身C端也有消息中心
3、用户上线,ajax拉取各个业务线的消息,触发去推送
至于加上redis队列,一是为了去做两套场景,就是即时推和延时推,二是防止推消息接口负载过大了,三是将推送的接口封装解耦出来,只需要将要推送的动作都塞入队列,设置多个进程来消费,在消费中去推送消息,消费中也可以定制化的去做一些后续的动作(可能有埋点数据,消息体封装,账户快到期提醒等)
🙏 问了seo人员,pv几千不等,后续用户量提升可以再优化处理,感谢大佬的提醒
你们的业务感觉不错呀,上线推荐瞅瞅