2015-08-04 3 views
2

Я хочу создать очередь заданий с несколькими рабочими. Сейчас я смотрю beanstalkd, но это скорее концептуальная проблема, я полагаю: как вы можете обеспечить, чтобы задания, связанные с одним объектом, обрабатывались по порядку?как бороться с условиями гонки среди рабочих мест, например. beanstalkd

Предположим, что рабочие управляют почтовой платформой для некоторого пользовательского интерфейса. Для заданного почтового ящика задания должны выполняться поочередно. Например, иногда пользователь хочет повторно ввести свой пароль в почтовую платформу во время устранения неполадок. Таким образом, они меняют свой пароль, а затем сразу меняют его. Это два задания смены пароля, отправленные beanstalkd.

Теперь, в большинстве случаев это будет хорошо, так как beanstalkd передаст эти рабочие места рабочим по порядку. Тем не менее, некоторая временная ошибка, такая как задержка поиска DNS, может привести к переходу второго пароля (назад к соответствующему) до первого, оставив почтовый ящик с неправильным паролем.

Я подумал о представлении полуфоров/мьютексов и о соотношении между рабочими машинами 1: 1: beanstalkd-server, но даже это будет работать только с запросами блокировок в запрошенном порядке, что не кажется полностью надежный. Наличие очереди на сущность открывает некоторые другие параметры, но для этого требуется поддержка сотен тысяч объектов.

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

ответ

1

Пара потенциальных методов приходит на ум.

  1. Как вы указываете, если вы не изменяете приоритеты, Beanstalkd является очередью FIFO. Это означает, что, если только один рабочий имеет дело с изменением пароля, он будет обрабатывать задания по порядку.
  2. Если есть несколько сотрудников, вы можете хранить метаданные вместе с паролем - последнее измененное время (точнее, когда был сделан запрос на изменение пароля). Это время будет установлено из задания, но если время, которое уже находится в базе данных (вместе с паролем), будет когда-либо новее, чем последний запрос - новый запрос будет удален как устаревший.

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

+0

спасибо, я даже не рассматривал метаданные. –