创建防弹计数器的最佳方法

时间:2011-05-27 07:21:49

标签: design-patterns database-design architecture

我正在建立一个游戏系统,许多玩家可以在一起玩某种桌面游戏。可能同时有数百个游戏桌。该系统由几个组件组成,其中主要组件是游戏服务器和DBworker,其间有rabbitMQ。 DBWorker是负责数据库的组件。

所以,我需要确保每个游戏都有唯一的ID来正确跟踪游戏的结果。我很想拥有某种自动增量解决方案。当然我可以在PostgreSQL DB中做一些序列并且每次都会提取新的ID,但对我来说这似乎是一个明显的瓶颈(我不想一直链接到DB。如果DB下降显示必须去当我们的工程师恢复数据库时。)

那么,实现类似的任何想法或个人经验?

P.S。我正在考虑将时间戳作为ID,但真正的ID会更好。我不确定为什么我这么想 - 如果我错了,请纠正我。

提前感谢大家!

2 个答案:

答案 0 :(得分:2)

这是一个要求,而不是ID是一个整数吗?如果没有,那么为什么不使用UUID(RFC 4122)呢?我想,随机UUID应该足以满足您的目的。

答案 1 :(得分:0)

  • 您需要确保所有游戏ID都只在一个地方创建 - 某种“工厂”。
  • 给定一个初始值(最后知道/记录的ID),工厂生成下一个逻辑 - 一个普通的递增int就可以了。)
  • 如果工厂在内存中(以及其他逻辑),管理唯一ID的生成应该没有问题。让它在运行时工作,在内存中只是应用程序的另一部分意味着你不会每次都回到数据库。
  • 在某些时候,数据(包括ID将被保留 - 这就是下次启动时“最后一个已知ID”的来源。唯一的风险是确保您在工厂之前永远不会完全无法保存该ID需要它。

我使用我为个人使用而构建的简单桌面应用程序做了类似的事情,每当我保存对象时,您生成一个新的唯一ID - 这是一个基于最后一个值(+1)的简单int。在正在运行的应用程序的生命周期中的某些点,我将状态保存到磁盘(序列化XML)。这个失败的唯一一次是我无法在启动时打开以前保存的XML,也就是应用程序获取的起始值增加。

我不知道它是防弹还是“最好的”,但它对我需要的东西很有效。