Automatch / pemain antrian


8

Saya menggunakan Node.js dan Redis. Saya mencoba menemukan cara yang dapat diandalkan untuk mengotomatiskan pemain. Ada server yang cocok dan kemudian beberapa server game disiapkan.

Berikut ini adalah apa yang saya butuhkan untuk terjadi:

  1. Pemain mengirimkan permintaan bergabung dengan jenis permainan (kecil / sedang dll)
  2. Server yang cocok menambah pemain ke jenis permainan saat ini yang sedang menunggu pemain
  3. Server gim mengirimkan ID gim kepada pemain

Saat ini saya telah menerapkan ini sebagai berikut:

  1. Server yang cocok mendengarkan game: antrian: kecil menggunakan BRPOP
  2. Memeriksa apakah game: antrian: kecil: id = id ada
  3. Memeriksa apakah game: id: panjang pengguna <= 6 (pemain maks)
  4. Menambahkan pemain ke permainan: id: daftar pengguna jika ada
  5. Jika panjang game sekarang 6, itu akan menghapus game: antrian: kecil: id

Jika server yang cocok menemukan game: antrian: kecil: id tidak ada, itu adalah sebagai berikut:

  1. Game INCR: nextGameId
  2. Setel permainan: antrian: kecil: id ke ID yang dibuat sebelumnya
  3. Menambahkan ID game ke game: antrian: menunggu

Server game menunggu menggunakan BRPOP untuk game baru. Ketika mereka mendapatkannya, mereka menunggu sampai permainan memiliki minimal 2 pengguna kemudian memulai timer. Jika mereka tidak mengisi waktu itu, mereka mulai dengan pengguna yang mereka miliki dan kemudian menghapus game: antrian: kecil: id (sehingga memaksa mak comblang untuk meminta game baru).

Sementara metode saya bekerja, saya tidak yakin itu akan bekerja dengan baik dalam produksi dan tampaknya sangat berbelit-belit. Saya dapat melihat potensi untuk masalah berikut:

  • Server permainan macet setelah menerima ID permainan dari daftar tunggu sehingga pengguna ditambahkan ke permainan: id: pengguna tetapi tidak ada yang terjadi dengan mereka (kerusakan itu sendiri bukan masalah, tetapi pengguna terus menambahkan bahwa antrian permainan adalah )
  • Jika pengguna terputus dan game belum dimulai, server game akan menghapus pengguna dari game: id: daftar pengguna. Sementara itu sedang dalam proses melakukan itu, server perjodohan bisa menambahkan pengguna ke daftar dan berpikir permainan sudah penuh, sehingga menghapusnya dari antrian.

Pikiran awal saya adalah berubah menjadi satu antrian pengguna yang menunggu satu jenis permainan. Namun, ini menyajikan masalah lebih lanjut:

  • Jika server yang disambungkan pengguna mengalami kerusakan, server tidak akan menghapus pengguna dari antrian sehingga meninggalkan pengguna untuk dimasukkan ke dalam permainan saat mereka tidak ada. Saya dapat menggunakan set yang disortir untuk menyimpan waktu permintaan dan meminta polling klien sampai mendapat ID permainan yang dikembalikan, tetapi ini berarti bahwa saya tidak tahu berapa lama klien menunggu dan karena itu tidak tahu apakah akan memulai permainan dengan lebih sedikit pengguna.
  • Tanpa menempatkan pengguna ke dalam game, mereka tidak memiliki kemampuan untuk melihat apa yang telah bergabung dengan pengguna, atau kemampuan untuk mengobrol dengan pengguna yang menunggu (karena itu membutuhkan ID game).

Tak satu pun dari cara saya mengatur ini terasa benar jadi saya berharap seseorang mungkin dapat menawarkan beberapa saran yang lebih baik. Saya benar-benar harus menjaga server game dan server perjodohan terpisah agar tumbuh mereka seperti yang diperlukan.


Masalah basis data yang telah saya atasi di sini: stackoverflow.com/questions/15172556/…
Chris Evans

Di Cek jika permainan: antrian: kecil: id = id ada , Bagaimana Anda mendapatkan ID?
Rayon

Jawaban:


1

Kesalahan pertama dan terpenting Anda adalah menggunakan database untuk antrian langsung, bahwa data jauh lebih baik disimpan dalam memori proses dalam proses perjodohan. Biarkan proses berkomunikasi satu sama lain secara langsung. Maka itu juga cukup banyak dipaksakan pada Anda bahwa itu adalah tanggung jawab server perjodohan untuk menghapus pemain dari antrian ketika mereka dimasukkan ke dalam permainan, sebagaimana mestinya.

Lebih umum tentang perjodohan, tunda keputusan pertandingan yang tepat hingga titik di mana permainan dimulai, jika Anda memiliki 3 pemain yang cocok dengan permainan 4 pemain, jangan putuskan bahwa mereka harus memainkan jenis permainan itu sebelum ada juga pemain ke-4, mungkin butuh waktu lama untuk pemain itu tiba, dan beberapa dari mereka mungkin berhenti menunggu sementara itu. Implementasi yang layak untuk ini adalah memiliki antrian untuk setiap jenis permainan dan menempatkan setiap pemain dalam semua antrian yang sesuai dengan permintaan mereka, kemudian ketika antrian penuh memulai permainan dan menghapus pemain yang terlibat dari semua antrian mereka.


Saya menggunakan Redis sebagai pegangan antrian dengan baik. Saya awalnya mengelola perjodohan di dalam server itu sendiri dan itu bekerja dengan sangat baik tetapi saya menemukan dua masalah dengan pendekatan ini: Saya tidak bisa menemukan cara untuk skala itu dan kedua bagaimana server meminta permainan baru untuk memulai di server lain. Itu bisa mengirim pesan kepada mereka semua tetapi kemudian bebannya tidak seimbang?
Chris Evans

1
@ChrisEvans Anda tidak perlu terlalu khawatir tentang penskalaan, proses perjodohan sederhana dapat menangani ribuan inisiasi game per detik. Jika Anda hanya mengkodekannya dengan baik, Anda tidak perlu perjodohan untuk menskalakan ke beberapa proses, bahkan jika Anda mendapatkan jutaan pelanggan. Sedangkan untuk menyeimbangkan beban pada server game, pendekatan round robin sederhana di mana setiap server game mendapatkan game baru pada gilirannya masuk akal efektif jika server umumnya dapat menangani sejumlah besar game masing-masing. Kalau tidak, Anda dapat secara berkala menanyakan server permainan seberapa sibuknya mereka, itu tidak harus terjadi sekali per game baru.
aaaaaaaaaaaa
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.