00:00:00Этот выпуск подкаста будет особенным,
00:00:02потому что вступление сделает Кейси.
00:00:05Кейси, о чём мы сегодня будем говорить?
00:00:09Всем привет и добро пожаловать на подкаст.
00:00:14Номер 45,
00:00:156-й лучший технический подкаст на Spotify согласно последним...
00:00:21чему-то там.
00:00:23Правда..
00:00:29В общем, извините.
00:00:30Сегодня в выпуске я хотел затронуть одну тему.
00:00:33Я собираюсь рассказать о сбое AWS,
00:00:35который произошёл в октябре,
00:00:37но делаю это потому,
00:00:39что хочу поговорить о более важной вещи — о разнице между тем,
00:00:43чтобы действительно что-то понимать,
00:00:45и тем,
00:00:46чтобы говорить,
00:00:47что ты это понимаешь..
00:00:49Знаете,
00:00:49это часто происходит,
00:00:51особенно с теми,
00:00:52кто только начинает карьеру в программировании — если ты джуниор-разработчик или что-то в этом роде,
00:00:59ты только пришёл.
00:01:00И я точно знаю,
00:01:01что со мной так было: ты хочешь выглядеть так,
00:01:04будто всё знаешь,
00:01:05верно?
00:01:06Не хочешь казаться человеком,
00:01:08который не понимает,
00:01:09что происходит.
00:01:10Так что возникает сильное внешнее давление — реальное или нет,
00:01:14но ты чувствуешь,
00:01:16что должен как бы сказать,
00:01:17что понял что-то,
00:01:19или притвориться,
00:01:20что понимаешь,
00:01:21даже если всё немного туманно или ты не совсем разобрался..
00:01:26И даже если это не твоя вина — даже если тебе что-то плохо объяснили или не включили важную информацию — ты всё равно мотивирован вести себя так,
00:01:37будто знал,
00:01:38о чём речь,
00:01:39правильно?
00:01:40Потому что это заставляет тебя казаться умнее или,
00:01:43по крайней мере,
00:01:44не выглядеть джуниором,
00:01:46да?
00:01:47И вот одна из вещей,
00:01:48которую я для себя открыл с возрастом и с опытом программирования: теперь я чуть ли не переспрашиваю,
00:01:56когда мне что-то объясняют.
00:01:58Я прямо такой: мне вообще всё равно,
00:02:00что буду выглядеть глупо..
00:02:03Я говорю: подожди, вернись назад.
00:02:05Я не понял эту часть.
00:02:06Что ты имеешь в виду?
00:02:07Или что означает этот термин?
00:02:09Потому что теперь мне просто на это наплевать..
00:02:12Я больше не беспокоюсь об этом.
00:02:14И я хочу действительно знать,
00:02:15потому что у меня столько опыта программирования,
00:02:17когда я думал,
00:02:18что что-то знаю,
00:02:19или притворялся,
00:02:20что знаю,
00:02:20а потом это мне аукалось..
00:02:22Я хочу действительно знать.
00:02:23Хочу быть уверенным,
00:02:25что когда у меня есть объяснение бага или я думаю,
00:02:28что знаю причину падения производительности,
00:02:30у меня в голове всегда сидит мысль: если я не докопался до самой сути,
00:02:35это может быть что-то другое.
00:02:37Может быть, настоящая причина всё ещё где-то скрыта.
00:02:40А я просто не знаю, потому что не изучил всё до конца.
00:02:43Я просто двигаюсь дальше,
00:02:45потому что так удобнее или что-то в этом роде..
00:02:48Причина,
00:02:49по которой я хотел поговорить о сбое DynamoDB,
00:02:51заключается в том,
00:02:52что в последнее время произошла целая серия громких отключений.
00:02:56Например,
00:02:57был крупный сбой,
00:02:58который обрушил Google,
00:02:59и оказалось,
00:03:00что это была ситуация,
00:03:01когда они не обработали пустое поле,
00:03:03понимаете?
00:03:04То есть в их коде,
00:03:05в том,
00:03:05как они программировали,
00:03:07они типа: «Окей,
00:03:08у нас есть эта штука.
00:03:09Мы загружаем какой-то JSON,
00:03:10и если в JSON ничего нет,
00:03:12мы просто разыменовываем нулевой указатель или что-то в этом роде»,
00:03:16да?
00:03:16Буквально вот так.
00:03:17А потом был случай с CrowdStrike,
00:03:19когда они обрушили весь мир синими экранами смерти.
00:03:22И они дали очень хорошее,
00:03:24действительно качественное объяснение.
00:03:26Они сказали: «Мы используем определённый способ определения размера массива,
00:03:30и у нас оказалось слишком много правил.
00:03:33Поэтому массив переполнился», понимаете?
00:03:35И вот эти случаи были довольно понятными,
00:03:37когда они публиковали то,
00:03:39что называют RCA,
00:03:40или анализом первопричин,
00:03:41верно?
00:03:42Когда они говорили: «Вот почему у нас произошёл сбой».
00:03:45Когда я их читал,
00:03:46у меня не оставалось множества вопросов без ответа.
00:03:49Может,
00:03:50я не знал буквально строку кода,
00:03:52потому что они,
00:03:52возможно,
00:03:53не опубликовали конкретный фрагмент кода,
00:03:55но они дали мне достаточно информации,
00:03:58чтобы я понял: окей,
00:03:59я понимаю,
00:03:59как кто-то написал этот код,
00:04:01и я понимаю глупость,
00:04:02которую они совершили,
00:04:03да?
00:04:04Типа: окей, не делайте так.
00:04:06Понятно.
00:04:06И я полностью в порядке с этим..
00:04:10А со случаем DynamoDB,
00:04:12потому что это всплыло в нашем подкасте,
00:04:15да?
00:04:15Мы говорили об этом,
00:04:17когда тот парень в Guitar Center,
00:04:20помнишь?
00:04:21Сказал: «Я подслушал разговор в пабе», да??
00:04:24Да.
00:04:25Невероятно.
00:04:25Вот мы наблюдаем неуловимого программиста — простое существо,
00:04:29которое проводит большую часть времени в одиночестве,
00:04:32часто в темноте.
00:04:33Но что это?
00:04:33Кто-то неправ в интернете!
00:04:35Наш кодер мгновенно приходит в действие,
00:04:37достигая максимальной скорости в 120 слов в минуту,
00:04:40прежде чем — вспышка!
00:04:41— светлая тема сайта..
00:04:42Естественный враг этих любителей кода оглушает нашего друга.
00:04:45Погоня прервана.
00:04:46Придётся поймать их в следующий раз.
00:04:48Когда они не за компьютерами,
00:04:49они могут часами рисовать грубые символы — то,
00:04:52что они называют досками для маркеров.
00:04:54Исследователи обнаружили тысячи диалектов,
00:04:56причём часто в одном офисе используется более дюжины.
00:04:59Однако ни один лингвист пока не расшифровал,
00:05:01в чём их предназначение..
00:05:03Тщеславные создания — их тела эволюционировали на протяжении тысячелетий,
00:05:08чтобы уметь сидеть в необычных позах,
00:05:10глядя на себя онлайн.
00:05:12Это часто продолжается часами под предлогом,
00:05:15что они ждут код-ревью,
00:05:16но если спросить,
00:05:17почему они так неактивны...
00:05:19И наконец,
00:05:20после долгого дня,
00:05:21в который сделано очень мало,
00:05:23наши клавиатурные воины готовятся ко сну.
00:05:26Быстрое чтение — и свет гаснет..
00:05:29Спокойной ночи, маленький кодер.
00:05:30Так как же я так хорошо сплю по ночам?
00:05:32Ну, мне помогает Sentry давить этих багов.
00:05:36И я говорю не о каких-то крошечных жучках из Южной Дакоты,
00:05:40которые дохнут зимой.
00:05:41Я говорю о больших, злобных джунглевых багах.
00:05:45И я их, кстати, не боюсь, просто...
00:05:47но я могу раздавить эти баги с помощью Seer от Sentry.
00:05:51Так что у меня появилась дополнительная мотивация пойти и посмотреть,
00:05:56сколько информации они опубликовали.
00:05:59И я читал — я уже читал после этого их краткое изложение,
00:06:03где они опубликовали RCA,
00:06:04и он был очень расплывчатым.
00:06:06Типа, RCA по сути ничего толком не объяснял.
00:06:10Потом я заметил,
00:06:11что они выложили полную презентацию — на re:Invent в декабре,
00:06:15они...
00:06:16или я не знаю,
00:06:17был ли re:Invent в декабре,
00:06:19но видео вышло в декабре,
00:06:21презентация с re:Invent,
00:06:22где они разбирали этот сбой..
00:06:26Так что я посмотрел всё это целиком.
00:06:28И после того,
00:06:29как прочитал весь RCA и посмотрел всю презентацию,
00:06:33я всё равно остался в недоумении.
00:06:35Я не вижу здесь реального объяснения бага, понимаете?
00:06:39Типа,
00:06:40я пытаюсь понять,
00:06:41в чём был настоящий баг,
00:06:42но это так и не было объяснено..
00:06:45И вот что я хотел сделать — просто поговорить об этом,
00:06:48разобрать,
00:06:48почему,
00:06:49на мой взгляд,
00:06:49они не объяснили,
00:06:50в чём была ошибка,
00:06:51и использовать это как пример того,
00:06:53что люди не должны просто говорить: «О,
00:06:55окей,
00:06:55я понял,
00:06:56в чём была ошибка».
00:06:57Потому что люди отвечали мне и говорили: «О,
00:06:59вот,
00:06:59позволь мне объяснить тебе,
00:07:01в чём была ошибка».
00:07:02А потом они просто объясняли то же самое.
00:07:04Я такой: это не та ошибка, понимаете?
00:07:05Так что все делают вид,
00:07:06что понимают,
00:07:07потому что прочитали что-то вроде: нет,
00:07:09если ты не можешь сказать мне,
00:07:10в чём была настоящая ошибка,
00:07:12тогда мы ещё не закончили,
00:07:13верно??
00:07:14Нам нужно более полное объяснение.
00:07:16Так что всё, что я говорю, звучит разумно?
00:07:18Да.
00:07:19Прежде всего,
00:07:20я просто хочу сказать,
00:07:21что я точно понял,
00:07:22что ты имел в виду,
00:07:23Кейси..
00:07:23Прямо с самого начала, да.
00:07:25Буквально сразу.
00:07:27Ты такой: окей, я знаю, я точно понял, что ты говоришь.
00:07:31Никаких вопросов с моей стороны.
00:07:34Никаких препятствий.
00:07:36Спасибо всем.
00:07:37У меня всё отлично..
00:07:39Увидимся завтра, ребята.
00:07:40Знаете, никаких проблем.
00:07:42Я просто хочу сказать,
00:07:43что мне очень нравится слушать,
00:07:45как Кейси говорит в подкасте,
00:07:46когда я слушаю на Spotify,
00:07:48но и прямо сейчас тоже — я мог бы слушать,
00:07:51как ты говоришь,
00:07:52целый час.
00:07:52Отличная реклама Spotify, кстати.
00:07:54Я как раз собирался сказать,
00:07:56я собирался сказать,
00:07:57что особенно когда слушаешь на Spotify,
00:07:59качество невероятное.
00:08:01Ты ещё получаешь бонусные дополнения, верно?
00:08:03Всю болтовню до и после самого эпизода.
00:08:06Мы начали выкладывать более длинные версии на Spotify,
00:08:09где больше этих дополнительных моментов.
00:08:11Да.
00:08:12Меньше времени уделяется строго теме,
00:08:14но чуть больше треп на Spotify,
00:08:16потому что живая аудитория получает весь трёп..
00:08:19Они приходят сюда.
00:08:20Они слышат про Трэша и его зависимость от покемонов,
00:08:23о которой ты,
00:08:23вероятно,
00:08:24даже не знаешь,
00:08:25потому что слушал это на YouTube,
00:08:26верно?
00:08:27Ты не получаешь возможности услышать все эти весёлые штуки.
00:08:30Это довольно сложная продажа для первых 10 минут видео на YouTube.
00:08:33Очень сложная продажа для YouTube-видео.
00:08:35Типа: я собираюсь смотреть,
00:08:36как четыре парня обсуждают что-то,
00:08:38чего я даже не понимаю.
00:08:39И это называется DynamoDB.
00:08:40Ага..
00:08:41Раз мы начинаем подкаст, может, нам стоит представить Адама.
00:08:43О да.
00:08:44Это очень хорошая мысль..
00:08:45Мы вообще этого не сделали.
00:08:46Привет.
00:08:47Расскажи нам немного о том, почему ты сегодня в подкасте..
00:08:50Потому что я в доме у Ти-Джея — это причина номер один,
00:08:55почему Ти-Джей требует,
00:08:57чтобы все люди,
00:08:58которые посещают его дом,
00:09:00участвовали в подкасте.
00:09:02Пару раз было неловко.
00:09:04Да.
00:09:04Ага.
00:09:05Кто ты на самом деле??
00:09:07Кроме того, что AWS Hero.
00:09:09Я даже не это.
00:09:10Я не был AWS Hero.
00:09:12Ладно..
00:09:13Выгнали из группы супергероев.
00:09:15Как это вообще работает?
00:09:16Просто тебя не продлевают..
00:09:18Я был героем на один срок,
00:09:20и они решили: «О,
00:09:21ты…» это что,
00:09:21платная штука?
00:09:22Платишь, чтобы быть героем??
00:09:24Нет, нет, просто мне стало всё равно.
00:09:26Вообще не говорил об этом.
00:09:28Так что они подумали: может, он больше не герой.
00:09:31Теперь он злодей.
00:09:32Кейси выглядит так,
00:09:33будто он часть какого-то детектива с убийством.
00:09:36Он там стоит.
00:09:36О, чувак.
00:09:37Сейчас у нас будет, эээ, как там, Ник Хилл.
00:09:39Тот человек, который всё рисует на доске.
00:09:42А потом это всплывает.
00:09:43Кейси Мураторио.
00:09:44Вот кого ты имеешь в виду.
00:09:46Мураторио.
00:09:46Это Мураторио или Мураторио?
00:09:48О боже.
00:09:49Ты собираешься показывать визуалы, да?
00:09:51Так что я знаю, это лучший подкаст..
00:09:54Буквально, это лучший, в котором можно участвовать.
00:09:57Эээ, произносится Мураториё в моей семье.
00:10:00Почти как будто там была Y,
00:10:02вроде Мураториё,
00:10:03но это правильно.
00:10:04На самом деле это не очень-то имеет смысл,
00:10:06потому что это итальянская,
00:10:08это итальянская фамилия.
00:10:09А в итальянском это было бы Мураторио или Мураторио..
00:10:13Не складывается.
00:10:14Так что почему получилось Мураториё — понятия не имею.
00:10:19Это какая-то итало-американская иммигрантская история,
00:10:23видимо.
00:10:23Не знаю.
00:10:24Окей.
00:10:25Так вот, по сути, вот что они сказали..
00:10:28У них есть так называемые конечные точки API,
00:10:31но они называют их правильно.
00:10:33И это доменные адреса.
00:10:35Например,
00:10:36если вы посмотрите в DNS,
00:10:37это имя,
00:10:38которое вы будете искать,
00:10:40чтобы знать,
00:10:41куда отправлять свои запросы к DynamoDB.
00:10:44И эти вещи, я полагаю, выглядят примерно так..
00:10:47И Адам,
00:10:48вероятно,
00:10:49может подтвердить это,
00:10:50потому что он является или был героем.
00:10:53Они выглядят как...
00:10:55О, он отстаёт.
00:10:55Да.
00:10:56Мы на несколько секунд отстаём.
00:10:58Потому что наше видео исчезло на River.
00:11:00О, вот оно.
00:11:01Так вот,
00:11:01они выглядят как dynamodb.use-east-1.api.aws или что-то в этом роде.
00:11:05И я полагаю,
00:11:06это зависит от того,
00:11:07используете ли вы IPv6 или IPv4.
00:11:09У них разные имена в зависимости от обстоятельств или от того,
00:11:13используете ли вы что-то специфическое,
00:11:15типа они говорили,
00:11:17что правительственные организации используют другой адрес или что-то такое.
00:11:21Так что эти имена — это,
00:11:23по сути,
00:11:23имена,
00:11:24которые вы жёстко прописываете в своём приложении,
00:11:27где указываете: когда мне нужно что-то сделать с DynamoDB,
00:11:30я собираюсь запросить это.
00:11:32Это понятно.
00:11:32И правильно ли это звучит, Адам.
00:11:34Потому что я не использую AWS.
00:11:36Да.
00:11:37Да.
00:11:37Да?
00:11:38Всё верно.?
00:11:38Так что,
00:11:39знаете,
00:11:39вы запрашиваете что-то вроде этого,
00:11:41и вы отправляете это идеально.
00:11:42Я имею в виду, я понимаю, что он говорит.
00:11:45Да.
00:11:45Так что это потом перенаправит вас куда-то,
00:11:48потому что,
00:11:48очевидно,
00:11:49нет какой-то одной машины,
00:11:51которая будет обрабатывать весь трафик DynamoDB во всей вселенной.
00:11:55Даже если вы разделите его по регионам,
00:11:57что видно здесь,
00:11:58вы вроде как должны выбрать регион.
00:12:00Я полагаю, вы не отправляете его на какой-то главный адрес.
00:12:04Вы отправляете его на региональный адрес,
00:12:06или,
00:12:07может быть,
00:12:08есть главный адрес,
00:12:09который вы можете использовать,
00:12:11и он всё разберёт.
00:12:12Не знаю..
00:12:13Но в любом случае,
00:12:14в какой-то момент вы обращаетесь к этому,
00:12:17и это должно указывать,
00:12:18по сути,
00:12:19на схему балансировки нагрузки.
00:12:21Так что эта штука должна указывать,
00:12:23по сути,
00:12:24на то,
00:12:24что они назвали DNS-деревом..
00:12:27Хотя они никогда толком не объяснили древовидную природу этого.
00:12:30Это звучало скорее как взвешенный массив,
00:12:32если хотите,
00:12:33где вы просто говорите: вот куча машин,
00:12:35и вы будете выбирать эти машины на основе весов,
00:12:38которые мы устанавливаем,
00:12:39чтобы мы могли балансировать нагрузку,
00:12:41понимаете?
00:12:41Так что если машина отстаёт,
00:12:43возможно,
00:12:43мы устанавливаем её вес пониже.
00:12:45А если машина кажется довольно свободной,
00:12:47мы устанавливаем её вес повыше.
00:12:49И вот они назвали это деревом.
00:12:50Так что я предполагаю, что это дерево.
00:12:52Они никогда не объяснили,
00:12:54в чём заключается древовидная часть,
00:12:56но это имя должно указывать.
00:12:57Могу я прервать на одну секунду??
00:13:00Кстати,
00:13:00кто-то действительно получил повышение до L6 благодаря этому дереву.
00:13:04Так что я думаю,
00:13:04в следующий раз вам стоит выяснить,
00:13:06что это за дерево.
00:13:07Потому что это много значило для кого-то.
00:13:09Хорошо.
00:13:10Произошёл какой-то пакет и инженеры случились.
00:13:12Я согласен.
00:13:12Дерево, вероятно, важно.
00:13:14Просто оно не важно для бага.
00:13:15И даже при этом,
00:13:16так что я скажу,
00:13:17что им не было необходимости объяснять дерево..
00:13:19Так что я не против того,
00:13:21что они пропустили объяснение того,
00:13:23что делает дерево.
00:13:24Но у меня тоже быстрый вопрос..
00:13:25Да.
00:13:26Оно называется деревом потому,
00:13:27что это анализ первопричины,
00:13:28или нет??
00:13:29Больше никаких шуток.
00:13:31Мы слишком отклонились от темы.
00:13:33Извините.
00:13:34Извините.
00:13:34Так вот, это должно указывать на то..
00:13:37И эта,
00:13:38эта своего рода схема балансировки нагрузки,
00:13:40основанная на DNS-записях,
00:13:41и то,
00:13:42как они описали это в своей презентации,
00:13:44заключается в том,
00:13:45что они использовали бы что-то вроде,
00:13:47скажем,
00:13:48plan one 45 dot dynamo DB,
00:13:49типа DDB dot AWS,
00:13:50верно?
00:13:50Это корень того дерева,
00:13:52я полагаю,
00:13:52не корневая причина,
00:13:53а именно это дерево,
00:13:54оно содержало бы,
00:13:55это запись верхнего уровня из множества записей,
00:13:58которые позволяют ему выполнять балансировку нагрузки.
00:14:01И я предполагаю,
00:14:02что Route 53 в некотором роде обладает этой возможностью балансировки нагрузки.
00:14:06Я читаю между строк презентации.
00:14:08Они не сказали этого прямо,
00:14:09но я предполагаю,
00:14:10что Route 53,
00:14:11через который всё это делается,
00:14:13знаете,
00:14:13который является их собственной DNS-системой,
00:14:15позволяет этой балансировке нагрузки происходить — вы просто настраиваете здесь всё,
00:14:20что говорит,
00:14:21как балансировка нагрузки должна работать прямо сейчас.
00:14:24А затем он выберет правильную машину на основе какой-то рандомизации по весам или чего-то такого.
00:14:29Так вот,
00:14:30они сказали,
00:14:30что это имя,
00:14:31которое действительно существует.
00:14:33И, по-видимому, есть дерево или что-то в этом роде.
00:14:36Это имя — то,
00:14:36которое они просто использовали для презентации.
00:14:39Они никогда не использовали на самом деле человекочитаемое имя для этого плана,
00:14:43типа one 45,
00:14:44которое я здесь написал или что-то такое.
00:14:46На самом деле это был хеш чего-то.
00:14:48Так что это было бы на самом деле что-то вроде,
00:14:51знаете,
00:14:51zero a F E one,
00:14:52two,
00:14:52знаете,
00:14:53nine a или что-то в этом роде,
00:14:54верно.
00:14:55Именно это там и было бы.
00:14:56Так что если бы вы пошли и посмотрели,
00:14:58вы бы не увидели человекочитаемого имени,
00:15:01или,
00:15:01по крайней мере,
00:15:02в то время вы бы не увидели,
00:15:04я полагаю,
00:15:04вы бы не увидели типа plan one 45.
00:15:06Вы бы просто увидели это.
00:15:07И поэтому идея была такой: окей,
00:15:09пользователь приходит использовать это.
00:15:11Они запрашивают это имя, Route 53 направит их типа сюда.
00:15:14И эта штука — какое-то дерево балансировки нагрузки,
00:15:17которое Route 53 может использовать,
00:15:19что позволит вам попасть туда,
00:15:21куда нужно.
00:15:21Верно.
00:15:22В конечном итоге они дадут вам реальную машину,
00:15:24на которую можно отправлять трафик.
00:15:26Опять же, они ничего из этого не описывали.
00:15:28Так что я понятия не имею, как это всё работает.
00:15:31Я никогда не трогал и не использовал Route 53.
00:15:34Так что понятия не имею,
00:15:35но просто предположим,
00:15:36что это происходит,
00:15:37потому что для этого бага это не важно..
00:15:41У нас есть AWS-герой.
00:15:42Так что если вы,
00:15:43если вы в замешательстве,
00:15:44вы всегда можете спросить Адама,
00:15:46и у него могут быть дополнительные соображения.
00:15:48Я имею в виду, да, давай..
00:15:50Ну,
00:15:51у Route 53 есть множество разных способов распределения трафика.
00:15:54Так что да, взвешенный — один из них.
00:15:55И похоже на то, что они описали..
00:15:57Так что каким-то образом они настроили эти записи с этим.
00:15:59И они просто не сказали как,
00:16:01но что-то,
00:16:01что-то в древовидном формате это делало.
00:16:03Я предполагаю,
00:16:03что там что-то вроде взвешенного,
00:16:05типа у дерева есть взвешенные,
00:16:06там есть пара весов наверху,
00:16:07которые разветвляются на большее количество весов или что-то в этом роде,
00:16:10потому что с ними так легче работать,
00:16:12потому что их много или что-то такое..
00:16:14Кто знает?
00:16:14В любом случае, понятия не имею.
00:16:16Дело в том,
00:16:16что это то,
00:16:17что должно происходить в нормальном режиме..
00:16:20Так вот,
00:16:20причина,
00:16:21по которой это называется plan 145 здесь,
00:16:23хотя на самом деле это был бы какой-то хеш-код,
00:16:26но они ссылаются на него как на plan 145,
00:16:28в том,
00:16:28что балансировка нагрузки,
00:16:30как вы можете себе представить,
00:16:32должна быть своего рода непрерывной,
00:16:34потому что машины DynamoDB постоянно что-то делают.
00:16:37Они становятся всё более перегруженными.
00:16:39Машины выходят из строя или падают,
00:16:41или кто знает что,
00:16:42верно??
00:16:43Может происходить отключение.
00:16:45Можно добавить новую мощность.
00:16:47И всё это нужно постоянно обновлять, буквально всё время.
00:16:50Так что эта главная конечная точка API,
00:16:53к которой вы подключаетесь,
00:16:55постоянно требует корректировки того дерева,
00:16:58на которое она указывает.
00:17:00И делают они это так: они создают другое дерево,
00:17:03дерево,
00:17:03на которое они собираются перейти,
00:17:06понимаете?
00:17:06Они создают что-то вроде,
00:17:08ну знаете,
00:17:09план 146 или что-то в этом роде.
00:17:11И они строят всё дерево здесь.
00:17:13А потом,
00:17:13когда всё готово,
00:17:15типа когда это дерево завершено,
00:17:17они берут вот эту,
00:17:18ну знаете,
00:17:19вот эту запись здесь,
00:17:20и вместо того,
00:17:21чтобы она указывала на ту,
00:17:23они указывают её на эту,
00:17:24верно?
00:17:25То есть вы создаёте новую,
00:17:27и они переходят на неё,
00:17:28просто изменив это имя.
00:17:30Так вот,
00:17:30по какой-то причине,
00:17:32и эта причина особо не объясняется..
00:17:36То,
00:17:36как они настроили этот процесс,
00:17:38они разделили его на две части.
00:17:40Есть что-то,
00:17:41что называется планировщик,
00:17:42который в основном определяет,
00:17:44как должно выглядеть новое дерево.
00:17:46Так что можете представить,
00:17:48есть какая-то машина под названием планировщик.
00:17:51И я не знаю,
00:17:51это реальная машина или это просто процесс,
00:17:54запущенный на какой-то машине,
00:17:56которая выполняет и другие задачи,
00:17:58кто знает.
00:17:58Но есть что-то, что называется планировщик.
00:18:01И насколько я мог понять,
00:18:02он один,
00:18:03то есть существует просто планировщик,
00:18:05который сидит себе и определяет,
00:18:07как должен выглядеть новый план,
00:18:09на который мы собираемся переключиться..
00:18:13И он делает это постоянно.
00:18:15Так что он генерирует план 145,
00:18:17потом он генерирует план 146,
00:18:19потом генерирует 147,
00:18:21148,
00:18:219,
00:18:2210,
00:18:22ну знаете,
00:18:23бла,
00:18:24бла,
00:18:24бла,
00:18:25бла,
00:18:25бла,
00:18:26да?
00:18:26И он просто продолжает выдавать планы до бесконечности,
00:18:30потому что это его работа.
00:18:32Но вот что интересно, он их никогда фактически не создаёт.
00:18:37Его задача не в том,
00:18:38чтобы когда-либо создавать их в Route 53.
00:18:41Его задача просто определить,
00:18:43какими бы они были,
00:18:45если бы кто-то внёс их в Route 53.
00:18:47А дальше у них есть три исполнителя..
00:18:50Эти исполнители получают план от планировщика и вносят его в Route 53.
00:19:06Понятно?
00:19:07Итак,
00:19:07один планировщик,
00:19:08насколько я понимаю произношение,
00:19:10три исполнителя.
00:19:11Не было никакого объяснения, почему это устроено именно так.
00:19:15Они сказали,
00:19:16что причина,
00:19:17по которой существует три исполнителя,
00:19:19в том,
00:19:19что это должно быть отказоустойчиво,
00:19:22типа если один из них выйдет из строя или что-то в этом роде.
00:19:25Но они так и не объяснили,
00:19:27почему тогда не нужны три планировщика,
00:19:29потому что если планировщик упадёт,
00:19:32то исполнителям нечего будет исполнять.
00:19:34Так что это не особо имело смысл.
00:19:36Так что в материале не было объяснения,
00:19:38почему эта структура выглядит именно так.
00:19:41Это не особо важно для бага,
00:19:43что она выглядит именно так,
00:19:44хотя в каком-то смысле важно,
00:19:46как мы увидим позже.
00:19:47Так что меня немного смутило,
00:19:49что они это не обосновали,
00:19:51но ладно.
00:19:51Так что надеюсь, это понятно.
00:19:53У нас есть планировщик.
00:19:54У нас есть три исполнителя.
00:19:56Исполнители все пытаются исполнить этот план.
00:19:59Так вот,
00:19:59что здесь происходит,
00:20:01опять же,
00:20:01по причинам,
00:20:02о которых в презентации сказали только одно: это упрощает понимание.
00:20:06Это единственная информация об этом.
00:20:08Они сказали, что это упрощает понимание.
00:20:11Поскольку это упрощает понимание,
00:20:13эти исполнители используют сериализацию.
00:20:15То есть вместо того,
00:20:17чтобы они просто пытались создать записи,
00:20:19и если записи уже там есть,
00:20:21просто не создавать их или что-то в этом роде,
00:20:24другими словами,
00:20:25у меня три человека работают..
00:20:29Мы все хотим создать,
00:20:31ну знаете,
00:20:31допустим вот эту запись верхнего уровня,
00:20:34plan146.ddb.aws,
00:20:36да?
00:20:36Мы все пытаемся это сделать.
00:20:38Один из нас делает это первым.
00:20:40Следующий человек пытается это сделать,
00:20:42а оно уже там или что-то в этом роде,
00:20:44верно?
00:20:45Мы все пытаемся создать одну и ту же запись.
00:20:47Так что в теории мы могли бы просто посадить трёх человек,
00:20:51которые бы случайным образом долбили по той части плана,
00:20:54по которой они пытаются долбить,
00:20:56и в теории всё должно как бы работать,
00:20:58верно?
00:20:58И у меня сложилось впечатление,
00:21:00хотя он прямо этого не сказал,
00:21:02у меня сложилось впечатление от докладчика,
00:21:05что он бы согласился с тем,
00:21:06что я только что сказал,
00:21:08то есть они могли бы просто запустить их произвольно,
00:21:11и это сработало бы или должно было бы быть нормально.
00:21:14Но он сказал,
00:21:15что они используют сериализацию,
00:21:16чтобы об этом было проще рассуждать.
00:21:19Это означает,
00:21:19что вместо того,
00:21:20чтобы эти исполнители просто так по нему молотили,
00:21:23они вместо этого пытаются получить блокировку для той конечной точки,
00:21:27которую они пытаются обновить.
00:21:29Другими словами,
00:21:30если этот человек пытается обновить одну из этих штук,
00:21:33и у меня сложилось впечатление,
00:21:35что блокировка происходит,
00:21:37если ты пытаешься обновить вот это,
00:21:39но это могло быть,
00:21:40если ты пытаешься обновить вот это,
00:21:42или это могло быть на обоих.
00:21:44Они на самом деле никогда не говорили на все 100%,
00:21:47если я правильно помню,
00:21:48где именно происходила блокировка.
00:21:50Но блокировка происходит так: они говорят: окей,
00:21:53я создам блокировку,
00:21:54которая является DNS-записью.
00:21:56И используя тот факт,
00:21:57что Route 53 имеет концепцию атомарности,
00:21:59то есть,
00:22:00знаете,
00:22:00я могу сделать две вещи,
00:22:02и если обе не выполнятся успешно,
00:22:04то ни одна из них не выполнится..
00:22:08По сути они сделали систему блокировок,
00:22:11которая блокирует через Route 53.
00:22:13То есть DNS-записи Route 53 фактически являются записью блокировки,
00:22:17если это имеет смысл.
00:22:19Можно быстрый вопрос?
00:22:20Да.
00:22:20Ты сказал, что это делается через сериализацию?
00:22:23Я не совсем понимаю, что это значит.
00:22:26Потому что я думал,
00:22:27сериализация — это просто преобразование из одной памяти в другое представление в памяти чего-то.
00:22:33Извини, другая сериализация.
00:22:35Да, это тоже сериализация.
00:22:36В данном случае мы имеем в виду буквально временную сериализацию,
00:22:40то есть они хотели,
00:22:42чтобы у этих исполнителей был какой-то способ организовать своё поведение в определённом порядке,
00:22:48а не просто произвольно.
00:22:49И способом, которым они это сделали, была блокировка.
00:22:53Так что произойдёт вот что: вместо того,
00:22:55чтобы этот человек просто делал то,
00:22:57что он собирается делать,
00:22:59типа,
00:22:59окей,
00:23:00я закончил это,
00:23:01я сейчас укажу этого парня на план 146.
00:23:03Вместо этого он пытается получить блокировку на,
00:23:06типа,
00:23:07это,
00:23:07верно?
00:23:08И если он не получает блокировку, он не делает изменение.
00:23:11Так что только один из этих исполнителей может находиться в процессе обновления этого в любой момент времени.
00:23:18Это имеет смысл?
00:23:19Угу.
00:23:20Опять же,
00:23:20что именно они пытались этим достичь,
00:23:23никогда не объяснялось.
00:23:24Они просто сказали,
00:23:25что так проще рассуждать,
00:23:27и на этом оставили.
00:23:28Так что я не знаю, почему они считали это улучшением.
00:23:31И забавно, что именно это в итоге обнаруживает баг.
00:23:35Так что это не было улучшением.
00:23:37Если что, это, вероятно, было плохо.
00:23:39Но Кейси,
00:23:39ты говоришь,
00:23:40у них нет,
00:23:41типа,
00:23:41у них нет веской причины,
00:23:43они говорят,
00:23:44мы заставим исполнителей работать почти как по одному?
00:23:47Зачем у них вообще три исполнителя?
00:23:49Я не понимаю.
00:23:50Типа, почему у них не один?
00:23:52Они просто этого не говорят.
00:23:54Мы не знаем почему.
00:23:55И они не совсем объяснили,
00:23:56типа,
00:23:57я не очень услышал объяснения того,
00:23:59как у тебя три конкурентных исполнителя.
00:24:02Ты ожидаешь,
00:24:02что они могут упасть,
00:24:04вот почему у тебя их три..
00:24:07Верно.
00:24:08Но они берут блокировку.
00:24:09Так что происходит,
00:24:10если этот парень берёт блокировку,
00:24:12а потом падает??
00:24:13Типа, я тоже не услышал объяснения этому.
00:24:16Так что всё это меня очень запутало.
00:24:18Ну типа,
00:24:19я,
00:24:19я,
00:24:20я не жалуюсь на это в контексте того,
00:24:22о чём мы тут говорим,
00:24:23потому что для сути дела это неважно.
00:24:26Но как презентация — у меня возникло столько вопросов.
00:24:29Я такой: я вообще не понимаю,
00:24:31зачем вы всё это делали,
00:24:32если честно.
00:24:33Да.
00:24:33И возможно,
00:24:34это,
00:24:35опять же,
00:24:35отчасти может быть потому,
00:24:37что я не пользуюсь сервисами AWS.
00:24:39Может,
00:24:39некоторые из этих вещей были бы очевидны,
00:24:42если бы вы регулярно использовали Route 53 или что-то такое,
00:24:45вы бы сказали: а,
00:24:46это потому что блокировки можно установить с таймаутом,
00:24:50или там,
00:24:50не знаю.
00:24:51Да.
00:24:51Но в общем, да, так что они это делают.
00:24:54И что в итоге происходит — то,
00:24:56что вскрывает баг,
00:24:57это то,
00:24:57что в итоге происходит следующее: эти исполнители,
00:25:00когда они не получают блокировку,
00:25:02они просто делают откат,
00:25:04да?
00:25:04Они в основном просто такие: окей,
00:25:06дай-ка я подожду и попробую снова.
00:25:08То есть исполнитель,
00:25:10этот исполнитель пытается получить блокировку,
00:25:12но кто-то другой уже владеет блокировкой.
00:25:15Поэтому он просто немного ждёт.
00:25:17Он снова пытается получить блокировку.
00:25:19Вот что будет происходить.
00:25:21Да.
00:25:21И они сказали,
00:25:22что произошло то,
00:25:23что они столкнулись с патологическим случаем,
00:25:26цитирую,
00:25:26где один из исполнителей,
00:25:28ну знаете,
00:25:29исполнил какой-то план.
00:25:30И этот план, скажем, был довольно старым.
00:25:32Кажется, они использовали 110 в качестве примера.
00:25:35Так что он исполнил план 110.
00:25:37И он хочет направить,
00:25:39ну знаете,
00:25:39типа: мне нужно настроить API так,
00:25:41чтобы он указывал на мой 110,
00:25:43пытается получить блокировку для обновления dynamodb.use.one или что там ещё,
00:25:48и терпит неудачу,
00:25:49потому что кто-то другой исполняет план 111 или что-то вроде того.
00:25:53Да.
00:25:53Или план 109 мог быть предыдущим планом.
00:25:56Так что другие исполнители это делают.
00:25:58Он не может это сделать.
00:26:00Он откатывается.
00:26:01Да..
00:26:02И помните, этот исполнитель здесь — мы на 110.
00:26:05Он пытается, он реально хочет его исполнить..
00:26:07Он пытается снова.
00:26:08Кто-то другой владеет блокировкой.
00:26:10Теперь он пытается снова — всё ещё заблокировано.
00:26:12Этот парень сидит на 110, отчаянно пытаясь исполнить.
00:26:15Не может.
00:26:16По-видимому,
00:26:16это просто происходило так много раз,
00:26:18что другие исполнители,
00:26:19а планировщик при этом всё это время штампует новые планы.
00:26:22Да..
00:26:23Другие исполнители,
00:26:24они доходят до типа 145 или что-то такое,
00:26:27и 146 — они исполняют планы,
00:26:29которые далеко впереди 110.
00:26:30Да.
00:26:31А этот парень всё ещё застрял,
00:26:33потому что ему просто не везёт и он никак не получает блокировку.
00:26:37Да.
00:26:38Наконец,
00:26:38в какой-то момент,
00:26:39после того как план 145 уже был исполнен и на него указал какой-то другой исполнитель,
00:26:45и всё такое,
00:26:46план 110 — этот исполнитель всё ещё пытается это сделать и наконец получает блокировку.
00:26:51Ну типа да.
00:26:52И тогда он говорит: окей, мы теперь указываем на 110.
00:26:56Да.
00:26:56Точно..
00:26:58Так что теперь он на супер старом устаревшем плане,
00:27:00но на самом деле это не должно быть проблемой.
00:27:02Да..
00:27:03Потому что в конце концов в следующий раз,
00:27:04когда какой-нибудь исполнитель что-то сделает,
00:27:06это будет гораздо более поздний план.
00:27:07Они просто исполнят план,
00:27:08ну знаете,
00:27:09146 или семь,
00:27:09или восемь,
00:27:10или что там.
00:27:10И мы переключим его обратно на это,
00:27:12и мы вернёмся к свежему плану.
00:27:13Так что у всех просто будет плохая балансировка нагрузки минут на несколько,
00:27:17но потом всё будет нормально.
00:27:18Да.
00:27:19У них действительно была плохая балансировка нагрузки как минимум несколько минут..
00:27:22Да.
00:27:23Верно.
00:27:23Ну, всё гораздо хуже, чем это.
00:27:26Вот что должно было произойти.
00:27:29Да..
00:27:30То есть вот так они и ожидали, что это будет работать.
00:27:34Понятно.
00:27:34Проблема в том,
00:27:35что они также не хотели,
00:27:37чтобы Route 53 забился всеми этими записями.
00:27:40Потому что если бы они их просто оставляли,
00:27:42в итоге через,
00:27:43ну знаете,
00:27:44три месяца у вас там 8 миллиардов записей,
00:27:47которые вы запихнули в Route 53 за каждые,
00:27:50ну знаете,
00:27:50пару минут вы туда помещаете это большое дерево весов и всё такое.
00:27:55Они такие: окей,
00:27:56в какой-то момент нам просто надо почистить эти планы..
00:28:00Итак,
00:28:00исполнители также ищут планы,
00:28:02которые старше определённого времени.
00:28:05И если они старше определённого времени, они их удаляют.
00:28:09Получилось так: они указывали на план 110.
00:28:12Этот исполнитель наконец получает блокировку.
00:28:15Он указывает на 110.
00:28:16Другой исполнитель такой: о, вау, 110, чувак, это же старьё.
00:28:20Нам надо от этого избавиться, и удаляет его.
00:28:23Так что теперь DynamoDB us-east-1.api.aws указывает на запись,
00:28:27которую невозможно разрешить.
00:28:29Понимаете.
00:28:30Это просто что-то,
00:28:31на самом деле,
00:28:32опять же,
00:28:33это выглядело бы не как план 110.
00:28:35Это выглядело бы как OAFE129A,
00:28:37какой-то хеш,
00:28:38точка,
00:28:39верно,
00:28:39DDB.aws?
00:28:40Но он указывает на это имя.
00:28:41А если вы запросите это имя, вы ничего не получите..
00:28:46То есть в этот момент происходило следующее: все,
00:28:49кто пытался получить адрес для отправки данных,
00:28:51получали обратно неразрешимое имя,
00:28:53в общем-то.
00:28:54Верно?
00:28:54И я не особо знаю,
00:28:55что происходит в Route 53,
00:28:56когда это случается,
00:28:58но по сути вы получали обратно что-то,
00:29:00что либо невозможно использовать,
00:29:01либо просто какую-то абракадабру вместо IP-адреса,
00:29:04кто знает.
00:29:05Но в любом случае,
00:29:06если вы попытались бы это реально использовать,
00:29:08вы бы не получили ответа.
00:29:09Так-то..
00:29:10Интересно.
00:29:11Это потому,
00:29:12что AWS недостаточно использует Rust,
00:29:14ведь это очевидно баг use-after-free?
00:29:16И я думаю, Rust решил бы это, верно?
00:29:18Если бы вы переписали Route 53 полностью на Rust,
00:29:21очевидно,
00:29:22всех этих проблем бы не было.
00:29:23Нет,
00:29:24если конкретнее,
00:29:25я думаю,
00:29:25в презентации они действительно говорили,
00:29:28не про Rust,
00:29:29а они говорили,
00:29:30что именно произойдёт,
00:29:31то есть,
00:29:31я думаю,
00:29:32когда вы запрашивали эту штуку или либо эту штуку,
00:29:35либо эту штуку,
00:29:36я не знаю,
00:29:36на что именно они ссылались,
00:29:38потому что не совсем помню,
00:29:40вы бы просто получили обратно что-то типа «записей не найдено».
00:29:43Вот такой конечный результат того,
00:29:46что произошло бы,
00:29:47будь то от запроса этого или запроса того,
00:29:49я не уверен,
00:29:50но просто получаете обратно «записей не найдено».
00:29:53Это то, что вы бы получили, пытаясь вызвать этот API.
00:29:56То есть какую бы библиотеку вы ни использовали для работы с DynamoDB,
00:30:00она просто скажет: эй,
00:30:01записей не найдено,
00:30:03братан.
00:30:03Извини.
00:30:04Верно?
00:30:04Так вот,
00:30:05если вы спросите кого угодно в интернете,
00:30:07да,
00:30:08они все такие: да,
00:30:09они объяснили баг.
00:30:10Вот баг.
00:30:10Баг в том, что было это состояние гонки, верно?
00:30:13Все,
00:30:14потому что все,
00:30:14как только вы говорите «состояние гонки»,
00:30:17у всех мозг отключается.
00:30:18Они типа: о, окей, ну, это было состояние гонки.
00:30:21Готово.
00:30:22Тут нечего смотреть, да?
00:30:23Так что они такие: это состояние гонки.
00:30:26Они объяснили.
00:30:27А нет, они не объяснили.
00:30:28Потому что если подумать,
00:30:30что произойдёт здесь,
00:30:31сразу после этого,
00:30:32все получают это,
00:30:33появляется новый исполнитель.
00:30:35Новый исполнитель просто выполнит новое действие, верно?
00:30:38И баг, верно, заключается в том: почему этого не произошло?
00:30:42Вот настоящий анализ первопричины,
00:30:44который я хотел увидеть — почему следующий исполнитель не пришёл и не исправил это?
00:30:49Могу я кое-что добавить?
00:30:50Разве это тоже не баг?
00:30:52Типа,
00:30:52зачем писать запись настолько старую,
00:30:54что её нужно сразу удалить?
00:30:56Ну, это не...
00:30:57это потому, что это...
00:30:58этот парень записал её довольно давно.
00:31:00И это был...
00:31:01вес.
00:31:02Ну,
00:31:02я имею в виду,
00:31:03если вы спрашиваете,
00:31:04почему они не написали исполнителя с лучшим кодом.
00:31:07Да, это довольно круто..
00:31:11Ладно, справедливо.
00:31:12Кажется,
00:31:13если ты обновляешь на что-то,
00:31:14что должно быть удалено немедленно,
00:31:16разве это не...
00:31:17типа это похоже на проблему прямо здесь.
00:31:19Ты сделал что-то не так задолго до этого.
00:31:21Да,
00:31:22даже если это на самом деле не исправляет теоретическую структуру этой штуки,
00:31:26простая проверка у этого парня,
00:31:28когда он закончил откат блокировки,
00:31:30он,
00:31:30возможно,
00:31:31должен проверить,
00:31:31не собирается ли он установить это на что-то,
00:31:34что он бы удалил,
00:31:35если бы запускал свой код удаления — это,
00:31:37вероятно,
00:31:38хорошая мера безопасности.
00:31:39Но да, так что на 100% с ним согласен.
00:31:41Окей,
00:31:42но исполнитель очень,
00:31:43очень усердно работал,
00:31:44чтобы получить эту запись.
00:31:45Ждал долгое время.
00:31:46О, он получит свои карточки Покемонов..
00:31:49Кто-нибудь когда-либо ждал.
00:31:51Так что просто дайте ему записать запись.
00:31:53Окей.
00:31:54Итак, я хочу услышать об этом..
00:31:56К сожалению,
00:31:57если посмотреть на презентацию и на RCA,
00:32:01там этого просто нет.
00:32:03В презентации хотя бы есть один крошечный 12-секундный фрагмент,
00:32:10где указано,
00:32:11где примерно находится баг.
00:32:14Позвольте объяснить, в чём там дело.
00:32:18Видимо,
00:32:19происходит вот что: когда вы делаете DynamoDB us-east-one и направляете его на свой план,
00:32:28вы одновременно выполняете ещё одну операцию.
00:32:33Эта операция — установка отката..
00:32:40Кажется, это DD.
00:32:42Или DDB.rollback.AWS.
00:32:44Не помню точно, как оно называется..
00:32:49Там есть запись отката.
00:32:51Она устанавливается на то, каким был старый план.
00:32:55Допустим,
00:32:56мы находились здесь и указывали на 145,
00:32:59а теперь собираемся указать на 110.
00:33:02Старый enactor,
00:33:04типа,
00:33:04«я переключаюсь на 110»,
00:33:06он пытается взять текущее имя и переместить это имя — которое было планом 145 — так,
00:33:13чтобы адрес отката указывал на старый план..
00:33:18Верно.
00:33:18И это просто для отладки.
00:33:20Или, знаете, в основном для удобства операторов..
00:33:24Если им нужно откатиться к предыдущему плану или что-то в этом роде,
00:33:29или просто хочется узнать,
00:33:30какой был предыдущий план,
00:33:32можно посмотреть здесь,
00:33:33так?
00:33:34Это первая часть того, что они говорили о сбое.
00:33:37Хочу отметить один момент — мне это тоже показалось странным.
00:33:40Я подумал: окей,
00:33:41вы говорите мне,
00:33:42что эти штуки обновляются каждую минуту или около того.
00:33:46Какой смысл в таком откате?
00:33:48К тому времени,
00:33:48как вы даже войдёте в систему,
00:33:50он уже обновится с того,
00:33:52к которому вы хотели откатиться,
00:33:54на что-то новое.
00:33:55А это как раз тот план,
00:33:56который вам не нужен,
00:33:58потому что всё упало,
00:33:59понимаете?
00:33:59Вам это не нужно, вам нужен просто список этих имён.
00:34:03Чтобы можно было сказать: каким он был в 12:30?
00:34:06Вот тот.
00:34:06Для меня это вообще не имело смысла.
00:34:08Я буквально понятия не имею, зачем это вообще нужно.
00:34:11Похоже,
00:34:12что это не делает того,
00:34:13что действительно нужно,
00:34:15а именно — возможности отметить момент времени и сказать: нам нужно вернуться к часу дня,
00:34:20потому что после этого всё полетело к чертям..
00:34:26В общем, для меня это было непонятно.
00:34:29Но опять же,
00:34:29это не совсем про баг,
00:34:31так что я не стал спрашивать почему.
00:34:33Просто говорю: окей, вот что оно должно делать.
00:34:36И можно откатиться только на одну версию назад,
00:34:38как я понимаю.
00:34:39Да, хотя другие деревья существуют.
00:34:41Так что легко можно было бы, просто зная имя.
00:34:44Всё это лишь присваивает человекочитаемое имя чему-то,
00:34:47что вас почти наверняка не волнует.
00:34:49Но у них на самом деле не так уж много возможностей для хранения..
00:34:54Кейси,
00:34:54я не думаю,
00:34:55что у них там реально можно хранить много данных,
00:34:58понимаешь?
00:34:59Адам, это же куча строк.
00:35:00На их месте я бы просто сделал это временной меткой.
00:35:04Если это то, что нужно.
00:35:05Я бы просто указывал: когда планировщик или когда этот человек направил это на эту штуку?
00:35:11Когда вы получили блокировку,
00:35:13вы меняете это имя на временную метку и обновляете это атомарно.
00:35:17Тогда вы просто знаете: если хочу откатиться к часу дня,
00:35:21просто ищу ту,
00:35:22у которой временная метка — ну знаете,
00:35:24самая ранняя метка,
00:35:26не позже этого времени..
00:35:28И это то, что работало в тот момент.
00:35:30Вот что бы я сделал.
00:35:31Но я не знаю.
00:35:32Понятия не имею, почему они сделали так, как сделали.
00:35:35Возможно, это имеет полный смысл.
00:35:36Опять же, я не знаю их систему.
00:35:38Все эти вещи могут иметь абсолютный смысл..
00:35:41Так что я не критикую, я просто говорю, что не понимаю.
00:35:43Не факт, что это плохие идеи..
00:35:45Возможно, это хорошие идеи, если понимать остальную систему.
00:35:49В общем,
00:35:49всё,
00:35:50что они говорят — и это всё,
00:35:51что мы получаем — это что данная операция,
00:35:54то есть установка отката на старый план,
00:35:56на который раньше указывали — и в данном случае он фактически мог быть новее в некоторых случаях,
00:36:02так?
00:36:03То есть это не обязательно предыдущий план по времени,
00:36:06он может быть старше,
00:36:08а может быть новее.
00:36:09Вот выполнение этой операции..
00:36:11Если этот план больше не существует,
00:36:13то есть был удалён вот так,
00:36:15то enactor останавливается навсегда.
00:36:18Так что каждый раз,
00:36:19как только вы попадаете в состояние,
00:36:22где dynamodb.usc — это тот самый,
00:36:24верно.
00:36:25Мы выполняем всю последовательность шагов, которую описали?
00:36:29Этот план удаляется..
00:36:31Теперь это указывает на недействительное,
00:36:33неразрешимое имя,
00:36:34мы не можем разрешить plan-dash-110,
00:36:36который на самом деле какой-то hex-код.
00:36:38Но что бы это ни было, мы больше не можем это разрешить..
00:36:41Как только это состояние становится истинным,
00:36:44то в следующий раз,
00:36:46когда enactor придёт и попытается направить его на новый план,
00:36:50каким бы ни был этот новый план,
00:36:53он не сможет — когда он дойдёт до этого момента и попытается установить откат,
00:36:59это навсегда его обрушит.
00:37:01Поэтому все три enactor'а теперь остановятся,
00:37:04потому что в конечном итоге все три попытаются применить новый план.
00:37:09Они попытаются сначала установить откат на то,
00:37:13чем был старый план,
00:37:14обнаружат,
00:37:15что там нет никакого плана.
00:37:17И это, очевидно, просто жёсткий сбой.
00:37:20О, это безумие.
00:37:21Я думал, три enactor'а должны были обеспечить избыточность.
00:37:26Опять же,
00:37:26вот почему я раздражаюсь,
00:37:28когда люди в интернете отвечают типа: это было состояние гонки.
00:37:33Это не было состояние гонки.
00:37:35Состояние гонки не обязательно для этого.
00:37:38Состояние гонки — это просто причина,
00:37:41по которой это имя стало неразрешимым.
00:37:44Но если бы у вас не было кода,
00:37:46который сделал это плохо,
00:37:48всё бы просто работало..
00:37:52Вы бы никогда не узнали.
00:37:53У вас был бы минутный сбой DynamoDB или что-то в этом роде,
00:37:57но я предполагаю,
00:37:59что минутные сбои DynamoDB случаются время от времени.
00:38:02Это не мировая новость..
00:38:04Мировая новость — это когда система падает навсегда,
00:38:07что и произошло здесь.
00:38:08И пока реальный человек не придёт,
00:38:10не разберётся,
00:38:11не сбросит это,
00:38:12не запустит эти enactor'ы снова,
00:38:14она просто мертва.
00:38:15Просто вышла из строя навсегда.
00:38:16Так что потенциально часы.
00:38:18И в этом случае это было достаточно долго,
00:38:20чтобы затем начались каскадные сбои.
00:38:22У вас никогда бы этого не было.
00:38:24Это просто кратковременный сбой.
00:38:25Если некоторые люди кратковременно получили неразрешимое имя или отсутствие записей,
00:38:30они просто попытались бы снова.
00:38:32Обычно с DNS это как с телефоном — вы проехали через туннель.
00:38:35Вот и всё, что было бы..
00:38:37Поэтому я хочу знать, как выглядел код здесь?
00:38:40Как вы написали что-то такое,
00:38:42что если это не было действительным именем,
00:38:44а оно не было бы даже при запуске,
00:38:46то есть если вы запускали эту систему,
00:38:49а оператор не настроил её заранее,
00:38:51она бы ни на что не указывала.
00:38:53Это случай по умолчанию,
00:38:54с которого,
00:38:55как вы думаете,
00:38:56начнётся работа.
00:38:57Так что если вы собираетесь делать это,
00:38:59вы бы подумали,
00:39:00что просто обработаете этот случай,
00:39:02потому что адрес отката может просто ни на что не указывать.
00:39:06Просто возьмите то, что есть.
00:39:08Если это ничего, установите адрес отката на ничего..
00:39:12Готово.
00:39:12Так что есть что-то действительно странное в том,
00:39:15как они написали этот код.
00:39:17И именно это должно было быть в RCA.
00:39:19Для меня это весь баг.
00:39:21Это просто декорация для того,
00:39:23как мы в итоге получили эту штуку,
00:39:25указывающую в никуда.
00:39:26Тот же баг произошёл бы,
00:39:28если бы кто-то случайно удалил эту запись.
00:39:30Типа какой-то оператор просто: ой,
00:39:32чёрт,
00:39:33я установил это в ничего..
00:39:35Этот же баг произошёл бы согласно презентации.
00:39:38Так что первопричина — не состояние гонки.
00:39:40Состояние гонки — это отступление.
00:39:43Понятно?
00:39:43Быстрый вопрос.
00:39:44Так что я реально обдумываю это.
00:39:46И это означает,
00:39:47что то,
00:39:47что устанавливает откат,
00:39:49вероятно,
00:39:49предполагает какую-то структуру с кучей памяти или чего-то,
00:39:53что было передано,
00:39:54делает какой-то доступ.
00:39:56Взрывается.
00:39:56Или ты думаешь,
00:39:57это тот же стиль бага,
00:39:58который был в той одной строке,
00:40:00обрушившей Cloudflare,
00:40:02а именно они просто предполагают,
00:40:04что это там,
00:40:04и разворачивают это..
00:40:07Это в Rust. Это memory-safe Rust. Разворачивает, взрывается.
00:40:13Я правда не знаю.
00:40:14Моя догадка,
00:40:14ну вот в голове я подумал: что такого я вижу,
00:40:17как люди делают постоянно,
00:40:19и я всегда думаю — зачем вы вообще так делаете?
00:40:22Но это просто потому, что их так научили программировать.
00:40:26И я думал: если бы ты писал на одном из этих языков,
00:40:29которые любят бросать исключения при ошибках,
00:40:32это был бы отличный пример.
00:40:34Допустим,
00:40:34у тебя ситуация: ты пошёл получить DNS-запись,
00:40:37на которую указывает эта штука..
00:40:40И обычно в нормальной среде программирования никто там не бросает исключение.
00:40:45Если ничего не получили — просто возвращают ничего.
00:40:47И когда человек идёт установить ddb.robot.js,
00:40:50он просто ставит его в ничего,
00:40:52что и есть правильное поведение.
00:40:53Буквально значение «ничего» корректно течёт через весь этот поток.
00:40:57Так что если бы ты писал это с расчётом на то,
00:40:59что это базовый сервис,
00:41:01и пытался написать что-то отказоустойчивое,
00:41:03ты бы никогда не стал что-то вроде бросания исключений делать.
00:41:07Поэтому в моей голове я думаю: бьюсь об заклад,
00:41:09что происходит вот что — когда ты запрашиваешь эту запись,
00:41:12они просто используют какой-то вызов библиотеки или что-то такое,
00:41:16что бросает исключение,
00:41:17когда записи не существует.
00:41:19И оно просто выбросило исключение, и актор завершился.
00:41:22Вот моя догадка.
00:41:23И я могу очень сильно ошибаться,
00:41:24потому что это просто дикая догадка.
00:41:26Но вот поэтому я хочу увидеть RCA.
00:41:28Что это было.
00:41:29Это может быть именно то, о чём говорил Трэш.
00:41:32То есть, это может быть то, о чём говорил Прайм?
00:41:34Может быть то, что я только что сказал.
00:41:36Может быть что угодно.
00:41:37И я хочу знать,
00:41:38потому что вот в этом и есть настоящее обучение.
00:41:41Избежать этого состояния гонки — совершенно неважно.
00:41:44Это состояние гонки могло там жить.
00:41:46И хотя важно было в конечном итоге его исправить,
00:41:48чтобы избежать этих раз-в-год странных сбоев на пять секунд или около того,
00:41:52это на самом деле не то,
00:41:54чему мы больше всего хотим научиться.
00:41:56Больше всего мы хотим научиться не писать вот эту штуку.
00:41:59А мы даже не знаем, что это вообще была за штука.
00:42:02Так как же нам её не писать.
00:42:03Вот почему я считаю, что это был плохой RCA.
00:42:05Понятно?
00:42:06Да.
00:42:06Да?
00:42:07Хорошо.
00:42:07На чём написана большая часть AWS, Адам?.
00:42:11Это была Java.
00:42:12Я как раз хотел сказать — кто-то из чата сказал Scala.
00:42:16Сказали,
00:42:17что работали в AWS семь лет,
00:42:19и сказали,
00:42:20что большая часть написана на Scala.
00:42:23Ну, это технически Java с дополнительными шагами.
00:42:27И это будет бесконечно их бесить.
00:42:29Так что для меня на этом всё..
00:42:34Это была та штука,
00:42:35где я подумал: мне кажется,
00:42:36я не увидел объяснения.
00:42:37И мне на самом деле кажется,
00:42:38что это важно услышать,
00:42:39потому что в основе всего этого лежала плохая практика программирования.
00:42:43И я хочу знать,
00:42:43какая именно,
00:42:44особенно потому что это помогает таким людям,
00:42:46как я — знаете,
00:42:47я сейчас не особо занимаюсь обучением архитектуре,
00:42:49но в какой-то момент я,
00:42:50вероятно,
00:42:51хотел бы этим заняться,
00:42:52потому что я думаю,
00:42:53что там куча плохой архитектуры.
00:42:54И поэтому я стараюсь обращать внимание на такие вещи.
00:42:57Типа, какие архитектурные ошибки люди совершают?
00:42:59И бьюсь об заклад, это была одна из них.
00:43:01Верно?
00:43:02И вот поэтому я хотел бы знать.
00:43:03Хотел бы знать..
00:43:04Да.
00:43:05Я думаю,
00:43:05что я бы ожидал хотя бы один простой воспроизводимый пример того,
00:43:09почему всё взорвалось — небольшой фрагмент кода.
00:43:12И это то,
00:43:13что ты поднял раньше — как мы подходим к таким вещам.
00:43:16Если я проверяю чей-то код и вижу что-то странное,
00:43:19я всегда стараюсь создать свою маленькую песочницу и проверить свою теорию.
00:43:24А потом показать им код с объяснением: вот почему это,
00:43:27вероятно,
00:43:28неправильно.
00:43:29Вот небольшой простой воспроизводимый шаг.
00:43:31Так что я бы ожидал чего-то подобного.
00:43:34И это также помогает мне по-настоящему понять.
00:43:37Потому что многие люди,
00:43:38как ты сказал,
00:43:39видят что-то странное,
00:43:40но не знают,
00:43:41почему оно странное,
00:43:42но я не могу на этом остановиться.
00:43:44Мне нужно это реально воспроизвести и понять.
00:43:47Вот чего я бы ожидал.
00:43:48И знаешь,
00:43:49как я уже говорил,
00:43:50отчёты по CrowdStrike и сбоям Google были лучше — они просто сказали,
00:43:54что это был нулевой указатель,
00:43:56разыменование здесь,
00:43:58или выход за границы массива,
00:43:59потому что мы думали,
00:44:01что будет только 20,
00:44:02а в конфиг-файл поместили 21.
00:44:04И типа,
00:44:04окей,
00:44:05я точно знаю,
00:44:05какой код вызывает такую проблему.
00:44:08Верно?
00:44:08И более того,
00:44:09в продолжение более раннего комментария,
00:44:11буквально,
00:44:12насколько я знаю,
00:44:13все,
00:44:14кто программируют на Rust,
00:44:15делают это только для того,
00:44:17чтобы иногда,
00:44:18увидев что-то подобное,
00:44:19сказать: ну,
00:44:20если бы это написали на Rust,
00:44:22такого бы не случилось.
00:44:23Им даже не дали достаточно информации,
00:44:25чтобы сделать такой комментарий..
00:44:29Они,
00:44:30вероятно,
00:44:30всё равно это сказали,
00:44:32если честно,
00:44:33но им не дали информации.
00:44:34Так что нужно соблюдать одно правило в RCA: нужно дать растацианцам достаточно информации,
00:44:40чтобы они,
00:44:41если захотят,
00:44:41могли корректно заявить,
00:44:43что на Rust это было бы предотвращено..
00:44:46А в этом случае у нас этого нет.
00:44:48Мы не знаем, было бы это предотвращено на Rust..
00:44:51Мы понятия не имеем.
00:44:52Вероятно, нет, но мы не знаем.
00:44:54Ну,
00:44:55Кейси,
00:44:55у нас довольно хорошие шансы,
00:44:57потому что это вообще,
00:44:59вероятно,
00:44:59никогда бы не отгрузили.
00:45:01Так что это бы предотвратило..
00:45:03Верно.
00:45:03У нас было бы ноль актёров,
00:45:05потому что мы бы проектировали набор актёров.
00:45:09Да..
00:45:09CloudFlare справляется с этим действительно хорошо.
00:45:12Они вникают и показывают много строк кода,
00:45:15говоря: вот что именно происходит.
00:45:17Вот,
00:45:17знаешь,
00:45:18хотя проблема здесь,
00:45:19это строка,
00:45:20которая взорвалась из-за всех этих предыдущих условий.
00:45:23Это я издевался над Rust с unwrap,
00:45:25который на самом деле не был истинной проблемой.
00:45:28Но знаешь, просто все эти вещи происходят.
00:45:30Так что они делают действительно хорошую работу.
00:45:33Я удивлён, насколько плохо AWS справился с этим.
00:45:36Ну,
00:45:36и ещё одна вещь — это одна из тех ситуаций,
00:45:39когда теперь это заставляет меня излишне подозрительно к вам относиться,
00:45:43понимаете??
00:45:44Когда я читаю это, я думаю: вы что-то скрываете?
00:45:46Вы на самом деле не разобрались, в чём был баг?
00:45:48Вы столько рассказывали об этом состоянии гонки,
00:45:50но даже из вашей собственной презентации я понимаю,
00:45:53что состояние гонки на самом деле не было важным.
00:45:55Это было просто то,
00:45:56что привело к тому,
00:45:57что запись была установлена в ничто,
00:45:58но какая разница,
00:45:59верно?
00:46:00То есть это что-то такое,
00:46:01что хорошо бы добавить в RCA в качестве объяснения,
00:46:03почему этот баг проявился именно сейчас,
00:46:05а не в какое-то другое время,
00:46:06но это не сам баг.
00:46:07Поэтому мне странно.
00:46:08Когда я вижу RCA,
00:46:09в котором не говорится о самом баге,
00:46:10я начинаю подозревать.
00:46:11Верно?
00:46:12И совершенно напрасно,
00:46:13потому что если вы действительно его нашли,
00:46:15то просто скажите мне об этом,
00:46:16и тогда я буду знать,
00:46:17что вы его нашли.
00:46:18Так что,
00:46:18я думаю,
00:46:19это также вселяет уверенность в людей,
00:46:20которые смотрят со стороны и хотят знать,
00:46:22можно ли доверять этому DynamoDB.
00:46:24Если выглядит так,
00:46:24будто вы действительно нашли баг,
00:46:26у меня появляется чуть больше доверия к вам.
00:46:28Если же выглядит так,
00:46:29будто вы понятия не имеете,
00:46:30в чём был баг,
00:46:31или не понимаете,
00:46:31в чём был баг,
00:46:32то я больше беспокоюсь.
00:46:33И поэтому я считаю,
00:46:34что это ещё одна причина делать это в вашем RCA..
00:46:37Это вселяет уверенность в ваших клиентов.
00:46:40Может, поэтому они и уволили Адама из AWS Hero..
00:46:43Может, всё взаимосвязано.
00:46:44Вполне возможно.
00:46:45Они не хотели, чтобы он раскрывал эти грязные секреты..
00:46:48Да.
00:46:48Он слишком много знал.
00:46:50Он слишком много знал.
00:46:51Можешь дать краткий,
00:46:52минуты на три,
00:46:53пересказ истории с гитарным магазином?
00:46:55Что там раскрывалось?
00:46:57Потому что я пытаюсь вспомнить,
00:46:58о чём там речь,
00:46:59ведь там был какой-то единственный парень — точка отказа,
00:47:03который отсутствовал и во время этого сбоя.
00:47:05Так что я не знаю, как согласовать эти две вещи.
00:47:08И конечно, мы понятия не имеем.
00:47:10Мы понятия не имеем,
00:47:11говорят ли нам правду в любом из случаев,
00:47:14верно?
00:47:14Потому что это был настолько плохой RCA,
00:47:17что я не знаю,
00:47:18правильный он или нет,
00:47:19но да,
00:47:19пароль был wishbone 12,
00:47:21кажется..
00:47:22Вот именно.
00:47:23Всегда пытаются меня убить.
00:47:24По крайней мере, так я это помню..
00:47:26Так вот,
00:47:27та история была о том,
00:47:28что была штука,
00:47:29которая была разработана для копирования конфигураций.
00:47:33И эта штука вышла из-под контроля,
00:47:35и её нельзя было остановить.
00:47:37Она просто копировала конфигурации совершенно неправильно,
00:47:41и её нужно было,
00:47:42типа,
00:47:42починить или восстановить,
00:47:44или что-то в этом роде.
00:47:46И у нас нет дополнительной информации,
00:47:48потому что это был подслушанный разговор.
00:47:51Верно?
00:47:51И согласуется ли это с тем?
00:47:53Ну,
00:47:54немного,
00:47:54потому что эти исполнители действительно звучат как то,
00:47:58что могло бы выполнять копирование конфигураций,
00:48:01но с другой стороны,
00:48:02это не совсем конфигурация для машин.
00:48:05DNS-запись — это DNS-запись.
00:48:07Это не совсем конфигурация.
00:48:09Поэтому я бы сказал,
00:48:10что две эти истории не очень-то совпадают..
00:48:14А это ещё одна причина,
00:48:15почему я надеялся,
00:48:16что этот RCA будет чуть более правдоподобным,
00:48:19потому что я хотел точно знать,
00:48:21что та история была ложной.
00:48:23И я всё ещё не знаю наверняка,
00:48:24учитывая,
00:48:25насколько плох этот RCA.
00:48:26А что,
00:48:27если инструмент,
00:48:28который тот парень написал для копирования конфигов,
00:48:31— это буквально и есть исполнитель?
00:48:33Типа,
00:48:33они просто запродакшенили его,
00:48:35и он,
00:48:36и они не меняли его семь лет.
00:48:37Вот так я связываю точки.
00:48:39Он там типа: ребят,
00:48:40я написал это как способ тестировать что-то в своём локальном окружении.
00:48:44А вы просто решили сделать три исполнителя и поставить их рядом друг с другом в проде.
00:48:49Я не понимаю, как это произошло.
00:48:51Не понимаю..
00:48:53У меня есть альтернативные вопросы.
00:48:54Да.
00:48:55Или, может быть, дело в откате?
00:48:57Потому что именно он выполнял копирование типа: «Эй,
00:48:59вот предыдущая версия».
00:49:00Верно.
00:49:01И вот он копирует предыдущую версию.
00:49:03Потом возникает эта проблема с null.
00:49:05И скрипт просто никогда не сталкивался с этим или вообще выходит из-под контроля и начинает писать снова и снова,
00:49:11и снова,
00:49:11и снова,
00:49:12так что ты ничего не можешь сделать.
00:49:13Понятия не имею.
00:49:14Всё,
00:49:15что я знаю — судя по их объяснениям,
00:49:17основываясь только на том,
00:49:18что они предоставили,
00:49:19я всё равно не думаю,
00:49:20что состояние гонки вообще имеет значение,
00:49:22потому что,
00:49:23опять же,
00:49:23буквально случайное обновление конечной точки Route 53 могло бы немедленно вывести из строя всех трёх акторов.
00:49:29Потому что,
00:49:30по их словам,
00:49:30всё,
00:49:31что требуется для их остановки — это если конечная точка указывает на неразрешимое имя,
00:49:35вот и всё.
00:49:36И если это действительно так,
00:49:37то буквально опечатка оператора могла бы всё это обрушить,
00:49:40никакого состояния гонки не требуется.
00:49:42Верно.
00:49:43И поэтому,
00:49:43опять же,
00:49:44отчёт о первопричине просто плохо справляется с задачей убедить меня,
00:49:47что вы разобрались,
00:49:48в чём была настоящая ошибка,
00:49:50потому что я могу придумать столько способов,
00:49:52как можно было вызвать точно то же самое,
00:49:54которые не включают это состояние гонки,
00:49:56о котором вы рассказывали мне на протяжении всего отчёта,
00:49:59утверждая,
00:50:00что это и есть баг,
00:50:01но я так не думаю.
00:50:02Так что спасибо тебе, Кейси, за эту потрясающую презентацию.
00:50:05Я искренне испытываю зависть Гринвуда,
00:50:07ярость ревности к тому инструменту для письма,
00:50:09который у тебя есть.
00:50:10Мне нужно разобраться, как настроить то, что у тебя.
00:50:13Эта штука фантастическая..
00:50:15Спасибо всем за просмотр.
00:50:16Для тех,
00:50:16кто смотрел в прямом эфире,
00:50:18надеюсь,
00:50:18вам понравились предварительные разговоры и,
00:50:20вероятно,
00:50:21немного постразговоров.
00:50:22Если хотите услышать расширенную версию и все эти весёлые взаимодействия,
00:50:25которые не являются частью основной истории,
00:50:27заходите на Spotify за полным подкастом,
00:50:29где мы просто болтаем о том,
00:50:31не знаю,
00:50:31какой мусор едим,
00:50:32и о закусках,
00:50:33и всё такое — название «Ещё больше болтовни»,
00:50:35ещё больше болтовни,
00:50:36и ещё Кейси,
00:50:36Ти Джей и Трэш..
00:50:42Ошибки на моём экране, кофе в терминале и жизнь как мечта.