В веб-службе, над которой я работаю, данные пользователя должны обновляться в фоновом режиме - например, сносить и хранить их твиты. Поскольку эти обновления могут выполняться несколькими серверами, я хочу убедиться, что только один может одновременно обновлять данные любого отдельного пользователя. Поэтому (я считаю) мне нужен метод атомарного чтения (пользователь уже обновляется) и записи (нет? Тогда я собираюсь начать обновление). Чего мне следует избегать, так это:
- Сервер 1 отправляет запрос, чтобы проверить, обновляется ли пользователь.
- Сервер 2 отправляет запрос, чтобы проверить, обновляется ли пользователь.
- Сервер 1 получает ответ о том, что пользователь не обновляется.
- Сервер 2 получает ответ о том, что пользователь не обновляется.
- Сервер 1 начинает загружать твиты.
- Сервер 2 начинает загружать тот же набор твитов.
- Безумие !!!
Шаги 1 и 3 должны быть объединены в атомарную операцию чтения + записи, так что Шаг 2 должен будет дождаться завершения шага 3, прежде чем будет получен ответ. Существует ли простой механизм для эффективного обеспечения «блокировки» доступа к чему-либо на нескольких серверах, похожий на ключевое слово synchronized в Java (но, очевидно, распределенный по всем серверам)?