gpt4 book ai didi

redis - 如何让一个 Redis 客户端等待所有其他 Redis 客户端响应?

转载 作者:可可西里 更新时间:2023-11-01 11:47:23 36 4
gpt4 key购买 nike

我有一个 Redis 服务器和多个 Redis 客户端。每个 Redis 客户端都是一个 WebSocket+HTTP 服务器,其中包括管理 WebSocket 连接。这些 WebSocket+HTTP 服务器隐藏在负载均衡器后面。

WebSocket+HTTP 服务器提供了一个 GET/health HTTP 端点。我希望此端点提供整个集群中当前 WebSocket 连接的总数。

当点击 GET/health 时,负载均衡器显然会将请求分派(dispatch)给一个 WebSocket+HTTP 服务器实例。

如何让一个 WebSocket+HTTP 服务器实例向所有其他实例询问它们当前管理的 WebSocket 连接数?


我想到了以下步骤:

  1. 实例使用CLIENT LIST了解当前有多少个 Redis 客户端(例如 n);
  2. 实例然后将 WEBSOCKET_CONNECTION_COUNT_REQUEST 发布到 Redis(假设所有 Redis 客户端都订阅了此事件);
  3. 该实例最终等待 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/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com