Вимкніть живлення під час експорту наполовину. Не віддавайте половину файлу користувачеві: спочатку закінчіть написання, а потім опублікуйте.
Служба перезапустилася на півдорозі після запису файлу, але посилання для завантаження вже було відкрито для користувачів. Цей вид помилки не такий простий, як «файл неможливо відкрити час від часу», але система розглядає незавершений продукт як офіційний результат. Рішення має бути розроблено навколо меж випуску, а не лише рівня перехоплення винятків для операцій запису.
Написано для розробників, які експортують файли, завантажують або доставляють переклад. Якщо служба перезавантажується, коли файл наполовину записаний, а посилання для завантаження вже відкрито для користувача, користувач може отримати напівфабрикат, який неможливо відкрити. Ця проблема полягає не лише в тому, що файл не відкривається час від часу, а в тому, що система розглядає незавершені продукти як офіційні результати.
Прочитавши цю статтю, ви зможете чітко визначити межі випуску: спочатку завершіть написання та перевірку, а потім дозвольте офіційному запису набрати чинності. У цій статті також пояснюється, що робити за різних методів зберігання, а що ще потрібно перевірити після публікації.
У цій статті використовуються синтетичні зразки для демонстрації методу обробки. Код було перевірено з прикладами в ізольованому середовищі; це не є гарантією всіх реальних файлів або продуктивності продукту. Перед обробкою важливих документів збережіть оригінали та перегляньте їх відповідно до меж і пунктів прийняття в тексті.
Як я можу уникнути передачі половини файлу, якщо на півдорозі експорту вимикається живлення? Висновок одним реченням
Основний підхід такий: Спочатку напишіть тимчасовий файл, а потім замініть офіційний шлях або оновіть офіційний вказівник після проходження всіх перевірок.
| ваша ситуація | Рекомендовані практики | причина |
|---|---|---|
| Файл існує в локальній файловій системі | Запишіть тимчасовий файл у той же каталог і викличте os.replace після його закриття. | Той самий каталог може уникнути типових проблем заміни міжфайлової системи |
| Просто потрібно перевірити наказ про звільнення | Використовуйте перевірку плану статусу: заміна дозволена лише після завершення запису, закриття та перевірки | Запишіть умови випуску в перевірені правила |
| Використовуйте сховище об’єктів | Використовуйте незмінні ключі об’єктів, оновлюйте офіційні покажчики після завантаження та перевірки | Сховища об’єктів зазвичай не мають такої самої семантики перейменування каталогів, як локальні файлові системи |
| Потреба в більших гарантіях довговічності | Вивчіть синхронізацію файлів і каталогів, семантику дисків і файлових систем і виконайте перевірку впровадження помилок | Атомна заміна не означає, що дані будуть збережені після збою живлення. |
Чому ви віддали половину файлу?
Сервіс перезапускається, коли файл записаний наполовину, і якщо посилання для завантаження вже доступне, користувач отримає незавершений продукт. Це свідчить про те, що проблема пов’язана з часом випуску, а не лише з самою операцією запису.
Додавання рівня захоплення винятків до операції запису може обробляти лише ті помилки, які може виявити програма під час процесу запису. Що справді потрібно остерігатися, це те, які держави можуть бути видимими для зовнішнього світу.
Спочатку запишіть тимчасовий файл, а потім замініть офіційний запис
У локальній файловій системі поширеним методом є запис тимчасового файлу в цільовий каталог, а потім виклик os.replace після його запису та закриття. Той самий каталог може уникнути типових проблем заміни міжфайлової системи.
Слід зазначити, що атомарна заміна лише описує, яке ім’я бачить читач, і не означає, що дані будуть збережені після збою живлення.
Джерела: Python tempfile.
Використовуйте план стану, щоб визначити послідовність випусків
Наведений нижче код фактично не створює та не перезаписує файл, а скоріше перевіряє план доставки: лише запис, закриття та перевірка вмісту завершуються, перш ніж офіційний шлях буде дозволено замінити.
def publish_plan(written, closed, content_ok, same_filesystem):
if not written:
return ("write_temporary",)
if not closed:
return ("close_temporary",)
if not content_ok:
return ("quarantine_temporary",)
if not same_filesystem:
return ("prepare_destination_temporary",)
return ("replace_destination", "confirm_readable", "mark_ready")
assert publish_plan(False, False, False, True) == ("write_temporary",)
assert publish_plan(True, False, True, True) == ("close_temporary",)
assert publish_plan(True, True, False, True) == ("quarantine_temporary",)
assert "mark_ready" not in publish_plan(True, True, True, False)
assert publish_plan(True, True, True, True)[-1] == "mark_ready"
Це перевірка протоколу, а не експеримент із відключенням живлення. Справжній записувач файлів також повинен обробляти очищення винятків, дозволи та відмінності платформи. Не пишіть про звичайне читання та записування, оскільки «безпека відключення живлення доведена».
У яких штатах дозволено завантаження
| Статус товару | зовнішня видимість | дія відновлення |
|---|---|---|
| Тимчасовий файл записується | Офіційне посилання не надано | Спробуйте ще раз або очистіть залишки |
| Не вдалося перевірити вміст | Карантин, не звільнений | Зберігайте інформацію про налагодження |
| Заміну завершено, але читання не підтверджено | Ще не позначено успішно | Перевірте кінцевий шлях |
| Читабельний і контрольна сума відповідає | Надайте результати | Версія запису та короткий зміст |
Не будьте жорсткими щодо перейменування сховища об’єктів
Сховища об’єктів зазвичай не мають такої самої семантики перейменування каталогу, як локальні файлові системи. Більш відповідний підхід:
- Завантажуйте продукти за допомогою незмінних ключів об’єктів.
- Перевірте вміст після завантаження.
- Після проходження верифікації оновіть офіційний покажчик в базі.
Якщо також залучено CDN, ключі кешу та збереження старої версії також слід розглядати разом.
Завершення перекладу має включати доставку файлу
Під час підключення статусу обробки OmniDoc (портал продуктів) до вашого власного продукту успішне локальне завантаження не може відображатися одразу після отримання повідомлення «Обробка завершена». Ви повинні спочатку переконатися, що збережений рукопис перекладу можна прочитати та має правильний тип, перш ніж призначати завдання як готове.
Завершення, яке сприймає користувач, нарешті отримує файл, який можна відкрити.
📊 Основне порівняння
| Порівняльний пункт | локальна файлова система | зберігання предметів |
|---|---|---|
| Метод письма | Запишіть тимчасові файли в той же каталог і замініть їх після закриття | Завантажуйте з використанням незмінних ключів об’єктів |
| опублікувати дію | Зателефонуйте os.replace, щоб замінити офіційний шлях | Оновіть офіційний покажчик у базі даних після перевірки |
| Вимагає додаткового розгляду | Синхронізація файлів і каталогів, семантика дисків і файлових систем | Ключі кешу CDN зберігаються в старих версіях |
🎯 Який спосіб вам підходить?
Якщо ваш продукт збережено на локальному диску
Запишіть тимчасовий файл у цільовий каталог, а потім замініть офіційний шлях на os.replace після проходження перевірки.
Якщо ваш продукт зберігається в об'єктному сховищі
Використовуйте незмінний ключ об’єкта для завантаження, а потім оновіть офіційний покажчик після проходження перевірки.
Якщо у вас вищі вимоги до безпеки даних після відключення електроенергії
Не просто покладайтеся на атомарну заміну, але також вивчіть семантику синхронізації файлів і каталогів і перевірте її за допомогою впровадження помилок.
Якщо ваш низхідний канал - це завантаження користувача
Посилання для завантаження надається лише тоді, коли продукт має статус «Читабельний і збігається з перевіркою».
❓ Часті запитання (FAQ)
1. Чи може атомарна заміна гарантувати, що дані не будуть втрачені після відключення електроенергії?
не може. Атомарна заміна описує, яке ім’я бачить читач, що не означає, що дані будуть збережені після збою живлення.
2. Чому тимчасові файли створюються в цільовому каталозі?
Той самий каталог може уникнути типових проблем заміни міжфайлової системи.
3. Чи може сховище об’єктів безпосередньо використовувати перейменування для публікації файлів?
Жорстке використання не рекомендується. Зберігання об’єктів зазвичай не має такої самої семантики перейменування каталогу, як локальні файлові системи, і більше підходить для незмінних ключів об’єктів і формальних покажчиків.
4. Що робити з продуктами, які не пройшли перевірку?
Його слід ізолювати, не випускати, а інформацію про налагодження зберігати.
📝 Підсумок
Межі публікації визначають, що можуть бачити користувачі. Спочатку завершіть написання та перевірку, а потім запустіть офіційний вхід, щоб уникнути передачі незавершених продуктів користувачам.
Спробуйте зараз: завантажте документ, щоб розпочати переклад, зберігаючи вихідний макет


