2011-05-27 54 views
0

我正在構建一個遊戲系統,許多玩家可以一起玩某種桌面遊戲。可能有數百個遊戲桌在同一時間。該系統由幾個組件組成,其中主要組件是遊戲服務器和DBworker,之間還有rabbitMQ。 DBWorker是照顧數據庫的組件。創建防彈計數器的最佳方法

所以,我需要確保每個遊戲都有唯一的ID來正確跟蹤遊戲的結果。我很想擁有某種自動增量解決方案。當然,我可以在PostgreSQL數據庫中做某種順序,並且每次都提取新的ID,但對我來說,這似乎是一個明顯的瓶頸(我不想一直與DB關聯,如果DB關閉,顯示必須去同時我們的工程師恢復數據庫)。

那麼,實現類似的任何想法或個人經驗?

p.s.我正在考慮將時間戳作爲ID,但真正的ID會更好。我不確定我爲什麼這麼想 - 如果我錯了,請糾正我。

預先感謝大家!

回答

2

這個要求比ID是一個整數嗎?如果不是,那麼爲什麼不使用UUID(RFC 4122)呢?我猜,隨機UUID應該足夠滿足你的目的。

+0

獲得隨機字符串/數字/ md5(隨機)或其他任何東西都不是問題 - 我現在使用時間戳。看,我上面寫了關於時間戳的信息。時間戳甚至更好 - 你可以通過它分類遊戲。 – Worker 2011-05-27 07:38:10

+0

UUID是在服務器端很好的東西,但如果我告訴玩家遊戲ID是:550e8400-e29b-41d4-a716-446655440000他們會哭我敢打賭... – Worker 2011-05-27 07:49:50

+0

經過一些考慮後,我認爲UUID是正確選擇。玩家應該玩遊戲而不是記憶UUID。就是這個。 – Worker 2011-05-27 08:12:05

0
  • 您需要確保所有遊戲ID都在一個地方創建 - 某種「工廠」。
  • 給定一個初始值(最後一個知道/記錄的ID)工廠生成下一個邏輯 - 舊的普通遞增int可以)。
  • 如果工廠在內存中(以及其他邏輯),管理唯一ID的生成應該沒有問題。讓它在運行時工作,在內存中作爲應用程序的另一部分意味着你不會每次都回到數據庫。
  • 在某些時候,數據(包括ID將被持續存在 - 這就是下次啓動時「最後一次已知ID」的來源)唯一的風險是確保您在工廠之前永遠不會完全無法保存該ID再次需要它

我做了類似的事情用一個簡單的桌面應用程序,我建自用,每當我保存對象的應用程序,你生成一個新的唯一ID - 這是一個簡單的INT基於關閉的最後一個值(+1)。在運行應用程序的生命週期中的某些點,我將狀態保存到磁盤(序列化的XML)。唯一會失敗的是如果我在啓動時無法打開先前保存的XML,這是當應用程序得到的起始值增加。

我不知道它是防彈還是「最好」,但它對我所需要的很好。