Пятница, 18:47. Гена, дежурный системный аналитик и по бесплатному совместительству девопс, уже взялся за куртку, когда в чате всплыло: «Бабушка из Сызрани заказала сорок семь чайников. Клянётся, что нажала один раз».
Гена повесил куртку обратно. Сюжет был знакомый: сеть моргнула, ретрай-политика добросовестно повторила запрос. Потом очередь решила, что подтверждение потерялось, и повторила ещё раз, уже от себя лично. Каждый в цепочке действовал из лучших побуждений, как и все, кто когда-либо ронял прод.
— Давайте просто сделаем доставку "строго один раз", — предложил продакт Артём тоном человека, который чинит интернет перезагрузкой.
Из угла, где пахло холодным кофе и тремя инцидентами прошлого квартала, поднялся архитектор Палыч.
— "строго один раз" в общем случае невозможна: это задача двух генералов. Они шлют гонцов через долину с врагом и никогда не узнают наверняка, дошёл ли последний. Можешь до пенсии слать подтверждения подтверждений.
— А что тогда можно?
— Выбор небогатый. Отправили и забыли - бабушка без чайника. Шлём, пока не подтвердят - бабушка с сорока семью чайниками. Третьего не дано, хоть все SLA перепиши.
Артём вздохнул.
— Поэтому берём "шлём, пока не подтвердят" — продолжил Палыч, — и перестаём требовать от сети честности. Пусть дублирует сколько хочет. Нам нужна идемпотентность: применил операцию один раз или сорок семь, а состояние одно и то же. «Заказ №8812 существует» — это факт, его можно повторять бесконечно, он не размножается. А «плюс один чайник» — это приглашение к катастрофе. Если конечно бабушка сама не жала на плюсик.
— То есть надёжность мы не чиним, а переносим?
— Именно. С транспорта на алгебру. Транспорт у нас из кафки, балансировщиков и молитв, а вот алгебра из математики. Угадай, чему я доверяю больше.
Гена тем временем смотрел на дашборд, где три реплики показывали три разных числа чайников.
— А реплики почему расходятся?
— Сообщения приходят в разном порядке и разными пачками. Одна реплика сначала свернула A с B, потом добавила C. Другая сложила B с C, а A прилетел позже, через Франкфурт пешком. Если операция ассоциативна, а лучше ещё и коммутативна, то неважно, как сгруппировали. Это независимость от топологии вычислений. По сути, ассоциативность и решает, можно ли это вообще параллелить: раздал куски по узлам, собрал как угодно, ответ тот же.
— Звучит как магия.
— Магия — это когда вы говорите «давайте ещё раз ретрайнем». А тут просто свойства. Смотри: путей, которыми реплика могла прийти к своему состоянию, бесконечно много. Дубли, перестановки, задержки, разрывы сети, Гена, случайно перезапустивший под. Бесконечное множество путей исполнения. А нам на них плевать! Нас интересует одно: в конце состояния одинаковые.
— Это как… убывание ранговой функции? — неуверенно спросил Гена, который недавно осилил полстатьи по линейной алгебре.
Палыч посмотрел на него с уважением, которого Гена не видел со времён собеседования.
— Ровно так. Сжимаем бесконечные чередования, ретраи, сообщения до конечных состояний (просто натуральные числа). Ранг работает как абстракция - число оставшихся шагов/раундов, приоритет/дедлайн... Строгое убывание доказывает завершимость и отсутствие "голодания". А ассоциативность, коммутативность и идемпотентность гарантируют, что при сжатии мы ничего не потеряли и лишнего не придумали.
К 21:58 счётчики переписали на идемпотентный мерж. Реплики сошлись. Бабушке отправили один чайник и промокод с извинениями.
Сеть продолжала дублировать сообщения, но теперь это никого не волновало.
Артём написал в общий канал: «Инцидент закрыт. TODO: изучить задачу двух генералов».
Палыч дописал: «И перестать быть третьим генералом, который бесконечно жмёт "отправить ещё раз"».
Гена надел куртку. Было 22:22. Пятница почти не пострадала.
Гена повесил куртку обратно. Сюжет был знакомый: сеть моргнула, ретрай-политика добросовестно повторила запрос. Потом очередь решила, что подтверждение потерялось, и повторила ещё раз, уже от себя лично. Каждый в цепочке действовал из лучших побуждений, как и все, кто когда-либо ронял прод.
— Давайте просто сделаем доставку "строго один раз", — предложил продакт Артём тоном человека, который чинит интернет перезагрузкой.
Из угла, где пахло холодным кофе и тремя инцидентами прошлого квартала, поднялся архитектор Палыч.
— "строго один раз" в общем случае невозможна: это задача двух генералов. Они шлют гонцов через долину с врагом и никогда не узнают наверняка, дошёл ли последний. Можешь до пенсии слать подтверждения подтверждений.
— А что тогда можно?
— Выбор небогатый. Отправили и забыли - бабушка без чайника. Шлём, пока не подтвердят - бабушка с сорока семью чайниками. Третьего не дано, хоть все SLA перепиши.
Артём вздохнул.
— Поэтому берём "шлём, пока не подтвердят" — продолжил Палыч, — и перестаём требовать от сети честности. Пусть дублирует сколько хочет. Нам нужна идемпотентность: применил операцию один раз или сорок семь, а состояние одно и то же. «Заказ №8812 существует» — это факт, его можно повторять бесконечно, он не размножается. А «плюс один чайник» — это приглашение к катастрофе. Если конечно бабушка сама не жала на плюсик.
— То есть надёжность мы не чиним, а переносим?
— Именно. С транспорта на алгебру. Транспорт у нас из кафки, балансировщиков и молитв, а вот алгебра из математики. Угадай, чему я доверяю больше.
Гена тем временем смотрел на дашборд, где три реплики показывали три разных числа чайников.
— А реплики почему расходятся?
— Сообщения приходят в разном порядке и разными пачками. Одна реплика сначала свернула A с B, потом добавила C. Другая сложила B с C, а A прилетел позже, через Франкфурт пешком. Если операция ассоциативна, а лучше ещё и коммутативна, то неважно, как сгруппировали. Это независимость от топологии вычислений. По сути, ассоциативность и решает, можно ли это вообще параллелить: раздал куски по узлам, собрал как угодно, ответ тот же.
— Звучит как магия.
— Магия — это когда вы говорите «давайте ещё раз ретрайнем». А тут просто свойства. Смотри: путей, которыми реплика могла прийти к своему состоянию, бесконечно много. Дубли, перестановки, задержки, разрывы сети, Гена, случайно перезапустивший под. Бесконечное множество путей исполнения. А нам на них плевать! Нас интересует одно: в конце состояния одинаковые.
— Это как… убывание ранговой функции? — неуверенно спросил Гена, который недавно осилил полстатьи по линейной алгебре.
Палыч посмотрел на него с уважением, которого Гена не видел со времён собеседования.
— Ровно так. Сжимаем бесконечные чередования, ретраи, сообщения до конечных состояний (просто натуральные числа). Ранг работает как абстракция - число оставшихся шагов/раундов, приоритет/дедлайн... Строгое убывание доказывает завершимость и отсутствие "голодания". А ассоциативность, коммутативность и идемпотентность гарантируют, что при сжатии мы ничего не потеряли и лишнего не придумали.
К 21:58 счётчики переписали на идемпотентный мерж. Реплики сошлись. Бабушке отправили один чайник и промокод с извинениями.
Сеть продолжала дублировать сообщения, но теперь это никого не волновало.
Артём написал в общий канал: «Инцидент закрыт. TODO: изучить задачу двух генералов».
Палыч дописал: «И перестать быть третьим генералом, который бесконечно жмёт "отправить ещё раз"».
Гена надел куртку. Было 22:22. Пятница почти не пострадала.
❤18😁7🔥4✍3
Куда это всё идёт? Ну, сперва, разработчики трансформируются в сеньоров, которые управляют небольшим количеством тщательно настроенных агентов в изолированных ветках: раздают задачи, следят за процессом и читают каждый дифф, потому что ответственность за комиты за их личной подписью.
Со временем грань между программистом и продактом будет стираться быстрее, однако ключевым всё же остаётся техническое понимание. Знать, как и почему ломаются системы, и уметь это исправлять в огромных массивах кода, невозможно подделать, просто описывая словами, что нейронке нужно сделать.
И тем не менее, разработка с AI уже сейчас превращается в конвейер: целыми днями тупо ревьюить сгенерированный нейронкой код/спеки. Постепенно такая "автоматизация" сделает профессию программиста невыносимой и для лучших специалистов, они разбегутся в курьеры/на завод, и тогда даже просто поддерживать надёжные системы станет некому.
Качнётся ли этот маятник в обратную сторону (т.к. цифра всё равно охватывает всё больше и больше), скоро увидим.
Это колесо жизни никогда не даёт мирского счастья размером хоть с кончик иглы,
и даже малейшее счастье, которое встретишь, сведётся к страданию перемен.
Со временем грань между программистом и продактом будет стираться быстрее, однако ключевым всё же остаётся техническое понимание. Знать, как и почему ломаются системы, и уметь это исправлять в огромных массивах кода, невозможно подделать, просто описывая словами, что нейронке нужно сделать.
И тем не менее, разработка с AI уже сейчас превращается в конвейер: целыми днями тупо ревьюить сгенерированный нейронкой код/спеки. Постепенно такая "автоматизация" сделает профессию программиста невыносимой и для лучших специалистов, они разбегутся в курьеры/на завод, и тогда даже просто поддерживать надёжные системы станет некому.
Качнётся ли этот маятник в обратную сторону (т.к. цифра всё равно охватывает всё больше и больше), скоро увидим.
Это колесо жизни никогда не даёт мирского счастья размером хоть с кончик иглы,
и даже малейшее счастье, которое встретишь, сведётся к страданию перемен.
6❤28✍3👍1