Как обработать разовое обновление ресурса в заданном временном окне - PullRequest
0 голосов
/ 09 марта 2020

Я получаю несколько обновлений местоположения с устройства для определенного идентификатора ресурса. Эти обновления местоположения также могут быть получены с интервалом в секунды или миллисекунды.

Я хочу обработать только одно обновление для любого конкретного идентификатора ресурса в данном временном окне, скажем, 10 секунд.

В настоящее время я читаю последний обработанный запрос для этого идентификатора ресурса из кластера redis и проверяю, превышает ли разница времени более 30 секунд, тогда только я обрабатываю запрос.

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

Есть ли способ предотвратить этот сценарий?

1 Ответ

0 голосов
/ 11 марта 2020

Вы можете использовать setnx (установить, если не существует). Для идентификатора ресурса 1 в любой временной отметке делите 10000 (10 секунд). Например, отметка времени 1583906206000, значение будет 158390620. И создайте ключ как resource_1_time_158390620. До следующих 10 секунд наш ключ будет таким же.

setnx resource_1_time_158390620 value

Если несколько серверов приложений пытаются выполнить несколько запросов в течение 10 секунд, значение будет установлено только для первого. Также эта команда возвращает 1, означающее, что значение установлено, и 0, означающее, что значение уже присутствует. Вы также можете использовать это.

...