wayslog opened a new issue, #2142:
URL: https://github.com/apache/brpc/issues/2142

   **Is your feature request related to a problem? (你需要的功能是否与某个问题有关?)**
   
   redis cluster 是现在 redis 官方推荐的集群方案,使用的地方也比较多。建议 brpc 在现在的 redis 协议的基础上增加 
redis cluster 支持。
   
   具体支持方式不难:
   
   1. RedisClusterNamingService 初始化 redis cluster 地址列表 作为种子节点。
   2. RedisClusterNamingService 通过发送 `CLUSTER NODES` 或者 `CLUSTER SLOTS` 
命令拉取初始化的集群节点列表并将对应的 SLOT 信息通过 ServerNode 结构体的 tag 字段(e.g.: `SLOTS:"1-30 50 
[93-<-292f8b365bb7edb5e285caf0b7e6ddc7265d2f4f]"`)传递给自定义的 PreHashLoadBalancer。
   3. 自定义的 RedisClusterNamingService 继承 PeriodicNamingService,周期性的发送 `CLUSTER 
NODES` 命令给随机节点,更新集群拓扑。
   4. 通过 Tag 传递给 ServerId,进而传递给 PreHashLoadBalancer 做初始化。
   5. 自定义的 PreHashLoadBalancer 通过传入的 ServerId 的 tag 字段解析槽位信息。并初始化一个 16384 个槽位的环。
   6. 计算节点的时候,通过请求带的 request_code 来(request_code 应该由 RedisClusterRequest 
自动计算填充,通过 CRC32/16384 计算)。
   7. 增加一个 Controller 逻辑,当客户端发现 redis cluster 返回 `MOVED` 之后,立即触发一次 
RedisClusterNamingService 同步更新。同时修改 PreHashLoadBalancer 的路由表。同时修改请求地址,做重定向。
   8. 增加 Controller 逻辑,当客户端发现 redis cluster 返回 `ASK` 之后,直接修改请求地址,并在请求之前增加一个 
ASKING 指令并获得其返回值,再重新 IssueRPC,做重定向。
   9. 重定向应该有最大请求次数限制。
   
   需要确定和讨论的又如下几点:
   
   1. 是否需要自定义 Controller 来处理和控制 Redis Cluster 请求的 MOVE 和 ASK
   2. 是否需要重新注册一个 Redis Cluster protocol 协议。因为从协议上来看,redis cluster protocol 和 
redis 都用的 RESP2 协议。
   3. 是否需要单独独立一个 RedisClusterRequest ,还是在 RedisRequest 上加个字段来区分是否使用的 cluster 模式?
   4. 如果要计算 request_code 需要 aware 用户请求,那么需要修改 RedisRequest 
的解析段。是否让用户主动传入,我们不做计算?(感觉这里如果放开了会是个暗坑)。
   
   实现的时候需要注意控制 ASK/MOVED 的触发 NS 更新 和 LoadBalancer 
的更新频率(可以通过设置一个指数函数来逐步减少触发,但要在更新成功后及时 reset),因为一旦 redis cluster 发生迁移的时候,可能会触发大量的 
ASK 和 MOVED。并且,由于 redis cluster gossip 协议的特殊性,我们甚至需要对全部的 redis cluster 都发送一次 
`CLUSTER NODES` 指令来确定是否更新 NS 的节点列表,这一步在 Smart Client 里一般被称为 wait-consistent。 
   
   希望 maintainer 考虑一下这个协议,如果可以的话我可以负责后续的实现。
   
   **Describe the solution you'd like (描述你期望的解决方法)**
   
   以上
   
   **Describe alternatives you've considered (描述你想到的折衷方案)**
   
   无
   
   **Additional context/screenshots (更多上下文/截图)**
   
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to