用户开了两个标签页,A 页在机器 1、B 页在机器 2,A 页改昵称后 B 页的在线列表里还是旧昵称,刷新才同步,同账号会话数统计成 2。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

upstream ws {
  hash $arg_uid consistent;
  server 10.0.0.11:8080;
  server 10.0.0.12:8080;
}

负载均衡按最小连接数调度,两次握手落到不同后端,会话状态存在进程内存里。没有共享存储,两个连接就像两个人。这一点先确认清楚,后面就不用反复试。

碰到「会话粘滞」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

具体做法是,按用户 id 做一致性哈希 让同账号落到同一台;或者把会话状态挪到 Redis 让实例无状态;同一用户多连接时在服务端合并成一个会话;开两个标签页改一次昵称验证同步。

改完照着核一遍,两个标签页改昵称后 1 秒内互相同步 同账号会话数显示为 1。

作者 9823189