ทุกวันนี้ฉันพยายามออกแบบสถาปัตยกรรมของเกม MMORPG บนมือถือใหม่สำหรับ บริษัท ของฉัน เกมนี้คล้ายกับ Mafia Wars, iMobsters หรือ RISK แนวคิดพื้นฐานคือการเตรียมกองทัพให้พร้อมเพื่อต่อสู้กับคู่ต่อสู้ของคุณ (ผู้ใช้ออนไลน์)
แม้ว่าก่อนหน้านี้ฉันเคยทำงานกับแอพมือถือหลายตัว แต่นี่เป็นสิ่งใหม่สำหรับฉัน หลังจากการต่อสู้อย่างหนักฉันได้พบกับสถาปัตยกรรมที่แสดงด้วยความช่วยเหลือของแผนภาพการไหลระดับสูง:
เราตัดสินใจที่จะไปกับรูปแบบไคลเอนต์ - เซิร์ฟเวอร์ จะมีฐานข้อมูลส่วนกลางบนเซิร์ฟเวอร์ ลูกค้าแต่ละรายจะมีฐานข้อมูลท้องถิ่นของตัวเองซึ่งจะยังคงซิงค์กับเซิร์ฟเวอร์ ฐานข้อมูลนี้ทำหน้าที่เป็นแคชสำหรับจัดเก็บสิ่งต่าง ๆ ที่ไม่เปลี่ยนแปลงบ่อยครั้งเช่นแผนที่ผลิตภัณฑ์สินค้าคงคลังเป็นต้น
ด้วยรุ่นนี้ฉันไม่แน่ใจว่าจะแก้ไขปัญหาต่อไปนี้ได้อย่างไร:
- อะไรจะเป็นวิธีที่ดีที่สุดในการซิงโครไนซ์เซิร์ฟเวอร์และฐานข้อมูลลูกค้า
- เหตุการณ์ควรถูกบันทึกลงในฐานข้อมูลท้องถิ่นก่อนที่จะอัปเดตไปยังเซิร์ฟเวอร์หรือไม่ ถ้าแอพยุติลงด้วยเหตุผลบางอย่างก่อนที่จะบันทึกการเปลี่ยนแปลงในฐานข้อมูลส่วนกลาง
- คำร้องขอ HTTP แบบง่ายจะมีจุดประสงค์ในการซิงโครไนซ์หรือไม่
- จะทราบได้อย่างไรว่าผู้ใช้คนใดที่เข้าสู่ระบบอยู่ในปัจจุบัน? (วิธีหนึ่งอาจให้ไคลเอนต์ส่งคำขอไปยังเซิร์ฟเวอร์หลังจากทุก ๆ x นาทีเพื่อแจ้งว่ามีการใช้งานอยู่มิฉะนั้นให้ถือว่าไคลเอ็นต์ไม่ทำงาน)
- การตรวจสอบด้านลูกค้าเพียงพอหรือไม่ หากไม่มีวิธีการคืนค่าการกระทำหากเซิร์ฟเวอร์ไม่ได้ตรวจสอบบางอย่าง?
ฉันไม่แน่ใจว่านี่เป็นวิธีแก้ปัญหาที่มีประสิทธิภาพหรือไม่ ฉันจะขอบคุณมาก ๆ ถ้าคนที่ทำงานในแอพนั้นสามารถแบ่งปันประสบการณ์ซึ่งอาจช่วยให้ฉันได้เจอสิ่งที่ดีกว่า ขอบคุณล่วงหน้า.
ข้อมูลเพิ่มเติม:
ฝั่งไคลเอ็นต์ถูกนำไปใช้ในเอ็นจิ้นเกม C ++ ที่เรียกว่ามาร์มาเลด นี่คือเอ็นจิ้นเกมข้ามแพลตฟอร์มซึ่งหมายความว่าคุณสามารถเรียกใช้แอพของคุณในระบบปฏิบัติการมือถือที่สำคัญทั้งหมด เราสามารถบรรลุเธรดได้อย่างแน่นอนและยังแสดงให้เห็นในแผนภาพการไหลของฉัน ฉันวางแผนที่จะใช้ MySQL สำหรับเซิร์ฟเวอร์และ SQLite สำหรับลูกค้า
เกมนี้ไม่ใช่เกมเทิร์นเบสดังนั้นจึงไม่มีการโต้ตอบกับผู้เล่นคนอื่นมากนัก เซิร์ฟเวอร์จะให้รายชื่อผู้เล่นออนไลน์และคุณสามารถต่อสู้กับพวกเขาได้โดยคลิกที่ปุ่มการต่อสู้และหลังจากภาพเคลื่อนไหวบางอย่างจะมีการประกาศผล
สำหรับการซิงโครไนซ์ฐานข้อมูลฉันมีสองวิธีในใจ:
- จัดเก็บเวลาประทับสำหรับแต่ละระเบียน ติดตามเมื่อฐานข้อมูลท้องถิ่นได้รับการปรับปรุงล่าสุด เมื่อทำการซิงโครไนซ์ให้เลือกแถวเหล่านั้นที่มีการประทับเวลามากขึ้นและส่งไปยังฐานข้อมูลท้องถิ่น เก็บค่าสถานะ isDeleted สำหรับแถวที่ถูกลบดังนั้นการลบทุกครั้งจะทำหน้าที่เป็นการอัปเดต แต่ฉันมีข้อสงสัยอย่างมากเกี่ยวกับประสิทธิภาพการทำงานสำหรับคำขอซิงค์ทุกครั้งที่เราต้องสแกนฐานข้อมูลที่สมบูรณ์และค้นหาแถวที่อัปเดต
- อีกเทคนิคหนึ่งอาจจะเก็บบันทึกการแทรกหรือการอัพเดตแต่ละครั้งที่เกิดขึ้นกับผู้ใช้ เมื่อแอปไคลเอ็นต์ขอซิงค์ให้ไปที่ตารางนี้และดูว่าแถวใดของตารางที่ได้รับการปรับปรุงหรือแทรก เมื่อแถวเหล่านี้ถูกถ่ายโอนไปยังไคลเอ็นต์เรียบร้อยแล้วให้ลบบันทึกนี้ แต่ฉันคิดว่าจะเกิดอะไรขึ้นหากผู้ใช้ใช้อุปกรณ์อื่น ตามตารางบันทึกการอัปเดตทั้งหมดได้รับการถ่ายโอนสำหรับผู้ใช้รายนั้น แต่จริง ๆ แล้วที่ทำบนอุปกรณ์อื่น ดังนั้นเราอาจต้องติดตามอุปกรณ์ด้วย การใช้เทคนิคนี้ใช้เวลานานกว่า แต่ไม่แน่ใจว่ามันใช้งานได้ดีหรือไม่