Рассказ на английском с переводом · C1 · 24 строки
The deploy merely made it obvious Деплой лишь сделал его очевидным
Postmortem: why our booking site went down on Friday evening. Written by Jonas, who deployed the change.
Разбор сбоя: почему наш сайт бронирования упал в пятницу вечером. Пишет Йонас, который выкатил изменение.
This postmortem is blameless. Its purpose is not to decide who should be blamed, but to understand how a correct one-line patch managed to take the whole site down for almost three hours.
Этот разбор — без поиска виноватых. Его цель не в том, чтобы решить, кого винить, а в том, чтобы понять, как правильный патч в одну строку умудрился положить весь сайт почти на три часа.
Summary. At 18:20 on Friday, a hotfix was deployed to prod in order to correct prices that were being shown in the wrong currency.
Кратко. В пятницу в 18:20 на прод выкатили хотфикс, чтобы исправить цены, которые показывались не в той валюте.
Within ten minutes, latency had soared; within twenty, pages had stopped loading for most customers. Failed payments surged.
Через десять минут задержка взлетела, а через двадцать страницы перестали загружаться у большинства клиентов. Число неудачных платежей резко подскочило.
The change was rolled back at 18:55. However, the site remained down, which suggested that the patch itself had not been the culprit.
В 18:55 изменение откатили. Однако сайт по-прежнему лежал, а значит, виноват был не сам патч.
Root cause. Our deploy script clears the entire cache whenever new code is released. It does so regardless of how small the change is.
Первопричина. Наш скрипт деплоя очищает весь кэш при каждом выпуске нового кода. Он делает это, каким бы маленьким ни было изменение.
Under normal conditions nobody notices this, since the cache fills again within a few minutes.
В обычных условиях этого никто не замечает, потому что кэш снова заполняется за несколько минут.
On a Friday evening, however, traffic spikes to about three times the level of a Tuesday morning. Every request that the cache could not answer was passed straight to the old price server, and the failure cascaded from there.
Но в пятницу вечером трафик подскакивает примерно втрое по сравнению с утром вторника. Каждый запрос, на который кэш не мог ответить, уходил прямо на старый сервер цен, и дальше сбой пошёл лавиной.
That server is legacy code, written long before most of the current team joined. It had been working close to its limits for months without anyone noticing.
Этот сервер — легаси-код, написанный задолго до прихода большей части нынешней команды. Он уже несколько месяцев работал на пределе, а никто этого не замечал.
In other words, the bottleneck had existed long before the hotfix; the deploy merely made it obvious.
Иными словами, узкое место существовало задолго до хотфикса; деплой лишь сделал его очевидным.
Rolling back could not help, because rolling back the code did nothing to restore the cache.
Откат помочь не мог: откат кода никак не восстанавливал кэш.
Why it took so long. For the first two hours, we had tunnel vision, and the investigation focused entirely on the patch. It was, after all, the only thing that had obviously changed.
Почему так долго. Первые два часа мы смотрели только в одну точку, и расследование было сосредоточено только на патче. В конце концов, только он явно изменился.
If anyone made a mistake, it was this assumption, and it is an entirely human one.
Если кто-то и ошибся, то именно в этом допущении, а оно вполне человеческое.
The cause was eventually tracked down with the help of a forum for programmers. One member asked whether the deploy had changed anything other than the code.
В итоге причину отыскали с помощью форума программистов. Один из участников спросил, не изменил ли деплой что-нибудь, кроме кода.
What went well. A workaround was in place by 21:10: we filled the cache by hand while throttling traffic and letting customers back in gradually. No orders or payments were lost.
Что прошло хорошо. Обходное решение заработало к 21:10: мы заполняли кэш вручную, ограничивали поток запросов и постепенно пускали клиентов обратно. Ни один заказ и ни один платёж не потерялся.
We should be honest, though: this workaround is duct tape, and it must not quietly become permanent.
Но будем честны: это решение на соплях, и оно не должно тихо стать постоянным.
What went badly. Our tests always run against a full cache, whereas real customers after a deploy meet an empty one. This edge case had therefore never been tested, and no alert had been set up for it.
Что прошло плохо. Наши тесты всегда идут на полном кэше, тогда как настоящие клиенты после деплоя попадают на пустой. Поэтому этот крайний случай ни разу не проверяли, и оповещения на него никто не настроил.
In addition, the part of the library used by the patch is deprecated. It will disappear in the next upgrade, which nobody on the team had noticed.
Кроме того, часть библиотеки, которую использует патч, устарела. Она исчезнет при следующем обновлении, а этого в команде никто не заметил.
Technical debt. The price server is the oldest, most brittle and least understood part of the system. Two previous attempts to refactor it were abandoned before they were finished.
Технический долг. Сервер цен — самая старая, самая хрупкая и наименее понятная часть системы. Две прежние попытки его отрефакторить бросили, не доведя до конца.
It is tempting to rewrite it from scratch; we recommend against this. A full rewrite would invite months of scope creep. The result would almost certainly be over-engineered for what is basically a caching problem.
Велик соблазн переписать его с нуля; мы не советуем. Полное переписывание обернётся месяцами разрастания задач. А результат почти наверняка окажется переусложнённым для того, что по сути является проблемой кэширования.
Actions. First, the deploy script will no longer clear the entire cache; this change has already been submitted as a pull request.
Меры. Во-первых, скрипт деплоя больше не будет очищать весь кэш; это изменение уже отправлено пул-реквестом.
Second, the price server will be refactored in small steps, starting by untangling its worst spaghetti code, and each step will be reviewed on its own.
Во-вторых, сервер цен будут рефакторить небольшими шагами, начиная с того, что распутают самый запутанный код, и каждый шаг проверят отдельно.
Third, any deploy after 16:00 on a Friday will require a second person to review it. This is not because Friday deploys are forbidden, but because by then most of the team has already gone home.
В-третьих, любой деплой в пятницу после 16:00 потребует второго проверяющего. Не потому, что деплоить в пятницу запрещено, а потому, что к этому часу большая часть команды уже ушла домой.
Finally, I would like to thank the forum for its patience, its jokes and, eventually, the right question. And thank you, Emma, for keeping dinner warm.
Наконец, хочу поблагодарить форум за терпение, шутки и в итоге — за правильный вопрос. И спасибо Эмме, что ужин не остыл.
Грамматика к тексту
- it had been working close to its limits for months without anyone noticing —
had been + -ing: действие длилось до момента в прошлом (до пятницы) и к нему ещё шло.without anyone noticing—without+-ingсо своим подлежащим: «так, что никто не замечал». - prices that were being shown in the wrong currency — длительный пассив
were being shown: «показывались (как раз тогда)». Кто показывал — не важно, поэтому пассив. - regardless of how small the change is —
regardless of+ вопросительное слово: «каким бы маленьким ни было». Порядок слов прямой:how small the change is, а неhow small is the change. - Our tests always run against a full cache, whereas real customers after a deploy meet an empty one —
whereasпротивопоставляет две половины («тогда как»);oneзаменяет повторноеcache. - A full rewrite would invite months of scope creep —
would— что было бы, если бы решились;inviteздесь не «приглашать», а «навлечь, напроситься на». - not because Friday deploys are forbidden, but because by then most of the team has already gone home — пара
not because…, but because…— «не потому что…, а потому что».by then— «к тому времени»; поэтому Present Perfecthas gone: к этому часу люди уже ушли. - we had tunnel vision —
tunnel vision— «туннельное зрение»: видишь только одну версию. the failure cascaded from there —cascade— сбой пошёл цепочкой, как каскад водопада;from there— «дальше, оттуда».
Слова и грамматика юнита — Попросить помощи у программистов.
Учите слова из текстов в карточках
В приложении каждое слово текста нажимается — видны перевод, формы и примеры, а новые слова закрепляются в карточках: 15 минут в день.
Начать бесплатноБесплатно открыто всё. Карта для регистрации не нужна.