大家好,我是小米,一个31岁还在快乐敲代码的程序员。前几天我有个朋友去参加 Java 社招面试,面试官问了一个问题:“Zookeeper 是如何保证事务顺序一致性的?”朋友当场愣了两秒,然后开始背八股:“Zookeeper 采用 ZAB 协议……通过 Leader 进行广播……”面试官点点头,又追问了一句:“那具体是怎么保证顺序的?如果多个事务同时提交怎么办?”朋友彻底卡壳了。其实这个问题并不复杂,只要理解Zookeeper 的 zxid 机制 + 事务提议流程,整个逻辑就像一条“银行排号系统”,每个人拿号排队,谁也插不了队。今天,小米就用一个故事,把Zookeeper 事务顺序一致性讲清楚。一个银行排号的故事想象一个场景。你走进一家银行办理业务。门口有个取号机。每个人进去第一件事就是:取号。比如:然后银行柜台就按顺序叫号:001 - 002 - 003无论多少窗口,顺序永远不会乱。因为号码是全局递增的。Zookeeper 的事务顺序,其实就是这么保证的。只不过银行的号码叫排队号,而 Zookeeper 的号码叫:zxid什么是 zxid?在 Zookeeper 中,每一个事务操作都会被分配一个全局唯一且递增的事务 ID:zxid(ZooKeeper Transaction ID)这个 ID 是整个集群排序事务的核心。它是一个:64 位的数字,结构如下:可以表示为:zxid = epoch 32 | counter,举个例子:如果 Leader 发生变化:这就意味着:新 Leader 的事务序列重新开始,但 epoch 变了。这样就保证了:全局事务顺序唯一。epoch 是什么?很多人第一次看到epoch