- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个 Redis 服务器和多个 Redis 客户端。每个 Redis 客户端都是一个 WebSocket+HTTP 服务器,其中包括管理 WebSocket 连接。这些 WebSocket+HTTP 服务器隐藏在负载均衡器后面。
WebSocket+HTTP 服务器提供了一个 GET/health
HTTP 端点。我希望此端点提供整个集群中当前 WebSocket 连接的总数。
当点击 GET/health
时,负载均衡器显然会将请求分派(dispatch)给一个 WebSocket+HTTP 服务器实例。
如何让一个 WebSocket+HTTP 服务器实例向所有其他实例询问它们当前管理的 WebSocket 连接数?
我想到了以下步骤:
CLIENT LIST
了解当前有多少个 Redis 客户端(例如 n
);WEBSOCKET_CONNECTION_COUNT_REQUEST
发布到 Redis(假设所有 Redis 客户端都订阅了此事件);n
WEBSOCKET_CONNECTION_COUNT_RESPONSE
,汇总计数,并通过 HTTP 返回。您如何看待上述方法?是不是有点太绕了?我觉得我可能有点过度设计......
我最初认为实例可以 INCR
/DECR
在 Redis 存储中计数,但我不确定如何处理实例被杀死(因为计数应该然后相应地减少)。我认为临时解决方案更可取。尽管如此,仍然对想法持开放态度。
最佳答案
我会使用排序集,其中成员是 WS 服务器 ID,分数是他们最后一次“ping”的时间戳。
通过使用其 id 更新排序集,让每个 WS 定期“ping”(例如每 10 秒)。您可以使用 Lua 脚本从服务器获取时间并设置成员(member)的分数以使一切变得美好和原子化:
redis.replicate_commands()
local t = redis.call('TIME')
return redis.call('ZADD', KEYS[1], tonumber(t[0]), ARGV[1])
因此,如果您的排序集称为“wsservers”并且 WS 的 id 是 foo,您可以在使用 EVALSHA <script-sha1> 1 wsservers foo
加载脚本后调用脚本。 .
要返回计数,您需要做的就是在最后一个时间段(即 11 秒)的排序集合上取一个范围并计算结果。您还可以利用这个机会来修剪旧的死服务器。当然,Lua 脚本是我的首选方法,这两个任务都不需要实际将原始 WS 成员发送到调用客户端:
local t = redis.call('TIME')
local live = redis.call('ZRANGE', KEYS[1], tonumber(t[0])-11, '+inf')
redis.call('ZREMRANGEBYSCORE', KEYS[1], '-inf', tonumber(t[0])-11)
return #live
关于redis - 如何让一个 Redis 客户端等待所有其他 Redis 客户端响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50000297/
我是一名优秀的程序员,十分优秀!