Don't “let it crash”, let it heal
Elixir-миф #1: «Let it crash»
Фраза «let it crash» вводит в заблуждение: звучит так, будто приложение падает, хотя речь всегда идёт об отдельном процессе, который супервизор мгновенно перезапустит. Приложение при этом живёт.
Проблема: процессы связаны с реальными вещами — сокетами, HTTP-запросами, файлами, БД. Пример LiveView:
def handle_event("import_data", %{"data" => data}, socket) do
Enum.each(data, &create_item/1)
{:noreply, socket}
end
Код упадёт, если:
- имя события не совпадёт;
- нет ключа
"data"
; data
не список;- ошибка в
create_item/1
.
Первые три случая — скорее баг фронтенда, падение допустимо. Но последний — ошибка валидации одного элемента, и из-за неё весь веб-сокет пользователя рвётся, UI пропадает. Это плохой UX.
Что делать вместо «let it crash»
- Валидируй вход до бизнес-логики.
- Возвращай ошибки пользователю, а не падай.
- Перезапускай только то, что действительно сломалось (например, соединение с БД), а не весь контекст пользователя.
Слоган лучше переформулировать:
«Не позволяй падать — позволяй исцеляться».