search

Home  >  Q&A  >  body text

java - 分布式snowflake其实是不能保证id对外保持递增的吧?

snowflake生成的id规则是41位的时间前缀+10位的节点标识+12位的sequence

单机上面为了防止NTP可以不停重试保障直至生成新的id。

但是在分布式环境下现在比如说有1master,2slave做back,假如master挂了,我们用zk选择了新的master,虽然说我们有dataCenterID能保证数据不重复,但是啊如果新旧master机器有时间差(比如说新master时间<旧master)那不就可能出现了新master生成的id比旧master在挂了之前生成的最后一个id要小吗?

我们怎么去规避这个问题?

1、尽量保持机器的时间一致。

2、在1无法保障的前提下该怎么做?是无法规避就是这样子的没关系?还是怎么操作,将每次生成的新的id放到zk然而新老master切换的时候新master继承老master的最后的id,这样做我感觉不合理,IO消耗太大了。

求大神指导。如果理解有问题也请尽情批判。

大家讲道理大家讲道理2768 days ago515

reply all(1)I'll reply

  • 高洛峰

    高洛峰2017-04-18 10:32:33

    There will be a certain error in clock synchronization. For example, the GPS clock used by Google/F1 has an error of about 10ms.
    NTP has an error of about 200-300ms.
    It depends on whether your business can accept this error.
    If not, your business cannot use local time to determine the order of events.
    You can refer to the "Lamport's Logical Clock" paper to solve timing problems in distributed systems. Or a mixed logic clock

    reply
    0
  • Cancelreply