Перейти до вмісту

Блог ·

Вивантаження, яке можна перевірити

Вивантаження даних як тривала задача: тимчасовий файл, що перейменовується, sha256 у квитанції, одноразовий жетон і одна тека у двох різних ролях.

Автор: Provibr

Стаття 20 європейського регламенту про захист даних дає особі право отримати свої дані. На хостинговій платформі це не малий файл. Вивантаження організації читає близько сімдесяти розділів, кожен обмежений двадцятьма пʼятьма тисячами рядків, і триває хвилини, а не мілісекунди.

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

Це задача, і крізь неї є лише один шлях

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

Чотири числа тримають усе докупи, і кожне з них є рішенням, а не типовою величиною.

МежаВеличинаЧому саме така
Рядків на розділ25 000Понад це вже звіт, а не запит доступу, і зріз називають замість того, щоб ховати
Посилання на завантаження24 годиниДосить, щоб забрати, і замало, щоб старе посилання в поштовій скриньці чогось варте було
Файл на диску7 днівЦе повна копія всього, що ми тримаємо, і вона не має ставати архівом
Запис про видане90 днівДоказ того, що право було здійснене, переживає файл, який він породив

Старий синхронний шлях не лишився як скорочення для малих облікових записів, і то було свідоме рішення, а не лінощі.

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

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

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

Де мав жити код

Будівники переїхали з вебзастосунку до пакета, якому належать звертання до бази даних. То було не прибирання. Образ шлюзу копіює шлюз і спільні пакети й не копіює теку web, тож імпорт, що сягає web/lib, збирається локально й відсутній у продукції. Це виміряна межа, а не питання стилю.

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

Тимчасовий файл, а тоді перейменування

Файл пишеться як <назва>.part і тоді перейменовується на своє місце. Перейменування всередині однієї теки є неподільним, тож читач ніколи не дістане пів файлу, а пів файлу гірше за жоден файл: він несе контрольну суму, що не сходиться, і нічого, що сказало б чому.

Контрольна сума є sha256 від байтів і стоїть поряд із розміром у квитанції. Саме це робить вивантаження перевірним, а не просто виданим. Той, хто матиме файл за рік, і далі зможе показати, що це той файл, який ми зробили.

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

Про це монтування легко забути, а забуття дає дуже своєрідну й дуже оманливу картину збою. Задача каже готово. Завантаження відповідає 410. Ніщо в журналі не каже не та тека, бо з погляду кожного з двох процесів усе спрацювало. Тому код застерігає раз, голосно, якщо тека не налаштована, а відступом є шлях поряд зі сховищем, а не тимчасова тека системи: файл там зникає при перезапуску, і тоді рядок, який каже готово до завантаження, указує в нікуди.

Жетон одноразовий, а одноразовість є однією інструкцією

Посилання на завантаження несе жетон, чинний двадцять чотири години, тоді як сам файл лишається сім днів.

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

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

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

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

Урізання є відкритою перевіркою, а не приміткою

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

Виміряно на обліковому записі, що ніс двадцять пʼять тисяч і пʼять рядків в одному розділі: розділ урізався, відкрита перевірка зʼявилася, а друга спроба на тому самому посиланні відповіла 410.

Одна таблиця навмисно лишена осторонь, із причиною поряд

Не все потрапляє всередину, і перелік того, що лишається осторонь, несе писане обґрунтування для кожної таблиці замість однієї засадничої фрази вгорі.

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

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

Ще дві таблиці лишаються осторонь із тієї самої причини: адміністрація кожної спроби під належним вимірюванням і самі тіки планування. Обидві кажуть щось про те, як виконували ми, і нічого про особу, яка питає.

Як це виглядає ззовні

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

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

З платформної роботи Provibr. Чому огляд операцій читає наявні рядки й ніколи не пише назад, описано в проєктувати, ніколи не заміняти, а чому смуга поступу тут відмовляється передбачати завершення, описано в смуга поступу, що відмовляється вгадувати.

Почніть з одного хоста й одного агента

Створіть обліковий запис, встановіть агента однією командою та підключіть свій перший хост Proxmox. Пробний період триває 14 днів і не потребує платіжних даних.