Những ngày này, tôi đang cố gắng thiết kế kiến trúc của một game di động MMORPG mới cho công ty của tôi. Trò chơi này tương tự như Mafia Wars, iMobsters hoặc RISK. Ý tưởng cơ bản là chuẩn bị một đội quân để chiến đấu với đối thủ của bạn (người dùng trực tuyến).
Mặc dù trước đây tôi đã làm việc trên nhiều ứng dụng di động nhưng đây là điều mới mẻ đối với tôi. Sau rất nhiều cuộc đấu tranh, tôi đã tìm ra một kiến trúc được minh họa với sự trợ giúp của sơ đồ dòng cấp cao:
Chúng tôi đã quyết định đi với mô hình máy khách-máy chủ. Sẽ có một cơ sở dữ liệu tập trung trên máy chủ. Mỗi khách hàng sẽ có cơ sở dữ liệu cục bộ riêng sẽ đồng bộ với máy chủ. Cơ sở dữ liệu này hoạt động như một bộ đệm để lưu trữ những thứ không thay đổi thường xuyên, ví dụ như bản đồ, sản phẩm, hàng tồn kho, v.v.
Với mô hình này, tôi không biết làm thế nào để giải quyết các vấn đề sau:
- Điều gì sẽ là cách tốt nhất để đồng bộ hóa cơ sở dữ liệu máy chủ và máy khách?
- Một sự kiện có nên được lưu vào DB cục bộ trước khi cập nhật nó lên máy chủ không? Điều gì xảy ra nếu ứng dụng chấm dứt vì một số lý do trước khi lưu các thay đổi vào DB tập trung?
- Các yêu cầu HTTP đơn giản sẽ phục vụ mục đích đồng bộ hóa?
- Làm thế nào để biết người dùng nào đang đăng nhập? (Một cách có thể là để khách hàng tiếp tục gửi yêu cầu đến máy chủ sau mỗi x phút để thông báo rằng nó đang hoạt động. Nếu không, hãy xem xét một khách hàng không hoạt động).
- Là xác nhận phía khách hàng là đủ? Nếu không, làm thế nào để hoàn nguyên một hành động nếu máy chủ không xác thực một cái gì đó?
Tôi không chắc đây có phải là một giải pháp hiệu quả hay không và nó sẽ mở rộng như thế nào. Tôi thực sự đánh giá cao nếu những người đã làm việc trên các ứng dụng như vậy có thể chia sẻ kinh nghiệm của họ, điều này có thể giúp tôi tìm ra thứ gì đó tốt hơn. Cảm ơn trước.
Thông tin bổ sung:
Phía máy khách được triển khai trong công cụ trò chơi C ++ có tên là marmalade. Đây là một công cụ trò chơi đa nền tảng, có nghĩa là bạn có thể chạy ứng dụng của mình trên tất cả các hệ điều hành di động lớn. Chúng tôi chắc chắn có thể đạt được luồng và cũng được minh họa trong sơ đồ dòng của tôi. Tôi đang dự định sử dụng MySQL cho máy chủ và SQLite cho máy khách.
Đây không phải là một trò chơi theo lượt nên không có nhiều tương tác với người chơi khác. Máy chủ sẽ cung cấp danh sách người chơi trực tuyến và bạn có thể chiến đấu với họ bằng cách nhấp vào nút chiến đấu và sau khi một số hình ảnh động, kết quả sẽ được công bố.
Để đồng bộ hóa cơ sở dữ liệu, tôi có hai giải pháp:
- Lưu dấu thời gian cho mỗi bản ghi. Cũng theo dõi khi DB cục bộ được cập nhật lần cuối. Khi đồng bộ hóa, chỉ chọn những hàng có dấu thời gian lớn hơn và gửi đến DB cục bộ. Giữ một cờ isDelatted cho các hàng đã xóa để mọi thao tác xóa chỉ đơn giản là hoạt động như một bản cập nhật. Nhưng tôi có nghi ngờ nghiêm trọng về hiệu suất vì đối với mọi yêu cầu đồng bộ hóa, chúng tôi sẽ phải quét DB hoàn chỉnh và tìm kiếm các hàng được cập nhật.
- Một kỹ thuật khác có thể là giữ một bản ghi của mỗi lần chèn hoặc cập nhật diễn ra đối với người dùng. Khi ứng dụng khách yêu cầu đồng bộ hóa, hãy chuyển đến bảng này và tìm hiểu các hàng của bảng nào đã được cập nhật hoặc chèn. Khi các hàng này được chuyển thành công đến máy khách, hãy xóa nhật ký này. Nhưng sau đó tôi nghĩ về những gì sẽ xảy ra nếu người dùng sử dụng thiết bị khác. Theo bảng nhật ký, tất cả các bản cập nhật đã được chuyển cho người dùng đó nhưng thực tế điều đó đã được thực hiện trên một thiết bị khác. Vì vậy, chúng tôi có thể phải theo dõi thiết bị cũng. Việc thực hiện kỹ thuật này tốn nhiều thời gian hơn nhưng không chắc nó có thực hiện được việc đầu tiên không.