) 🔹 Как организовать retry и dead-letter для ETL, чтобы не терять данные? 🔸 Повторные попытки нужны, потому что большинство ошибок — временные (сеть, таймаут, блокировка). Без retry вы теряете записи или получаете неконсистентные состояния; exceptions нужно разделять на retryable и fatal. 🔸 Используйте retry с лимитом и backoff; при исчерпании попыток — помещайте запись в dead-letter queue (DLQ). Обрабатывайте exceptions отдельно: non-retryable сразу в DLQ. Введите идемпотентность и транзакции для consistency. attempts = 0 while attempts < 5: try: load(record) # загрузка в БД break except TransientError: attempts += 1 sleep(2**attempts) except FatalError: send_to_dlq(record, reason="fatal") break else: send_to_dlq(record, reason="retry_exhausted") 🔸 Практика: логируйте попытки, храните last_error и retry_count; реобрабатывайте DLQ вручную или скриптом, проверяя идемпотентность и восстанавливая consistency. 📚 Ключ: retry для transient, DLQ для poison, exceptions — фильтруй п