java - 分布式snowflake其实是不能保证id对外保持递增的吧?
大家讲道理
大家讲道理 2017-04-18 10:30:33
0
1
532

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消耗太大了。

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

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

모든 응답(1)
小葫芦

시계 동기화에는 특정 오류가 있습니다. 예를 들어 Google/F1에서 사용하는 GPS 시계에는 약 10ms의 오류가 있습니다.
NTP 오류는 약 200-300ms입니다.
귀하의 비즈니스에서 이 오류를 받아들일 수 있는지 확인하세요.
그렇지 않으면 비즈니스에서 현지 시간을 사용하여 이벤트 순서를 결정할 수 없습니다.
분산 시스템의 타이밍 문제를 해결하려면 "Lamport의 논리 시계" 문서를 참조할 수 있습니다. 아니면 혼합 논리 시계

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿