Hazelcast Snowcast 序列生成器纪元和 ID 长度
Hazelcast Snowcast sequence generator epoch and id length
我将使用 Snowcast https://github.com/noctarius/snowcast 作为我的应用程序的唯一 ID 生成器。我将在 Web 应用程序 URL 中公开这些 ID。
现在我有两个选项如何使用我的 Spring 引导应用程序配置 Snowcast 音序器:
@Bean
public SnowcastSequencer snowcastSequencer(Snowcast snowcast) {
Calendar calendar = GregorianCalendar.getInstance();
calendar.set(2017, Calendar.FEBRUARY, 1, 0, 0);
SnowcastEpoch snowcastEpoch = SnowcastEpoch.byTimestamp(calendar.getTimeInMillis());
return snowcast.createSequencer("sequence_generator", snowcastEpoch);
}
或
@Bean
public SnowcastSequencer snowcastSequencer(Snowcast snowcast){
SnowcastEpoch snowcastEpoch = SnowcastEpoch.byTimestamp(new Date().getTime());
return snowcast.createSequencer("sequence_generator", snowcastEpoch);
}
作为 snowcastSequencer.next()
方法调用的结果,在基于 Calendar
的纪元的情况下,我得到以下 long 值:
15617925960433665
但在基于 Date
的纪元的情况下:
12046041089
我对较短的 ID 更感兴趣.. 就像第二个一样,但我担心 ID 可能存在唯一性问题。
你能告诉我在唯一 ID 的情况下可以使用基于日期的纪元吗?
如果您查看这些数字的生成方式,您会发现没有更短或更长的 ID,因为一个 ID 由多个部分组成。时间戳只是其中之一。也就是说,随着时间的推移,ID 会发生变化,因为纪元的偏移量(前几位)会增加。在某些时候,long 的值将从 Java 点切换为负值,因为所有位都被使用(甚至是最高位)并且它会开始看起来为负值(或者您需要将其打印为 unsigned long , 把它变成一个大整数)。
无论如何,没有短或长之分,但这取决于纪元偏移量(自纪元开始以来已经过去了多少毫秒)和一毫秒内的节点/ID 数量。
PS:如果只是在应用运行时生成唯一 ID,两者都很好。
我将使用 Snowcast https://github.com/noctarius/snowcast 作为我的应用程序的唯一 ID 生成器。我将在 Web 应用程序 URL 中公开这些 ID。
现在我有两个选项如何使用我的 Spring 引导应用程序配置 Snowcast 音序器:
@Bean
public SnowcastSequencer snowcastSequencer(Snowcast snowcast) {
Calendar calendar = GregorianCalendar.getInstance();
calendar.set(2017, Calendar.FEBRUARY, 1, 0, 0);
SnowcastEpoch snowcastEpoch = SnowcastEpoch.byTimestamp(calendar.getTimeInMillis());
return snowcast.createSequencer("sequence_generator", snowcastEpoch);
}
或
@Bean
public SnowcastSequencer snowcastSequencer(Snowcast snowcast){
SnowcastEpoch snowcastEpoch = SnowcastEpoch.byTimestamp(new Date().getTime());
return snowcast.createSequencer("sequence_generator", snowcastEpoch);
}
作为 snowcastSequencer.next()
方法调用的结果,在基于 Calendar
的纪元的情况下,我得到以下 long 值:
15617925960433665
但在基于 Date
的纪元的情况下:
12046041089
我对较短的 ID 更感兴趣.. 就像第二个一样,但我担心 ID 可能存在唯一性问题。
你能告诉我在唯一 ID 的情况下可以使用基于日期的纪元吗?
如果您查看这些数字的生成方式,您会发现没有更短或更长的 ID,因为一个 ID 由多个部分组成。时间戳只是其中之一。也就是说,随着时间的推移,ID 会发生变化,因为纪元的偏移量(前几位)会增加。在某些时候,long 的值将从 Java 点切换为负值,因为所有位都被使用(甚至是最高位)并且它会开始看起来为负值(或者您需要将其打印为 unsigned long , 把它变成一个大整数)。
无论如何,没有短或长之分,但这取决于纪元偏移量(自纪元开始以来已经过去了多少毫秒)和一毫秒内的节点/ID 数量。
PS:如果只是在应用运行时生成唯一 ID,两者都很好。