Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni
🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!21.06.2023
Версіювання кешу
Фольклор програмування каже, що складних проблем всього дві — іменування та очищення кешу. Сьогодні натрапив на не найбільш очевидну ситуацію, коли кеш пора очистити.
Є сервіс. Він повертає конфігурацію. Конфігурація потрібна часто, а отримується повільно. Тому вона кешується. В цьому випадку кеш дуже абстрагований та просто зберігає все, що повертає сервіс. Тому для споживача чи є кеш, чи немає — непомітно.
Кеш цей чиститься за терміном придатності — тобто, взагалі коду, який його явно чистить, немає.
Проблема зʼявилась, коли я додав до об’єкта конфігурації ще одне поле. Тести пройшли, звісно — як юніт-тести, так й інтеграційні. А на стейджингу виявилось, що поле порожнє та повʼязана логіка падає. Це трапилось тому, що в кеші було збережена конфігурація, збережена минулою версією коду.
Для таких ситуацій є одне пряме рішення — ключ кешу маємо поміняти так, щоб новий код не міг знайти старий кеш. Класично, в ключі має міститься версія: config:v1:
, config:v2:
і так далі. Так старі значення будуть видалені за терміном. Цей підхід залишає роботу з кешем в одному шарі, та не розмазує обробку неочікуваних ситуацій по програмі.
Однак мені більш цікаво, як не пропустити таку помилку. Бо коли ти працюєш над сервісом, то кеш знаходиться поза зоною уваги. Найкраще, що придумав — то присипати код коментарями (а саме, біля структури з конфігурацією додати коментар “не забудь оновити версію кешу, коли редагуєш цю структуру”).