Есть еще несколько SO вопросов о параллелизме, но они не совсем соответствуют моему сценарию.
Итак, скажем, у меня есть игра, в которой пользователи взаимодействуют друг с другом, сражаются и еще много чего.В любой момент времени игрок может потенциально участвовать во множестве взаимодействий с другими игроками, каждый из которых может видеть происходящее событие.Когда какой-либо из этих игроков попадает на сайт, он должен обновить любые данные и показать их пользователю.
Пример ситуации: игрок A сражается с игроком B, и события происходят каждые несколько минут в этом бою.,В то же время, игрок А также взаимодействует с игроком С. По глупой удаче, события для обоих взаимодействий происходят следующим образом в ту же секунду.
Когда эта секунда прибывает, снова по глупой удаче,как игрок B, так и игрок C попадают на сайт одновременно, чтобы проверить статус своих боев с игроком A. Боевые действия требуют обновления информации об игроке A. Если я не буду правильно кодировать, данные A могут испортиться.
У меня есть две игры с этой ситуацией, каждая из которых имеет свое решение и разные проблемы.Один из них использует блокировку, поэтому, когда пользователь попадает на сайт, он получает блокировку для строки базы данных, читает данные для блокировок, которые он успешно получил, затем записывает изменения и снимает блокировку.Но иногда, по причинам, все еще неизвестным, это терпит неудачу, и блокировка застревает навсегда, пользователи жалуются, и мы должны исправить это вручную.Моя другая игра использует демон для выполнения этих операций, что делает выпуск (почти) спорный, поскольку есть только один процесс никогда не делает эти изменения.Но игроки все еще могут делать другие вещи в одно и то же время и потенциально могут вызывать ту же проблему.
Я читал немного о различных решениях этого, таких как оптимистическое управление или управление на основе временных меток.Я хотел бы спросить:
Какие из них наиболее часто используются в таких ситуациях, как моя, а какие проще всего реализовать?
Myследующий проект использует Kohana (PHP) и его ORM, поэтому мои записи в БД по умолчанию примут форму «просто перезаписать все эти поля».Нужно ли мне писать для этого собственные запросы на обновление или я могу получить решение, совместимое с ORM?
Как насчет транзакций с несколькими таблицами?Исход боя должен изменить таблицу боев и таблицу информации об игроке, возможно, и многое другое.С какими решениями здесь легче работать?Будут ли все мои таблицы нуждаться в столбцах меток времени транзакции?
Многие из этих решений говорят, что при возникновении конфликта либо повторите попытку, либо проигнорируйте.Что это значит для меня?Означает ли повторная попытка перезапустить весь сценарий, что приведет к дополнительному времени загрузки для пользователя?Я не думаю, что игнорировать является допустимым вариантом, так как события должны выполняться в какой-то момент.В других вопросах, которые я нашел, представление ошибки конфликта пользователю обычно было допустимым вариантом - для меня это не так.
Каковы последствия для производительности управления параллелизмом - этоэто даже стоит?