Hari-hari ini saya mencoba merancang arsitektur game mobile MMORPG baru untuk perusahaan saya. Game ini mirip dengan Mafia Wars, iMobsters, atau RISIKO. Ide dasarnya adalah menyiapkan pasukan untuk melawan lawan Anda (pengguna online).
Meskipun saya sebelumnya telah bekerja pada beberapa aplikasi seluler tetapi ini adalah sesuatu yang baru bagi saya. Setelah banyak perjuangan, saya datang dengan arsitektur yang diilustrasikan dengan bantuan diagram alir tingkat tinggi:
Kami telah memutuskan untuk menggunakan model client-server. Akan ada database terpusat di server. Setiap klien akan memiliki database lokal sendiri yang akan tetap sinkron dengan server. Basis data ini bertindak sebagai cache untuk menyimpan hal-hal yang tidak sering berubah misalnya peta, produk, inventaris dll.
Dengan model ini, saya tidak yakin bagaimana mengatasi masalah berikut:
- Apa cara terbaik untuk menyinkronkan server dan basis data klien?
- Haruskah suatu peristiwa disimpan ke DB lokal sebelum memperbaruinya ke server? Bagaimana jika aplikasi berhenti karena suatu alasan sebelum menyimpan perubahan ke DB yang terpusat?
- Apakah permintaan HTTP sederhana dapat digunakan untuk tujuan sinkronisasi?
- Bagaimana cara mengetahui pengguna mana yang saat ini masuk? (Salah satu cara bisa membuat klien terus mengirim permintaan ke server setelah setiap x menit untuk memberitahukan bahwa itu aktif. Jika tidak, anggap klien tidak aktif).
- Apakah validasi sisi klien sudah cukup? Jika tidak, bagaimana cara mengembalikan suatu tindakan jika server tidak memvalidasi sesuatu?
Saya tidak yakin apakah ini solusi yang efisien dan bagaimana skalanya. Saya akan sangat menghargai jika orang-orang yang sudah mengerjakan aplikasi semacam itu dapat berbagi pengalaman mereka yang mungkin membantu saya untuk menghasilkan sesuatu yang lebih baik. Terima kasih sebelumnya.
Informasi tambahan:
Sisi klien diimplementasikan dalam engine game C ++ yang disebut marmalade. Ini adalah mesin permainan lintas platform yang artinya Anda dapat menjalankan aplikasi di semua OS seluler utama. Kita tentu bisa mencapai threading dan yang juga diilustrasikan dalam diagram alir saya. Saya berencana menggunakan MySQL untuk server dan SQLite untuk klien.
Ini bukan permainan berbasis giliran sehingga tidak ada banyak interaksi dengan pemain lain. Server akan memberikan daftar pemain online dan Anda dapat melawan mereka dengan mengklik tombol pertempuran dan setelah beberapa animasi, hasilnya akan diumumkan.
Untuk sinkronisasi database saya memiliki dua solusi dalam pikiran:
- Simpan stempel waktu untuk setiap catatan. Catat juga kapan DB lokal terakhir diperbarui. Saat menyinkronkan, hanya pilih baris yang memiliki stempel waktu lebih besar dan kirim ke DB lokal. Simpan bendera isDeleted untuk baris yang dihapus sehingga setiap penghapusan hanya berperilaku sebagai pembaruan. Tetapi saya memiliki keraguan serius tentang kinerja karena untuk setiap permintaan sinkronisasi kami harus memindai DB lengkap dan mencari baris yang diperbarui.
- Teknik lain mungkin untuk menyimpan log dari setiap penyisipan atau pembaruan yang terjadi terhadap pengguna. Saat aplikasi klien meminta sinkronisasi, buka tabel ini dan cari tahu baris mana dari tabel yang telah diperbarui atau dimasukkan. Setelah baris-baris ini berhasil ditransfer ke klien, hapus log ini. Tapi kemudian saya memikirkan apa yang terjadi jika pengguna menggunakan perangkat lain. Menurut tabel log semua pembaruan telah ditransfer untuk pengguna itu tetapi sebenarnya itu dilakukan pada perangkat lain. Jadi kita mungkin harus melacak perangkat juga. Menerapkan teknik ini lebih memakan waktu tetapi tidak yakin apakah itu melakukan yang pertama.