castomFLOW
Відкрити castomFLOW

Запуски, яким можна довіряти

Ніхто не помічає автоматизацію, доки вона не надішле щось двічі

А тоді помічають усі. Чотири механізми на цій сторінці існують тому, що збої програм такого типу — це завжди ті самі чотири збої, і всі вони усуваються дизайном, а не старанністю.

Симулюйте перед публікацією

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

Нічого не залишає межі. Жодного листа не надіслано, жодного рахунку не виставлено, жодної сплати не зроблено, жодного рядка не записано. Зовнішні виклики фіксуються як наміри — з даними, які було б надіслано, тож ви можете перевірити, чи правильне відображення, до того як воно стане чиїмось клопотом.

Симуляції — це спосіб відповісти на питання, що не дає людям увімкнути автоматизацію: що вона насправді зробить?

Симуляція · замовлення 88 214Нічого не надіслано
  • 1Перевірка адресиЗбіг. Було б записано 6 полів.
  • ?УмоваЗамовлення понад 1 000 zł? Ні — 289,00 zł. Обрано короткий шлях.
  • 3РахунокБуло б надіслано POST-запит до системи виставлення рахунків. Корисне навантаження показано повністю.
  • !Перехоплено тутСтавка ПДВ взята з неправильного поля. Виявлено в симуляції, а не у скриньці бухгалтера.

Надіслано: нічогоНараховано: нічого

Запуск проходить ту версію, з якою він увійшов

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

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

Нові запуски отримують нову версію з моменту публікації. Версія, на якій перебуває запуск, записана на самому запуску, тож питання про поведінку в березні має відповідь і у вересні.

Редагування під час роботиv4 → v5
  • 1До2 918 запусків у процесі, усі на v4. Деякі чекають два дні.
  • 2Опублікувати v5Два кроки переставлено, одне повідомлення переписано.
  • 3ПісляТі 2 918 завершать v4. Усе, що починається з 11:40, працює на v5.
  • §Ніхтоне отримав половини одного робочого процесу і половини іншого.

Версія записана на кожному запускуСтарі версії збережено

Повтори, які не можуть надіслати двічі

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

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

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

Воркера вбито посеред надсиланняВідновлено
  • 1Крок 5 починаєтьсяНадішліть повідомлення про відвантаження.
  • ✕Воркер гинеДеплой. Нічого не було зафіксовано.
  • 2ПідхопленоІнший воркер знаходить запуск усе ще на кроці 5.
  • ✓Надіслано один разКлієнт отримав один лист, а не два.

Ефекти фіксуються разом із просуваннямКлюч ідемпотентності для кожного запуску та кроку

Журнал, написаний для людини, яка читатиме

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

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

Невдалі запуски збираються в одному місці з причиною, згрупованою разом, тому «сорок один збій за ніч» перетворюється на «один постачальник повертав 503 протягом дев'яти хвилин», а не на сорок окремих розслідувань.

За ніч, згруповано41 збій
  • 1Одна причинаAPI постачальника повертав 503 з 02:41 до 02:50.
  • 2Що сталосяУсі 41 повторено; 39 успішно з другої спроби.
  • 3ЗалишилосьДва зупинилися й чекають на людину. Обидва наведені разом із рядком, що дав збій.
  • §Не сорок одинрозслідування. Одне — і рішення щодо двох записів.

Облікові дані прихованоВерсію зафіксовано

Чого ми не стверджуємо

Ми не публікуємо показник безвідмовної роботи на маркетинговій сторінці, бо число без вікна вимірювання та визначення «працює» — це лише прикраса. Якщо вам він потрібен договірно, запитайте, і ми поговоримо про те, до чого ми реально можемо зобов'язатися.

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

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

Запуск, про який ви ніколи не думаєте, — це той, що спрацював.