Обманчивая простота API Redis
Redis можно запустить как кластер для горизонтального масштабирования. И API вроде остается почти такое же — создал клиент чуть по-другому, и используй те же самые команды. Но есть нюанс — не все команды можно просто так взять и выполнить на кластере.
Пример — scan, которая позволяет искать ключи по паттерну.
В документации ничего подозрительного не написано, в клиенте используем метод scan
, тестируем локально, все зашибись.
На стейдже будет ждать сюрприз — приложение упадает с ошибкой.
Выясняется, что из-за шардинга нормально ключи не переберешь, и надо вместо scan
писать метод, чтобы найти все ноды кластера, и для каждой из них уже выполнить scan
.
Как мне кажется, это хороший пример нарушения принципа наименьшего удивления в API. Когда есть два клиента, отличающиеся только техническими деталями, ожидаешь, что их методы с одинаковыми названиями будут работать одинаково с точки зрения основной логики. А если нельзя сделать одинаковое поведение, то методы должны называться по-разному. Увы, реальность полна разочарований.