我對我的BC論文項目的工作應該是寫在Scala和阿卡一的Minecraft服務器之間的狀態。服務器應該易於部署在雲中或集羣上(不知道我是否使用了適當的術語......它應該在多個節點上運行)。然而,我是阿卡的新手,我一直在想如何實現這樣的事情。我現在想弄清楚的問題是如何在不同節點上的演員之間共享狀態。我的第一個想法是有一個駱駝演員會從我的世界客戶端讀取TCP流,然後將其發送到負載平衡器這將選擇將處理請求,然後發送通過TCP給客戶一些響應的節點。比方說,我有一個AuthenticationService實現actor來檢查用戶提供的憑據是否有效。每個節點都有這樣的角色(或者更多角色),並且所有角色應始終具有完全相同的數據庫(或狀態)的用戶。我的問題是,保持這種狀態的最佳方法是什麼?我已經想出了一些解決方案,我能想到的,但我沒有做這樣的事,所以請指出故障:阿卡和演員在集羣
解決方案#1:保持狀態在數據庫中。這可能對於這種身份驗證示例非常有效,其中狀態僅由用戶名和密碼列表表示,但在狀態包含不能輕易分解爲整數和字符串的對象的情況下可能不起作用。解決方案#2:每次向某個演員發出會改變其狀態的請求時,演員將在處理請求之後向所有其他將改變的相同類型的演員廣播關於該改變的信息他們的狀態根據原演員發送的信息。這看起來效率很低,而且很笨拙。
溶液#3:具有特定節點作爲排序的狀態下的節點,其中存在將是代表整個服務器的狀態的演員。任何其他演員,除了此類節點中的演員都沒有狀態,並且每次需要某些數據時都會詢問「狀態節點」中的演員。這似乎也是低效率的,並且有點過錯 - 不安全。
所以你有它。只有我真正喜歡的解決方案是第一個,但正如我所說的,它可能只適用於非常有限的問題子集(當狀態可以分解爲redis結構時)。來自更有經驗的大師的任何迴應都會非常受歡迎。 的問候,托馬斯·赫爾曼
嘿,非常感謝你的回答。這似乎比我想象的要難得多:]。我實際上不得不考慮這個問題一段時間,以確定我是否真的需要操作的原子性。我會檢查出這本書,謝謝你的提示。或者也許我可以使用其他節點作爲主節點的從節點,它可以容納所有的信息,而其他節點只需接收消息並對從主節點接收到的數據進行一些計算。儘管如此,仍然感覺不對。 – Arg 2011-03-31 18:28:04
不客氣。請記住,擁有主節點的問題始終是單點故障。如果您擔心容錯,那可能是一個問題。也許你也可以查看一些分佈式散列表實現來查看它們是否可以幫助你(例如Apache Cassandra)。 – axel22 2011-03-31 18:39:30
是的,容錯並不是什麼大問題。無論如何,目前還不是。此外,無論如何,我需要某種特權節點。 Minecraft客戶端將連接到的一個。 – Arg 2011-03-31 18:42:48