Эффективно сватовство игроков в пожарном магазине - PullRequest
0 голосов
/ 09 февраля 2019

Я работаю над игрой, которая требует подбора игроков, т. Е. Помещением 2 игроков в 1 комнату боя.

Хотя в игре мало игроков, это не проблема, однако, если мы предположим сценарий1 000 000 игроков онлайн, которые все пытаются свести матчи, тогда картина становится более сложной.

Если предположить следующий поток

enter image description here

Моим первым инстинктом было:

  1. Когда игрок нажимает кнопку «play», вызывается облачная функция, которая проверяет, существует ли «открытая» комната битвы.
  2. Если есть один открытый, поместите в него игрока иначните битву или сделайте битву активной.
  3. Если не было открытой комнаты, мы создаем новую и ждем присоединения другого игрока.

Однако я вижуЗдесь много проблем, учитывая, что у нас есть 1 000 000 игроков, которые будут выполнять это действие.Например, выполняя шаг 2 и устанавливая комнату как «активную», мы могли бы подтолкнуть в нее больше игроков за время разрешения этих запросов?

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Насколько я понимаю, я могу предложить Один из способов сделать это проще - это иметь состояние самого пользователя вместо вызова облачной функции, чтобы создать комнату

  1. Сделать состояние пользователя как активное,онлайн, оффлайн.Когда пользователь нажимает кнопку воспроизведения, его состояние становится активным.

  2. Вызывает запрос, чтобы выбрать пользователя, где состояние == активно, ограничено 5 (пример).

  3. начать транзакцию, чтобы сопоставить ее с первым пользователем, если получится, изменить статус на игру для обоих, если не получится (вы получили совпадение с кем-то еще, или игрок, с которым вы пытались, получил совпадение с кем-то)проверьте следующего игрока.

  4. Если во время этого вы всегда должны следить за своим собственным состоянием, если оно меняется на игру, потому что кто-то другой подобрался к вам, тогда прямо в игру.

0 голосов
/ 09 февраля 2019

Если вы хотите иметь дело с параллелизмом, я думаю, что вы должны использовать транзакции для выполнения этого действия (добавление игрока в комнату).Таким образом, убедитесь, что комната еще открыта, прежде чем добавить в нее игрока.Если 2 игрока начнут сватовство одновременно и найдут одну и ту же комнату, то в эту комнату будет добавлен только один игрок https://firebase.google.com/docs/firestore/manage-data/transactions

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...