DeftechSenior

Дата-платформи

Дата-платформа — це стек, який збирає, зберігає й переміщує записи організації, а та, що збудована під надійну мережу, спершу надсилає, а зберігає як побічний ефект. Переверніть це припущення — і разом із ним перевернеться архітектура: вузол пише локально й завжди, а надсилання стає фоновою справою за нагоди, якої сьогодні може не бути. Сторінка починається з дванадцяти способів, якими відʼєднана платформа губить чи псує дані, — кожен із рішенням, що його відвертає; далі — черга за пріоритетом, приймальний бік, що очікує обриву, що несе кожен запис, доказ як результат роботи, двадцять років форматів і сім задокументованих випадків.

Записувати
Локально, завжди
Надсилати
За пріоритетом, за нагоди
Запис переживає
ПЗ, що його читає

Дванадцять способів, якими відʼєднана платформа губить дані, — і рішення для кожного

Спершу весь список — бо відʼєднана платформа рідко ламається в лабораторії й зазвичай ламається одним із цих дванадцяти способів у перші місяці в полі: тихо, з усіма дашбордами зеленими. Кожен рядок ставить поруч те, що ви побачите, те, що насправді сталося, і рішення, яке це відвертає. Рядки пронумеровано, щоб на рев’ю можна було сказати «для рядка 9 у нас нічого немає», а розділи нижче посилаються на них за номером.

#Що ви бачитеЩо насправді сталосяРішення, що це відвертає
1Найсвіжіша тривога прийшла після години рутинної телеметріїЧерга надсилала в порядку надходження, і кожне вікно закривалося, не дійшовши до тривоги.Класи пріоритету: критичний клас завжди йде першим.
2Черга ніколи не спорожніє, хоча звʼязок зʼявляється щогодиниКожна передача починається спочатку, і кожне вікно закривається до кінця.Поновлювана передача з прогресом для кожного запису.
3Позиції годинної давнини зʼїдають сорокасекундне вікноНіщо в черзі не старіє, і новіша позиція не заміщає старішу.Термін придатності для кожного класу й стан, що заміщує сам себе; прострочений запис відкидають свідомо — і рахують.
4Після дня поганого звʼязку підрахунки завищеніПовтор після обірваного вікна зберегли як нові дані, бо id призначав приймач.Id генерують на краю в момент спостереження; приймання пропускає id, який уже має.
5Учорашня позиція замінила сьогоднішню на мапіЗаписи розміщували в порядку прибуття, а не в порядку подій.Кожен запис несе свій час події і розміщується за ним.
6Виправлення стерло початкову доповідь, а з нею й розбіжністьСховище перезаписало запис під час оновлення.Лише дозапис: виправлення — новий запис, що посилається на старий.
7Записи несправного сенсора неможливо знайти, не те що виключитиЗаписи не казали, який пристрій, сенсор чи версія ПЗ їх створили.Походження на кожному записі, з першої схеми.
8Робочу систему не можна розгорнути, бо її дані лежать не тамКласифікація була міткою при вивантаженні, а не полем, за яким обирали сховище.Класифікація — поле кожного запису, і вона вирішує, де його можна зберігати й куди надсилати.
9Прогін видалення прибрав записи, які мав лишитиЗберігання було скриптом по живому сховищу, без попереднього перегляду й без запису того, що він прибрав.Правило зберігання на кожному записі; кожен прогін видалення заздалегідь переглядають, журналюють, і його можна скасувати протягом пільгового строку.
10Записи зникли між двома системами, а всі підсумки досі виглядали правдоподібноОбмеження формату чи інтерфейсу обрізало передачу без жодної помилки.Кожну передачу рахують з обох кінців, і розбіжність зупиняє конвеєр.
11Ніхто не може сказати, що система знала о 14:02Зберігали лише поточний стан; кожне оновлення знищувало попереднє.Зберігати, коли факт записали, а не лише коли він стався, і питати «станом на».
12Записи десятирічної давнини неможливо прочитатиФормат залежав від програми, версії бібліотеки чи носія, яких більше не існує.Відкриті, задокументовані, самоописні формати й архівні зразки, які читають на кожному релізі.

Зберегти й переслати — і черга, що робить це проєктуванням

«Зберегти й переслати» — річ давня й проста: запиши там, де ти є, надішли, коли зможеш. Проєктуванням, а не буфером, це робить те, що стається, коли черга більша за вікно, — а це нормальний випадок, а не виняток.

Коли звʼязок є подією, а не комунальною послугою, архітектура перевертається: вузол спершу й завжди пише локально, а надсилання є фоновою діяльністю за нагоди, якої сьогодні може й не бути. Проєктуванням, а не просто буферизацією, це робить черга за пріоритетом. Вікно контакту коротке, а смуга вузька, тож більшість того, що в черзі, не влізе, і що піде першим, треба вирішити наперед: критична подія на два кілобайти поперед сорока кілобайт оновлень треків, поперед девʼятисот мегабайт відео, яке може не поїхати ніколи. Приймальний бік будують так, ніби обрив є нормою: передачі ідемпотентні, тож повтор нічого не коштує; порядок прибуття вважають хибним; і ніщо вже збережене не перезаписується тим, що прийшло пізніше. Три властивості їдуть із кожним записом, і додати їх потім боляче. Походження — бо запис без джерела неможливо оцінити. Класифікація — бо вона вирішує, у якому сховищі запис може законно лежати. І правило зберігання — бо тут видалення є обовʼязком, який хтось перевірить, а не оптимізацією витрат.

Порахуйте один раз — і суть стане очевидною. Сорокасекундне вікно на девʼяти кілобітах на секунду переносить близько сорока пʼяти кілобайтів. Критична подія важить два кілобайти й іде щоразу. Оновлення треків — сорок кілобайтів і йдуть здебільшого. Відео — девʼятсот мегабайтів, і цим каналом воно не піде ніколи, — і це проєктний факт, який вирішують наперед, а не несподіванка, яку виявляють у полі. Відео їде на фізичному носії, коли платформа повернеться, або зводиться на борту до чогось, що вміщається, або не їде взагалі.

Це рішення — таблиця, яку хтось має написати, клас за класом. Розміри нижче умовні; стовпці — ні. Стовпець, який зазвичай пропускають, — термін придатності, і саме про нього рядок 3: оновлення позиції варте надсилання лише доти, доки немає новішого, тож стан має заміщувати сам себе в черзі, а не чекати своєї черги позаду самого себе.

КласПрикладиТиповий розмірКоли перестає бути вартим надсиланняЯкщо вікно коротке
1 · Критична подіяДоповідь про контакт, несправність, тривога, піднята людиною1–2 КБНіколи; її надсилають, доки не підтвердятьЗавжди першою, повторно — до підтвердження
2 · СтанВласна позиція, оновлення треків, заряд і справністьДесятки КБ на годинуКоли зʼявилося новіше значенняНадіслати найновіше; відкинути те, що воно заміщує
3 · ЗведенняСписки детекцій, мініатюри, зведення останньої години відео10–500 КБЧерез годиниКоли є місце
4 · МасивСире відео, повні логиСотні МБПісля поверненняНіколи цим каналом; фізичний носій після повернення

Та сама логіка стосується власного сховища вузла — воно теж черга. Вузол, що тиждень без звʼязку, заповнює диск, і без бюджету першим зникає те, що надійде наступним, — часто саме тривога. Дайте кожному класу бюджет сховища: рутинні дані витісняються від найстаріших, критичні — ніколи, і кожне витіснення рахують, щоб «ми відкинули 4 000 оновлень позиції» було рядком у звіті, а не відкриттям.

Приймальний бік припускає, що його обірвуть

Оскільки вікно закривається без попередження, кожна передача може завершитися наполовину, а відновлене зʼєднання може бути іншим, з іншого вузла й не в тому порядку. Тож проєктне питання — не перше вікно, а друге: що стається із записами, які були в дорозі, коли перше закрилося. Це рядки 2 і 4, і три поширені відповіді намальовано нижче.

Вікно контакту, що закрилося посеред передачі, — не аварійний випадок, а звичайний. Важить те, що робить наступне вікно, і три поширені підходи дають три різні відповіді. Якщо id записам дає приймач під час отримання, повтор записів з першого по шостий виглядає як нові дані й зберігається вдруге — шість постійних дублікатів, яких жодне пізніше прибирання не видалить безпечно, бо копії справді є різними рядками. Якщо передачу не можна поновити, кожне вікно знову починає з запису один і знову обривається на шостому, тож черга, більша за вікно, ніколи не розбирається. Якщо ж id генерують на краю в момент спостереження, а прогрес відстежують щодо кожного запису, наступне вікно продовжує з сьомого, а єдиний запис, повторно надісланий через обрив, розпізнають за id і пропускають. Другий підхід ламається гучно — рано чи пізно. Перший ламається тихо й назавжди: кожен підрахунок далі по ланцюгу непомітно хибний.

Чотири властивості роблять обрив переживним, і всі чотири дешево закласти й боляче додати згодом.

ВластивістьЩо це означає конкретноЩо ламається без неї
Ідемпотентне приймання (рядок 4)Кожен запис має стабільний id, згенерований на краю; отримати його двічі — те саме, що отримати один раз.Повтор після обірваного вікна дає дублікати, і всі підрахунки тихо стають хибними.
Незалежність від порядку (рядок 5)Записи несуть власний час події і розміщуються за ним, а не за послідовністю прибуття.Учорашня партія, що прийшла після сьогоднішньої, переписує теперішнє минулим.
Дописувати, ніколи не перезаписувати (рядок 6)Нова інформація є новим записом із посиланням на старий; ніщо вже збережене не заміщується.Пізня правка видаляє початкове спостереження, і розбіжність, що важила, зникає.
Поновлювана передача (рядок 2)Прогрес відстежується щодо кожного запису, тож наступне вікно продовжує, а не починає спочатку.Черга, більша за вікно, ніколи не розбирається, бо кожна спроба починається спочатку.

Разом вони роблять протокол синхронізації обміном незмінними фактами, а не узгодженням змінюваного стану, — а це помітно простіше зробити правильно. Це також та властивість, від якої залежить шар , — рядок 3.1 його чеклиста: журнал доповідей лише на дозапис, а не дифф треків. Кореляцію можна перезапустити на обʼєднанні побаченого обома сторонами лише тоді, коли обидві зберегли побачене як записи, а не як поточне значення.

Що їде з кожним записом

Кожне з цих полів виглядає метаданими, і кожне вирішує щось структурне. Додати будь-яке згодом — це міграція через кожного виробника, кожне сховище й кожного споживача, тож їм місце в першій схемі. Читайте останній стовпець як причину: кожне поле тут тому, що без нього стається рядок зі вступної таблиці.

ПолеЩо воно тримаєРядок, який воно відвертає
IdГенерується на краю в момент спостереження, стабільний на кожному повторі.4
Час події й час записуКоли це сталося, коли платформа про це дізналася і який годинник поставив кожну мітку.5 і 11
ПоходженняПристрій, сенсор, версія ПЗ, оператор; для похідного запису — записи, з яких його виведено.7
Клас пріоритету й термін придатностіЙого місце в черзі й момент, коли він перестає бути вартим надсилання.1 і 3
КласифікаціяКатегорія обробки, що вирішує, де запис можна зберігати, хто може його читати і де він може перетнути кордон.8
Правило зберіганняСкільки його зберігають і що далі — на хабі й на пристрої.9
ВиправляєДля виправлення — id запису, який воно змінює; оригінал лишається.6

Саме класифікація дивує інженерів, бо вона переносить юридичне питання в архітектуру. Якщо категорія записів не може покинути юрисдикцію чи не може лежати на спільному сервісі, це обмеження вирішує, де живе сховище, як маршрутизується синхронізація і які керовані продукти вам доступні, — і вирішує це раніше за будь-які міркування продуктивності. І це властивість не лише окремих записів. У січні 2018 року публічна теплова карта фітнес-застосунку, зібрана з мільярда нешкідливих пробіжок, виявилася картою маршрутів військових довкола баз, планування яких не було публічним. Платформа, що класифікує запис за записом, потребує й правила для сукупностей, а застосовувати його треба там, де таку сукупність будують, — на вивантаженні.

Зберігання ріже в обидва боки — це рядок 9. Видалення тут є обовʼязком, який хтось перевірить, а не способом зменшити рахунок за сховище, і воно має дістати до копії на пристрої, якого ви можете більше не побачити, — тож правило їде разом із записом, а пристрій виконує його сам. Резервні копії й архіви — частина, про яку зазвичай забувають; шифрувати кожен період зберігання власним ключем і знищувати ключ, коли період спливає, — так видалення дістає до копій, яких ніхто не може перелічити. Друга половина не менш реальна: у січні 2021 року хибна щотижнева задача видалення в британській Police National Computer прибрала сотні тисяч записів, які мала лишити. Прогін видалення заздалегідь переглядають, журналюють, і його можна скасувати протягом пільгового строку, перш ніж він стане остаточним.

Доказ — це результат роботи: що система знала і коли

У цій галузі показати, що щось працює, — окремий результат роботи з власною оцінкою трудовитрат: протоколи тестів, простежуваність від кожної вимоги до тесту, що її доводить, аргумент, чому безпекове обґрунтування тримається. Дата-платформа несе той самий обовʼязок після події. Коли щось іде не так, питання ніколи не звучить як «що правда зараз». Воно звучить як «що система знала в певний момент, що вона показала людині, яка діяла, і чи хтось відтоді змінював цей запис».

Після інциденту питання ніколи не звучить як «що правда зараз». Воно звучить як «що система знала в певний момент і що вона показала людині, яка діяла». Тут один контакт стався о 13:58, доповідь про нього дійшла до платформи о 14:07, а виправлення з посиланням на цю доповідь надійшло о 14:18. Вісь — це час запису, тобто коли платформа дізналася про кожен факт, бо саме про цю вісь і питають. Якщо спитати згодом, сховище, що оновлює на місці, відповість лише за «зараз»: першу позицію перезаписано о 14:18, і те, що система знала о 14:02 та о 14:12, просто зникло. Сховище, що зберігає і час події, і час запису та дописує замість оновлювати, відповідає на всі три: о 14:02 ще нічого — і це саме по собі доказ; о 14:12 контакт у першій доповіданій позиції; наприкінці — виправлена позиція, до якої досі привʼязаний оригінал. Ціна — ще одна мітка часу на запис і правило не оновлювати на місці.

Механізм — два часи на кожному записі, це рядок 11. Час події — коли щось сталося; час запису — коли платформа про це дізналася. Зберігайте обидва, ніколи не оновлюйте на місці — і «станом на 14:02» стає звичайним запитом, а не неможливим. SQL:2011 стандартизував обидва види часу в таблицях, і кілька баз даних це реалізують; журнал лише на дозапис із двома мітками часу дає ту саму властивість, не залежачи від жодної з них.

Що питає слідчийЩо платформа мала зберегти
Що система знала о 14:02?Час запису на кожному записі й жодних оновлень на місці (рядок 11).
Що бачив оператор і що він обрав?Стан відображення й рішення, записані, — рядок 6.5 чеклиста C2.
Звідки взялося це значення?Походження, аж до сенсора й версії ПЗ (рядок 7).
Чи хтось змінював його відтоді?Журнал лише на дозапис, записи якого зчеплені хешами, тож правку видно, і запис кожного адміністративного доступу.
Чи дійшов кожен запис?Підрахунки з обох кінців кожної передачі (рядок 10).
Який тест показує, що вимогу виконано?Простежуваність від вимоги до тесту, до його результату й до збірки, яку тестували.

Двадцять років форматів

Десять–двадцять років служби тут норма, і це змінює кожне рішення про формат даних. Записи, які система пише в перший рік, мають бути читними в останній — ПЗ, якого ще не написано, і людьми, які ніколи не бачили початкової програми. Схема дає цьому числа: за політиками самих виробників усе, що читає дані, замінять кілька разів, поки дані лежатимуть на місці.

Оборонні системи служать десять–двадцять років, і записи, які вони створюють, мають лишатися читними щонайменше стільки ж. ПЗ, що їх читає, стільки не живе. За опублікованими політиками самих виробників PostgreSQL підтримує кожну мажорну версію пʼять років, Python — кожен реліз пʼять років, релізи Ubuntu LTS мають пʼять років стандартної підтримки, а Kubernetes дає кожній мінорній версії приблизно рік виправлень. За двадцять років служби це чотири версії PostgreSQL, чотири Python, чотири Ubuntu і двадцять версій Kubernetes, і кожну з них замінять, поки дані лежать на місці. Тож формат даних — єдиний компонент, який не має змінюватися разом із ними. Він має бути відкритим і задокументованим, нести чи вказувати на власну схему й розвиватися лише за правилами, які витримує старіший читач. А єдиний доказ, що він вижив, — тест: збережений зразок кожної версії схеми, який новий читач читає на кожному релізі.

Повчальна історія — з 1986 року. BBC відзначила 900-річчя Книги Страшного суду цифровим описом Британії на лазерних дисках, які могла читати лише одна конкретна конфігурація компʼютера. До 2002 року робоче обладнання стало таким рідкісним, що вміст довелося рятувати емуляцією. Сама Книга Страшного суду, написана 1086 року, весь цей час лишалася читною.

  • Відкриті, задокументовані формати з опублікованою специфікацією — не внутрішній файл одного продукту й не те, що випадково серіалізує поточна бібліотека.
  • Схема їде разом із даними або на неї посилаються за версією, тож файл пояснює себе без програми, що його записала.
  • Схеми розвиваються за правилами, які витримує старіший читач: поля додають, але ніколи не перепризначають, а невідоме поле зберігають, а не відкидають.
  • Зразок кожної версії схеми архівують, і новий читач читає його на кожному релізі, — рядок 12 у вигляді тесту.
  • Носії мігрують за графіком, поки приводи для них ще легко купити, а не тоді, коли відмовить останній.

Сім випадків — і рядок, якого вчить кожен

Збої даних в оборонці публікують рідко, тож ці випадки цивільні — з тієї ж причини, що й на сторінці про компʼютерний зір; механізми переносяться один в один. Два із семи — про дані, що вціліли, а не зникли, бо це друга половина уроку: слідчі мали те, що записали локально, або те, що було досить малим, щоб піти першим.

ВипадокЩо сталосяРядок, якого він учить
BBC Domesday Project, 1986Цифровий опис Британії, створений приблизно мільйоном учасників до 900-річчя Книги Страшного суду, видали на лазерних дисках для однієї конкретної конфігурації BBC Micro. До 2002 року робоче обладнання стало таким рідкісним, що вміст довелося рятувати емуляцією; Книга Страшного суду 1086 року весь час лишалася читною.12. Формат жив і помер разом з однією машиною.
Шатл Columbia, лютий 2003Коли Columbia зруйнувався під час входу в атмосферу, першою припинилася телеметрія на землю. Його бортовий магнітофон OEX, що записував сенсори, дані яких ніколи не передавали, знайшли неушкодженим біля Гемфілла, Техас, 19 березня 2003 року. Його запис тривав і після втрати телеметрії й дав слідчим показники, яких більше ніде не було.Перше правило сторінки, а не рядок: писати локально, завжди. Самописець зберіг те, чого канал ніколи не ніс.
Air France 447, червень 2009Airbus A330 зник над Атлантикою. Майже два роки головним доказом були 24 автоматичні технічні повідомлення, які літак надіслав через ACARS за останні хвилини і які вказували на недостовірні показники швидкості; самописці підняли з дна лише в травні 2011 року. Тепер ICAO вимагає, щоб нові великі літаки в аварійній ситуації передавали позицію щонайменше раз на хвилину.1. Малі критичні записи, що пішли першими, два роки були єдиними, що дійшли.
Теплова карта Strava, січень 2018Фітнес-застосунок опублікував глобальну теплову карту з мільярда активностей. У січні 2018 року австралійський студент Натан Рузер звернув увагу, що в таких місцях, як Сирія та Афганістан, вона малює маршрути пробіжок військових довкола баз, планування яких не було публічним. Кожна пробіжка була нешкідливою; сукупність — ні.8. Класифікацію вирішували для кожного запису, а сукупність не класифікував ніхто.
Post Office Horizon, рішення суду, грудень 2019Пʼятнадцять років британська Post Office переслідувала в суді сотні керівників поштових відділень за нестачі, які показувала її облікова система Horizon. У грудні 2019 року Високий суд встановив, що в Horizon були помилки, здатні спричиняти такі нестачі, і що рахунки відділень можна було змінювати дистанційно, — що Post Office публічно заперечувала. У 2021 році Апеляційний суд скасував 39 вироків, визнавши докази з Horizon ненадійними.6 і 11. Зміни не дописували з автором, тож ніхто не міг показати, хто що змінив і що система знала.
Результати тестів на Covid-19, Англія, жовтень 2020Агентство Public Health England виявило, що 15 841 позитивний результат за 25 вересня — 2 жовтня 2020 року випав зі щоденної статистики. Результати лабораторій проходили через шаблон таблиці старого формату XLS, що вміщує 65 536 рядків; усе, що виходило за межу, відкидалося без жодної помилки, і відстеження контактів для цих випадків почалося на дні пізніше.10. Ніщо не рахувало рядки з обох кінців.
Police National Computer, січень 2021Щотижнева задача, що мала видаляти записи з вичерпаним строком зберігання, запустилася з помилкою в коді й видалила записи, які мала лишити, — за пізнішою оцінкою відповідального від поліції, близько 213 000 записів про правопорушення, 175 000 про арешти й 15 000 про осіб, а разом із ними й повʼязані записи ДНК та відбитків пальців.9. Видалення запустили без попереднього перегляду, і його скасування стало окремим проєктом відновлення.

Де це вироджується

Чесне обмеження в тому, що «зберегти й переслати» вирішує лише порядок утрат. Вузол, знищений до свого вікна, утрачає все, що тримав; черга за пріоритетом вирішує лише те, які записи вже встигли піти. Ніщо в платформі не поверне спостереження, якого не записали, і жодна черга не змусить канал на девʼять кілобіт нести відео. Чесний дизайн письмово каже, що втрачається першим, коли все йде не так, замість натякати, що не втрачається нічого.

  • Класи пріоритету, де кожен виробник позначає свої записи як критичні, — і черга тихо знову стає «перший прийшов — перший пішов».
  • «Офлайн-режим», перевірений тим, що кабель висмикнули на пʼять хвилин.
  • Поля походження, що є в схемі й у більшості рядків кажуть «невідомо».
  • Усе класифіковане за найвищим рівнем, тож нічим не можна поділитися, і люди копіюють дані вручну.
  • Лише дозапис у базі — і задача вивантаження, що перезаписує.
  • Політика зберігання, що існує як документ і не виконується ніде, а найменше на пристроях.
  • Архів, який ніхто не читав відтоді, як його записали.
  • Дашборд синхронізації, що показує частку успіхів, але не кількості, — тож передача, яка загубила половину рядків, звітує про успіх.
  • «Зберігати все назавжди», подане як обережність, хоча це рішення про зберігання, якого ніхто не ухвалював.

Коли це застосовувати

Застосовуйте, коли

  • Як дизайн-рев’ю для будь-якої платформи, що працює крізь довгу відсутність мережі, — дванадцять рядків угорі.
  • Коли черга більша за вікно контакту: тоді порядок пріоритетів стає продуктовим рішенням.
  • Коли пишете першу схему: id, обидва часи, походження, класифікація й зберігання, додані згодом, стають міграціями.
  • Коли комусь колись доведеться показати, що система знала і коли, — а в цій галузі це завжди.

Уникайте, коли

  • Як загальний матеріал з дата-інженерії: ним володіють розділи баз даних та інфраструктури, і ця сторінка на них спирається.
  • Як настанову щодо спільної картини, збудованої з цих даних: це сторінка C2, а не ця.
  • Там, де мережа справді надійна: тоді «зберегти й переслати» є складністю, за яку вам не платять.
  • Як привід зберігати все назавжди: зберігання тут є обовʼязком, а не рішенням про сховище.

Джерела й метод

На чому стоїть ця стаття

  • 11 джерел
  • 6 задокументованих збоїв
  • Перевірено 13 жовтня 2026 р.

Дослідження з Claude. Пошук і звірку першоджерел зроблено з Claude (Anthropic). Відбір, текст і перевірку фактів — редакція Anatomy of IT Product.

Було корисно?

Поділіться з тим, хто працює над тією ж задачею.