簡體   English   中英

這是一個很好的多線程服務器設計嗎?

[英]Is this a good multi-threaded server design?

我有一個服務器用於客戶端 - 服務器游戲(理想情況下是小型MMO的基礎),我正在嘗試確定組織一切的最佳方式。 以下是我的概述:

[server start]
load/create game state
start game loop on new thread
start listening for udp packets on new thread
while not closing
  listen for new tcp connection
    create new tcp client
    start clients tcp listener on new thread
save game state
exit

[game loop]
  sleep n milliseconds // Should I sleep here or not?
  update game state
  send relevant udp packet updates to client
  every second
    remove timed out clients

[listen for udp]
  on receive, send to correct tcp client to process

[listen for tcp] (1 for each client)
  manage tcp packets

這是一個公平的設計,用於管理游戲狀態,TCP連接和發送/接收udp數據包以進行狀態更新嗎? 有什么意見或問題嗎?

我最感興趣的是做游戲循環的最佳方式。 我知道如果我擁有大量客戶端會有問題,因為我為每個新客戶端生成一個新線程。

這似乎是設計的合理開端。 在擴展線程數量方面超越10個客戶端(根據您的評論)並不壞。 只要線程主要等待並且實際上沒有處理某些東西,您就可以在事情開始崩潰之前輕松地擁有數千個。 我記得在5年前用類似的設計達到了一些限制,它大約有7000個線程。

看起來像一個很好的設計。 如果我是你,我會使用像netty這樣的現有nio框架。

只是google java nio frameworks ,你會發現幾個帶有示例和文檔的框架。

更新

謝謝,但我更喜歡自己做這一切。 這僅適用於我的側面項目,其目的很大

通過使用現有框架並專注於游戲設計,您將從一開始就自己做所有事情。

下次你將知道如何設計游戲,這也使得設計IO框架變得更加容易。

我會說(特別是)在Java中,線程更多是為了方便而不是為了性能(只有很多內核,而且我想你想控制哪些線程具有優先級)。

您沒有說過有關消息交換量和客戶端數量的任何信息,但是您可能希望從單個線程處理網絡IO的角度考慮更自然,並讓它以緊密的循環方式分派傳入的請求,以及將ACTUAL工作(即在緊密循環中無法處理的請求)映射到線程池。 IIRC,在這樣的設置中,限制因素將是您可以在單個線程中同時等待輸入的最大TCP連接數。

為了增加樂趣,可以將其與具有更輕量級線程的語言的解決方案進行比較,例如在Erlang中。

當然,正如@WhiteFang34所說,在你對代碼進行嚴格的模擬/使用之前,你不需要這樣的解決方案。 這里的問題中也可以找到相關技術(以及像Netty這樣可以找到靈感的框架)。

線程創建有一定的成本, 主要是每線程堆棧

暫無
暫無

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

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