Лучший способ создать пуленепробиваемый счетчик - PullRequest
0 голосов
/ 27 мая 2011

Я строю игровую систему, где многие игроки могут играть в настольные игры.Там могут быть сотни игровых столов одновременно.Система состоит из нескольких компонентов, основными из которых являются игровые серверы и DBworker, а между ними находится rabbitMQ.DBWorker - это компонент, который заботится о базах данных.

Итак, мне нужно убедиться, что каждая игра имеет уникальный идентификатор, чтобы правильно отслеживать результаты игр.Я хотел бы иметь какое-то решение с автоинкрементом.Конечно, я могу сделать какую-то последовательность в БД PostgreSQL и каждый раз получать новый идентификатор, но для меня это кажется очевидным узким местом (я не хочу постоянно связываться с БД. В случае отказа БД шоу должно идтипока наши инженеры восстанавливают БД).

Итак, есть ли у вас какие-либо идеи или личный опыт внедрения чего-то подобного?Не уверен, почему я так думаю - если я ошибаюсь, поправьте меня.

Спасибо всем заранее!

Ответы [ 2 ]

2 голосов
/ 27 мая 2011

Требуется ли, чтобы идентификатор был целым числом? Если нет, то почему бы просто не использовать UUID (RFC 4122)? Я полагаю, что случайный UUID должен быть достаточно хорошим для вашей цели.

0 голосов
/ 27 мая 2011
  • Вы должны убедиться, что все идентификаторы игр созданы в одном месте - что-то вроде «Фабрики».
  • При заданном начальном значении (последнее известное / записанное удостоверение личности) фабрика генерирует следующее логическое значение - обычное старое инкрементное целое число будет в порядке).
  • Если фабрика находится в памяти (вместе с остальной логикой), у нее не должно возникнуть проблем при управлении генерацией уникальных идентификаторов. Если он работает во время выполнения, в памяти, как еще одна часть приложения, это означает, что вы не будете возвращаться к БД каждый раз.
  • В какой-то момент данные (включая идентификатор будут сохранены - это место, где «последний известный идентификатор» появится при следующем запуске. Единственный риск заключается в том, что вам никогда не удастся полностью сохранить этот идентификатор до завода-изготовителя). нужно снова.

Я делал то же самое с простым настольным приложением, которое я создал для личного использования, всякий раз, когда я сохраняю объект, в приложении вы генерируете новый уникальный идентификатор - который представлял собой простое целое число, основанное на последнем значении (+1). В определенные моменты жизненного цикла запущенного приложения я сохраняю состояние на диск (сериализованный XML). Единственный раз, когда это не удастся, - это если я не могу открыть ранее сохраненный XML при запуске, то есть когда приложение получает начальное значение для увеличения.

Я не знаю, пуленепробиваемый или "лучший", но он хорошо работал для того, что мне нужно.

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