java - 关于一个对用户状态有高要求的系统设计问题?

 卓菘碧625 发布于 2022-10-28 14:02
现在在做一个实时系统,基于stomp over websocket的,对用户的在线状态有很高的要求

用户上线是以连接上websocket服务器为标准的,而下线(例如直接关机)则是断开连接
但是用户要先通过Http服务器获取密钥才能连上websocket服务器(通过http的验证后,
http_server会将用户信息push入redis作为websocket server的判断标准)

因此现阶段是用redis做服务器集群的状态统一的,即缓存系统中有if_websocket_connected作为是否上线的标准
同时也就是说业务数据库(oracle),里面的用户没有在线状态字段

1.现阶段用户批量查询其它用户时,httpserver查询出符合条件的用户List

然后迭代器遍历,逐个填充在线状态,如果条件包含在线状态,则去除队列中不符合条件的用户

因为我是用spring-redisTemplate操作redis的

因此批量一开始我是不停的拿连接,释放,拿连接,释放。。。。现在想改成pipline方式(正在尝试)..

但是想到,用户前端批量查询是带分页条件的。。。我这样做就不符合这个需求了。。。

2.所以就想第二种做法了。。。改为用业务数据库去做在线状态记录,但是这涉及两个改动,(1)数据库加字段.(2)websocket服务器要集成一个orm或者jdbc

 这里我要说明一下,websocket-server和http-server是完全独立的,websocket-server主要操作redis(登录验证,状态记录)和hbase(通信日志与行为日志)
 
 http-server主要操作redis(验证消息记录,httpapi安全访问密钥验证)和orable(业务数据)
 
 所以我想保证集群个体的独立性
 
 http-server中还有一套基于http的大文件断点续传的api,也是对用户状态验证十分严格的。
 
 请原谅我码了这么多字。。。。这个系统是我一个人做的,用于毕设。。。大家推崇哪种做法,或者给我一个好的思路,只要思路就好了。
 
5 个回答
  • 但是想到,用户前端批量查询是带分页条件的。。。我这样做就不符合这个需求了。。。

    redis的list也可以支持分页,有llen和lrange两个命令就足够实现了

    2022-10-29 15:27 回答
  • 你有两个服务器:websocket-server和http-server。
    websocket-server:只做push通信,用redis记录用户接入密钥。
    http-server :是核心应用服务器,当判断用户在线时,可以通过websocket-server给用户发送push消息。
    你现在问题是http-server怎么实现能得知用户当前的在线状态,对吗?

    你既然不想在http-server上加字段,那么websocket-server就用已有的用户名+密码来实现登陆密钥啊。
    用户在http-server验证通过后,发放一个websocket-server的接入token存redis里. token的算法是F(userid+password).
    要获取用户的websocket-server的在线状态,就再算出token去redis判断。

    2022-10-29 15:28 回答
  • 这表达能力是个硬伤啊。建议楼主加几个小标题吧。比如:背景,需求,方案,问题等等。

    这么多字一眼扫过去找不到重点,很多人都没耐心仔细看完的。你把重点关键字突出出来,至少可以吸引一些人来看完全文。

    2022-10-29 15:29 回答
  • 没有突出重点,字数太多了。说了一大堆,你到底要做什么都没描述的清楚

    2022-10-29 15:29 回答
  • 好吧,没人。。。

    2022-10-29 15:31 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有