Чтобы уточнить ответ Вангоса, я бы добавил, что нужно также использовать какой-то механизм блокировки.Рассмотрите этот псевдокод PHP-ish здесь:
if (isFallback($token)) {
// Log the user in
} else {
// Usual processing
// If token has to be updated, save old token as fallback for a few seconds
}
Когда есть параллельные запросы, они могут оба оказаться в ветви else, один запрос вызовет обновление, а другой вызовет аннулирование токена.Я решил это путем использования именованного замка, названного в честь рассматриваемого $token
, чтобы обернуть ветвь else.Кроме того, все одновременные запросы, кроме одного, не смогут получить блокировку, и в этом случае мы немного поспим и повторим попытку (после повторной попытки мы обнаружим, что токен стал резервным токеном).
if (isFallback($token)) {
// Log the user in
} else {
$couldLock = lock($token);
if (!$couldLock) {
usleep(10000);
// Retry, possibly a recursive call
} else {
// Usual processing
// If token has to be updated, save old token as fallback for a few seconds
unlock($token);
}
}
Я надеюсьэти соображения могут быть полезны.