ข้อมูลเกี่ยวกับสถาปัตยกรรมเซิร์ฟเวอร์ MMO ที่ไร้รอยต่อ


9

ฉันกำลังมองหาวัสดุใด ๆ บนเซิร์ฟเวอร์ MMO ที่ไร้รอยต่อ! ฉันมีบทความเล็ก ๆ น้อย ๆ ในหนังสือ "Massively Multiplayer Game Development" และ "Game Programming Gems 5" มีใครเคยมีประสบการณ์ในหัวข้อนั้นหรือรู้บทความเกี่ยวกับเรื่องนั้นบ้าง?

ฉันสนใจใน "มุมมองระดับสูง" เช่นเดียวกับการใช้งาน นี่อาจเป็นหัวข้อของวิทยานิพนธ์หลักของฉันและฉันต้องการค้นหาว่าการเขียนระบบดังกล่าวยากเพียงใดก่อนที่ฉันจะเริ่มทำวิทยานิพนธ์ ตอนนี้ฉันยังไม่ได้ตัดสินใจว่าจะใช้ภาษาใดฉันกำลังคิดเกี่ยวกับ Java หรือ Scala Erlang อาจเป็นทางเลือก แต่ฉันไม่เคยทำงานด้วย

หมายเหตุ: ความต้องการขั้นพื้นฐานจะเป็นการเคลื่อนไหว ระบบเกมอื่น ๆ เป็นทางเลือกและให้ "เครดิตโบนัส"

ตอนนี้สำหรับสิ่งที่ฉันหมายถึงกับ "เซิร์ฟเวอร์ที่ไร้รอยต่อ": ฉันต้องการตั้งค่าเซิร์ฟเวอร์คลัสเตอร์ที่ทุกโหนดควบคุมบางส่วนของโลกเกมที่มีขอบเขตคงที่ ผู้เล่นสามารถย้ายจากปลายด้านหนึ่งของโลกไปยังอีกฝั่งหนึ่งโดยไม่ต้องสลับอินสแตนซ์หรือกดปุ่ม "teleporter" ฉันคิดว่า WoW ทำเช่นนั้น ในแบ็คเอนด์ของฉันอย่างไรก็ตามผู้เล่นเปลี่ยนจากเซิร์ฟเวอร์หนึ่งไปเป็นเซิร์ฟเวอร์ถัดไป


ซักพักฉันอ่านว่าเซิร์ฟเวอร์ WoW แต่ละตัวมีเบลด 5+ - 1 สำหรับแต่ละทวีปและฐานข้อมูล เคยเป็นดันเจี้ยนและสนามรบแม้ว่าฉันจะสมมติว่าตอนนี้พวกมันอยู่ในกลุ่มของตัวเองเพื่อให้สามารถเชื่อมต่อข้ามอาณาจักรได้ ในระยะสั้นแม้ว่าทวีปจะถูกเก็บไว้ในเซิร์ฟเวอร์หนึ่ง - ไม่มีจุดที่คุณเปลี่ยนไปเป็นเซิร์ฟเวอร์อื่นจนกว่าคุณจะเปลี่ยนทวีป
ผ่อนปรน

ที่น่าสนใจคุณจำได้ไหมว่าอ่านที่ไหน อย่างที่ฉันพูดฉันไม่เคยเล่น WoW และไม่รู้ว่าทวีปใหญ่แค่ไหน แต่ฉันไม่สามารถจินตนาการได้ว่าแต่ละทวีปนั้นโฮสต์อยู่บนเซิร์ฟเวอร์แยกกัน
Lurca

3
สถิติเซิร์ฟเวอร์ WoW: เบลดเซิร์ฟเวอร์รวม 13,250 เบลดแกน CPU รวม 75,000 คอร์, RAM 112.5 เทราไบต์ (จาก GDC Austin 09) ดูที่นี่ ; ไม่จำเป็นต้องอุทิศให้กับ WoW ทั้งหมด แต่อยู่ใกล้พอสมควร

@Josh Petrie: ขอบคุณพบบทความก่อนหน้านี้ในวันนี้ แต่ฉันยังคงมองหาสถาปัตยกรรมเซิร์ฟเวอร์ที่ต่อเนื่องหรือต่อเนื่อง
Lurca

คำตอบ:


5

ความซับซ้อนหลักในการจัดการระบบดังกล่าวมาจากความต้องการที่ไร้รอยต่อของคุณ ดังที่ Josh ได้กล่าวไว้การแก้ปัญหาการส่งเอนทิตีจากเซิร์ฟเวอร์หนึ่งไปยังเซิร์ฟเวอร์อื่นเป็นส่วนสำคัญของแพ็คเกจ

นี่ไม่ใช่ปัญหาเดียว - ถ้าเอนทิตีข้ามหลายเซิร์ฟเวอร์ต้องโต้ตอบเป็นส่วนหนึ่งของการดำเนินการตอนนี้คุณมีปัญหาการซิงโครไนซ์ซึ่งแต่ละระบบต้องการข้อมูลจากอีกด้านหนึ่งเพื่อดำเนินการต่อ แต่เมื่อถึงเวลาที่ข้อมูลมาถึง ถูกต้องแล้ว คุณสามารถพยายามที่จะแก้ปัญหานี้โดยแบ่งการดำเนินงานออกเป็นหลายข้อความที่มีความสามารถย้อนกลับถ้าด้านหนึ่งหลังออก แต่เป็นคุณเห็นได้จากบทที่ 3.1 ใน "Massively Multiplayer การพัฒนาเกม" นี้อย่างมีนัยสำคัญความซับซ้อนตรรกะเกมใด ๆ ที่คุณจะต้อง ทำสิ่งนี้ด้วย Scala และ Erlang ช่วยให้คุณได้รับระบบการส่งข้อความที่ถูกต้อง - พวกเขาไม่ได้ช่วยให้คุณสลายตัวของสิ่งที่เคยเป็นฟังก์ชั่น 10 บรรทัดในข้อความที่แตกต่างกันและสถานะที่คุณต้องติดตาม

เห็นได้ชัดว่าปัญหานี้ไม่ใช่เรื่องใหม่ทั้งหมดและฐานข้อมูลเชิงสัมพันธ์สนับสนุนปัญหาประเภทนี้โดยการจัดเก็บข้อมูลทั้งหมดจากส่วนกลางและปล่อยให้ลูกค้าหลายคนสอบถามและแก้ไขตามที่พวกเขาต้องการย้อนกลับธุรกรรมที่จำเป็น สิ่งนี้ช่วยให้คุณมีความต้องการความถูกต้องมากที่สุด แต่น่าเสียดายที่ทำให้เกิดปัญหาเกี่ยวกับประสิทธิภาพการทำงานที่ไม่ได้ผลรวมถึงทำให้การใช้งานเกมเป็นไปอย่างเชื่องช้า (เนื่องจากตรรกะส่วนใหญ่ของคุณถูกเขียนในกระบวนการจัดเก็บฐานข้อมูล ฐานข้อมูลประเภทอื่นอาจเป็นทางออกที่ดีโดยเฉพาะถ้าคุณยินดีแลกเปลี่ยนความต้องการด้านความน่าเชื่อถือที่ RDBMS ส่วนใหญ่มีให้

เกมมืออาชีพส่วนใหญ่แก้ไขปัญหานี้โดยไม่พยายามแม้แต่น้อยโดยทำให้ขนาดของชิ้นส่วนเล็กพอที่จะทำให้ผู้เล่นทุกคนบนเซิร์ฟเวอร์เดียวโดยแบ่งโลกออกเป็นส่วน ๆ ที่ไม่ได้มีปฏิสัมพันธ์จริงๆ (ดูตัวอย่าง WoW ในความคิดเห็นด้านบน) หรือโดยการกระจายเกมข้ามเซิร์ฟเวอร์ตามฟังก์ชั่นมากกว่าที่ตั้งทางภูมิศาสตร์ (เช่นการต่อสู้ทั้งหมดเกิดขึ้นบนเซิร์ฟเวอร์เครื่องหนึ่งแชททั้งหมดบนอีกเซิร์ฟเวอร์หนึ่ง) เพื่อให้ไม่มี 'ตะเข็บ' ที่จะต่อสู้


3

ฉันสนใจใน "มุมมองระดับสูง" เช่นเดียวกับการใช้งาน

โดยทั่วไปแล้วการใช้งานนั้นมีส่วนเกี่ยวข้องอย่างลึกซึ้งพอสมควรและคุณอาจไม่เห็นพวกเขาพูดถึงที่นี่มากนัก ซอฟต์แวร์ StackExchange นั้นไม่เหมาะกับการสนทนาที่เกี่ยวข้องอย่างมากและไม่ต้องพูดถึงว่ามันจะเกี่ยวข้องกับการลงทุนครั้งสำคัญของใครบางคน

ฉันอยากจะรู้ว่ามันยากแค่ไหนในการเขียนระบบดังกล่าว

ไม่ยากหรือมากไปกว่าระบบอื่น ๆ : มันจะขึ้นอยู่กับความต้องการของคุณและคุณสมบัติที่คุณต้องการขับ คุณสามารถเขียนการใช้งานเล็ก ๆ น้อย ๆ แต่แน่นอนว่าสิ่งที่ไม่ใช่เรื่องไม่สำคัญจะเป็นเรื่องยากมาก หนึ่งในปัญหาที่ใหญ่กว่าคือคุณอาจไม่มีลูกค้าจริงเพียงพอที่จะบอกได้ว่าระบบของคุณขยายไปสู่ระดับ "ใหญ่"ที่ WoW และเกมอื่นทำงานอยู่หรือไม่

MMO ไม่ใช่เวทมนต์ เทคโนโลยีส่วนใหญ่ของพวกเขานั้นไม่มีอะไรพิเศษเมื่อแยกออกมามันเป็นเพียงการรวมกันของบิตที่เล็กลงและเรียบง่ายกว่าของเทคโนโลยีเข้าด้วยกันอย่างชาญฉลาดเพื่อให้มีขนาดใหญ่ขึ้น

ฉันต้องการตั้งค่าเซิร์ฟเวอร์คลัสเตอร์ที่ทุกโหนดควบคุมบางส่วนของโลกของเกมโดยมีขอบเขตคงที่ ผู้เล่นสามารถย้ายจากปลายด้านหนึ่งของโลกไปยังอีกฝั่งหนึ่งโดยไม่ต้องสลับอินสแตนซ์หรือกดปุ่ม "teleporter"

สิ่งสำคัญที่คุณกำลังพูดถึงคือการจำลองสถานการณ์จำลองด้วยมือ สิ่งนี้สามารถทำได้ค่อนข้างง่ายและไม่จำเป็นต้องเป็นเทคโนโลยีเฉพาะ MMO (เกมแบบเพียร์ทูเพียร์มีแนวโน้มที่จะสนับสนุนกลไกพื้นฐานเดียวกันทั้งหมดในการใช้การย้ายโฮสต์) หลักฐานขั้นพื้นฐานคือการให้แต่ละเซิร์ฟเวอร์เข้าใจโทโพโลยีของเซิร์ฟเวอร์ "รอบ" (โดยเฉพาะเซิร์ฟเวอร์สำหรับโหนดโลกต้องรู้เกี่ยวกับเซิร์ฟเวอร์สำหรับโหนดโลกที่อยู่ติดกับการจำลอง) รวมถึงการกำหนดบัฟเฟอร์รอบ ๆ ที่คุณพิจารณา เอนทิตีจำลองเฉพาะ "ปิด" ไปยังเซิร์ฟเวอร์ที่อยู่ติดกัน

เมื่อเอนทิตีเข้าสู่บัฟเฟอร์ "ปิด" คุณเริ่มรายงานไปยังเซิร์ฟเวอร์ที่อยู่ติดกันเช่นกัน เมื่อเอนทิตีข้ามขีด จำกัด จริงคุณส่งข้อความไปยังเซิร์ฟเวอร์ที่อยู่ติดกันด้วยสถานะเต็มของเอนทิตีและข้อความระบุว่าเซิร์ฟเวอร์ที่อยู่ติดกันควรใช้เวลามากกว่าเอนทิตี เห็นได้ชัดว่าคุณต้องการให้สิ่งนี้เชื่อถือได้มากที่สุด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.