Как бороться с таймаутом read() в клиенте Redis?

Предположим, что мой клиент отправил команду "INCR" на сервер redis, но ответный пакет потерян, поэтому read() моего клиента истечет, но клиент не сможет определить, была ли выполнена операция INCR сервером.

что делать дальше? повторная отправка INCR или продолжение следующей команды? Если клиент повторно отправляет INCR, но если Redis ранее выполнял INCR на стороне сервера, этот ключ будет увеличен в два раза, а это не то, что нам нужно.

1 ответ

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

Например, некоторые люди склонны считать очень агрессивными значения своего времени ожидания, полагая, что Redis должен быть мягким хранилищем данных в реальном времени. Redis работает быстро, но вам также нужно учитывать сеть и саму систему. Проблемы, связанные с сетью, могут привести к большим задержкам. Если система начнет замену, это очень серьезно повлияет на время отклика Redis.

Я склонен думать, что установка тайм-аута менее 2 секунд - это нонсенс в любой системе Unix/Linux, и, если речь идет о сети, мне гораздо удобнее с 10 секундами. Люди ставят очень низкие значения, потому что хотят избежать блокирования своего приложения: это ошибка. Вместо того, чтобы устанавливать очень низкие тайм-ауты и поддерживать приложение синхронным, они должны разработать приложение асинхронным и установить разумные тайм-ауты.

После истечения времени ожидания клиент никогда не должен "продолжать" следующую команду. Он должен закрыть соединение и попытаться открыть новое. Если ответ (или запрос) был потерян, маловероятно, что клиент и сервер могут повторно синхронизироваться. Безопаснее закрыть соединение.

Если вы попытаетесь снова выдать INCR после переподключения? Это действительно зависит от вас. Но если тайм-аут чтения только что сработал, есть большая вероятность, что переподключение также истечет. Redis является однопоточным, когда он медленный для одного соединения, он медленный для всех соединений одновременно.

Другие вопросы по тегам