簡體   English   中英

網頁游戲並發控制

[英]Web game concurrency control

關於並發還有其他一些SO問題,但是它們並不能完全解決我的問題。

假設我有一個游戲,用戶可以互相交流,打架等等。 在任何給定時間,玩家可能會與其他玩家進行多次交互,所有其他人都可以看到事件的發生。 當這些播放器中的任何一個訪問該站點時,它需要更新所涉及的任何數據並將其顯示給用戶。

情況示例:玩家A與玩家B戰斗,並且在這場戰斗中每隔幾分鍾發生一次事件。 同時,玩家A也正在與玩家C互動。由於運氣不好,兩種互動的事件都恰好在同一秒發生。

當第二秒到來時,運氣再一次變得愚蠢,玩家B和玩家C都同時擊中了該站點,以便檢查他們與玩家A的戰斗狀態。戰斗需要更新有關玩家A的信息。如果我不這樣做,如果編碼不正確,A的數據可能會混亂。

在這種情況下,我有兩個游戲,每個游戲都有不同的解決方案和不同的問題。 其中一個使用鎖,因此當用戶訪問該站點時,他們會在數據庫行上獲取一個鎖,讀取成功獲取的鎖的數據,然后寫入更改並釋放該鎖。 但是有時,由於仍然未知的原因,此操作將失敗並且鎖將永遠卡住,用戶會抱怨,我們必須手動對其進行修復。 我的另一款游戲使用守護程序執行這些事務,(幾乎)沒有問題,因為只有一個進程進行了這些更改。 但是玩家仍然可以同時做其他事情,並有可能引起同樣的問題。

我已經閱讀了一些有關此問題的不同解決方案的信息,例如樂觀或基於時間戳的控制。 我想問一下:

  1. 其中哪一個最常見於我的情況,哪個最容易實現?

  2. 我的下一個項目使用Kohana(PHP)及其ORM,因此默認情況下,我的數據庫寫入將采用“僅覆蓋所有這些字段”的形式。 我是否需要為此編寫自己的更新查詢,還是可以獲得與ORM兼容的解決方案?

  3. 涉及多個表的事務呢? 戰斗的結果必須更改戰斗表和玩家信息表,可能還需要更改更多內容。 哪些解決方案在這里更容易使用? 我所有的表都需要事務時間戳列嗎?

  4. 這些解決方案中有很多都說發生沖突時,請重試或忽略。 這對我意味着什么? “重試”是否意味着重新啟動整個腳本,這將導致用戶增加加載時間? 我認為忽略不是有效的選項,因為事件必須在某個時刻執行。 在我發現的其他問題中,向用戶顯示沖突錯誤通常是一個有效的選擇-對我而言不是。

  5. 並發控制對性能的影響是什至值得嗎?

我認為您要查找的內容已經包含在您的問題中:交易。 如果使用的是MySQL,則需要使用innoDb引擎設置表才能使用事務。 一些文件:

盡量不要嘗試重新發明輪子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM