学习微信的序列号生成服务

参考文档:https://www.infoq.cn/article/wechat-serial-number-generator-architecture

序列号的作用:

系统为每个用户分配一个64位的序列号,序列号可可以用来同步用户数据,可以当作是用户数据的版本号,每次客户端的心跳请求都会带上接收到的最新序列号,服务器判断序列号小于用户的最新序列号则需要给客户端发送最新数据。

max_seq + step用来保证序列号递增,以及减少持久化次数

使用cur_seq和max_seq用来获取最新序列号,step位每次更新max_seq的步长,每次请求时cur_seq++,如果cur_sql > max_seq,则max_seq += step,将max_seq持久化,每次充气时将max_seq赋值给cur_seq。这样可以使保存次数从之前的QPS降低到QPS/step。

多用户公用同一个max_seq来减少持久化数据的空间占用

系统分成AllocSvr和StoreSvr,通过NRW策略保证数据可靠性。

灾难隔离:按UID返回分Set,每个Set都是一个独立的、完整的AllocSvr+StoreSvr系统,

主备融灾:原理利用RPC重试机制来融灾,路由配置都写在配置文件中,架构简单,但是扩容麻烦,无法同一时间更新Client和Server

路由表融灾:每次请求时,server都把路由信息返回给client,client同时连接所有server,如果一个server挂了就切下一个,拿到路由表后就可以正常工作。为了防止频繁传路由表带来的带宽消耗,可以增加路由表版本号,发现更高的版本号时client再拉取最新的路由表

其他:如果要保证序列号单调递增,则同一时段内只能同一个AllocSrv服务同一UID,所以AllocSrv需要加入租约概念,即每N秒需要向StoreSrv续租。N秒未续租则将AllocSrv下线,将它所负责的uid分给其他AllocSrv。其他AllocSrv在收到新的UID时,需要等待N秒再为新的UID提供服务

你可能感兴趣的:(学习微信的序列号生成服务)