Java 使用票证服务器生成主ID?

Java 使用票证服务器生成主ID?,java,mysql,web-applications,primary-key,Java,Mysql,Web Applications,Primary Key,我正在Java和Cassandra之上构建一个分布式应用程序。要生成唯一的顺序32位和64位ID,使用生成主ID这样的方法是一种好方法吗?我对此特别兴奋,因为它可以帮助我根据需要将ID的大小减少到32位或64位,否则UUID可能会增加到128位。我不希望这些ID是完全连续的,但至少要增加 但是,使用单个数据库服务器可能会导致卡桑德拉消除的单点故障。但是,这对于我们的应用程序的初始阶段可能是可以的。稍后,我们可能会引入两个服务器来缓解这些问题 这听起来是个好策略吗?简而言之,我们将MYSQL和Ca

我正在Java和Cassandra之上构建一个分布式应用程序。要生成唯一的顺序32位和64位ID,使用生成主ID这样的方法是一种好方法吗?我对此特别兴奋,因为它可以帮助我根据需要将ID的大小减少到32位或64位,否则UUID可能会增加到128位。我不希望这些ID是完全连续的,但至少要增加

但是,使用单个数据库服务器可能会导致卡桑德拉消除的单点故障。但是,这对于我们的应用程序的初始阶段可能是可以的。稍后,我们可能会引入两个服务器来缓解这些问题

这听起来是个好策略吗?简而言之,我们将MYSQL和Cassandra混合在一个应用程序中。我知道,如果mySQL因为某种原因宕机,那么我们就不能单独使用Cassandra

我们已经寻找了其他解决方案,如雪花,但它并不完全符合我们的要求


EDIT:我正在寻求关于使用MySQL生成唯一的主ID对存储在Cassandra数据库中的数据/实体进行键控是否是一种好方法的建议。像Flickr的票证服务器这样的方法有什么缺点(如果有的话)?

一般来说,你不能同时拥有“总是增加”和“没有SPOF和复杂的同步”

如果您想要有多个ID生成器,而不必在每个新ID上互相询问,那么每个ID生成器都需要一个单独的ID池

在您链接的文章中提到了一个非常简单的示例,其中一个服务器创建奇数,而另一个服务器创建偶数。(您可以简单地将其扩展到更多服务器)。当然,您不能确定一台服务器没有先于另一台服务器运行,这会导致像111、120、113、122、115、124这样的非递增序列

如果您只想“大致增加”,您可以实施一种方案,其中每台服务器在某些时间间隔(如每分钟或每10000个ID)告诉另一台服务器其当前ID,如果另一台服务器挂起太远,则另一台服务器会跳转其自己的ID(仅向前)。这应该以一种不会中断ID生成的方式来完成,以便在其他服务器停机时保持健壮性



啊,对于“最后的空闲位”,只需将您的ID乘以一些
数字(每次相同,如果您真的想要“空闲位”而不仅仅是“数据空间”),然后添加数据(应该小于
数字)。但是,当然,您会更早地用完ID空间(按系数
number
)。

我不太喜欢尝试将意义附加到代理键(如果您希望代理键随时间增加,您会尝试这样做)。正如您所看到的,这使得生成关键点的问题更加复杂。假设您希望键随时间增加,以便对数据进行排序,为什么不包括对象创建时间戳并将其存储在数据存储中?这大大简化了密钥的生成,并允许您使用随时间增加的密钥执行几乎所有可以执行的操作,另外一个额外的好处是,无论谁维护您的代码,都会非常清楚对象应该如何排序。

我想这里有一个问题,但很难确切地看出你在问什么。请澄清:(但没有解决方案,仅供参考)我查过了。。但是没有用,因为没有答案引入单点故障确实打乱了分布式系统的主要优势。那么你的要求是什么?为什么雪花和它们不相配?为什么ID是顺序的很重要?我需要生成按递增顺序大致排序的32位和64位ID。我还需要一些空闲位(64位Id中约4位)来根据数据类别将单个实体的数据分成两行。我会在Id的末尾附加一些额外的位,因此需要一些空闲位。我要补充的是,在键中插入几位有意义的数据也是如此-为什么不为这几位有意义的数据设置单独的字段呢?