知识卡片

一致性哈希绑定会话与限定更新时机

普通读书笔记卡

内容

雪球百万活跃用户的登录session直接存在JVM进程内存里,而不是放进外部的分布式存储——这个决策能成立,靠的是两个配合使用的设计约束。第一个约束是接入路由:接入层到集群的连接按uid做一致性Hash,也就是说一个用户从连上系统开始,就只会连到同一个JVM服务节点上,不会在多个节点之间漂移——正是这个约束,让”session只存在单个JVM内存里”这件事本身不会引发”用户换了个节点、找不到自己的session”这类问题,因为一致性Hash从路由层就保证了同一用户始终落在同一节点。这样处理的直接好处是能有效防止大面积退出登录——因为是集群,只要不是集群整体突然全挂,就不会出现大面积重新登录的情况(单个节点重启只影响连在那个节点上的一部分用户)。第二个约束是限定更新时机:既然session存在JVM内存里,重启该节点意味着这部分用户的session就没了,因此雪球的原则是只在收盘后才更新服务,盘中严禁更新——这条规则把”服务更新导致的session丢失”这个代价,严格限制在了对用户影响最小的时间窗口内(收盘后,没人在盯盘、对实时性要求最低的时段)。这两个约束合在一起说明:把有状态数据(如session)放进单机内存而不是外部分布式存储,不是不负责任的偷懒做法,而是需要配套”路由绑定用户到固定节点”和”限定服务更新时机”这两条纪律,用架构层面的路由约束和运维层面的时间窗口约束,共同弥补了”数据不是分布式存储、天生怕节点重启”这个短板,换来的是避开了引入分布式存储所带来的额外复杂度和延迟。

参考来源

- 位置:《高可用架构(第1卷)》第1章《高可用架构案例精选》"1.5 雪球在股市风暴下的高可用架构改造分享"节,"1.5.5 疑问与解惑"(源文件:_epub-src/OEBPS/Text/Chapter1_5_6.xhtml) - 结论依据:原文说明"用户登录session就存在JVM内部。因为是集群,只要不是集群突然全部挂,就不会出现大面积重新登录的",并补充"接入层到集群的链接是按uid一致性Hash……一个用户就只连一个JVM服务节点。所以我们只在收盘后更新服务。在雪球,盘中严禁更新服务",直接支撑本卡片结论。 - 原始内容:用户登录session就存在JVM内部。因为是集群,只要不是集群突然全部挂,就不会出现大面积重新登录的……接入层到集群的链接是按uid一致性Hash。简单来说,一个用户就只连一个JVM服务节点。所以我们只在收盘后更新服务。