<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Dmitriy Melnik</title><generator>teletype.in</generator><description><![CDATA[Founder of Drim Dev · Software Architect · Educator · Community Builder

mailto:dmitriy.melnik@drim.dev
https://t.me/mitro52]]></description><image><url>https://img4.teletype.in/files/b3/04/b30455cc-798f-4199-914a-77fa60fd90f9.png</url><title>Dmitriy Melnik</title><link>https://teletype.in/@drimdev</link></image><link>https://teletype.in/@drimdev?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=drimdev</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/drimdev?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/drimdev?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Tue, 07 Apr 2026 03:18:20 GMT</pubDate><lastBuildDate>Tue, 07 Apr 2026 03:18:20 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@drimdev/ticketon-postmortem-2025-analysis</guid><link>https://teletype.in/@drimdev/ticketon-postmortem-2025-analysis?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=drimdev</link><comments>https://teletype.in/@drimdev/ticketon-postmortem-2025-analysis?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=drimdev#comments</comments><dc:creator>drimdev</dc:creator><title>Анализ постмортема сбоя Ticketon 11 апреля 2025 года</title><pubDate>Wed, 07 May 2025 09:28:23 GMT</pubDate><description><![CDATA[Как и обещали, Ticketon опубликовали постмортем по итогам сбоя 11 апреля. Вот мой анализ этого документа.]]></description><content:encoded><![CDATA[
  <p id="CU0S">Как и обещали, Ticketon <a href="https://freedomlabs.kz/analiz-intsidienta-s-prodazhiei-bilietov-na-jlo-na-tikietonie/" target="_blank">опубликовали постмортем</a> по итогам сбоя 11 апреля. Вот мой анализ этого документа.</p>
  <p id="SmBA">Стала понятна главная причина дублирования билетов. При массовом наплыве пользователей сервера Ticketon перестали справляться с нагрузкой и сайт периодически становился недоступным. Чтобы решить эту проблему, команда экстренно решила использовать Cloudflare Waiting Room. В постмортеме напрямую не называется Cloudflare, но этот сервис упоминается в <a href="https://www.threads.com/@alexnomad/post/DIWntcuokzV" target="_blank">прошлом сообщении</a> Алексея Ли.</p>
  <p id="6TlX">Когда используется Cloudflare Waiting Room, пользователи перенаправляются на специальную страницу ожидания вместо того, чтобы случайным образом получать ошибки загрузки сайта. И система следит за тем, чтобы те пользователи, кто пришёл раньше, получили доступ к сайту раньше. Виртуальная очередь как снижает нагрузку на сайт, так и явно информирует пользователей, когда они смогут воспользоваться сервисом. Рекомендую прочитать<a href="https://blog.cloudflare.com/cloudflare-waiting-room/" target="_blank"> статью о том, как использовать Waiting Room</a>. А для тех, кто хочет узнать больше, есть <a href="https://blog.cloudflare.com/how-waiting-room-queues/" target="_blank">хорошая статья о технических деталях</a> работы сервиса.</p>
  <p id="VrHN">Проблемы начались сразу же после включения электронной очереди. Чтобы понять причину, необходимо знать, как работает оплата на веб-сайтах. Для этого рекомендую посмотреть <a href="https://youtu.be/bKJ-bzcTm7U?si=eBcOpqxwt9pMRd_-" target="_blank">видео</a>, где я рассказываю про работу платёжных провайдеров на примере Stripe. Другие платёжные провайдеры работают аналогично.</p>
  <p id="jYyH">Когда пользователь заходит на сайт Ticketon, выбирает билет и нажимает &quot;Оплатить&quot;, то оплату принимает не Ticketon, а отдельный сервис - платёжный провайдер. После того, как пользователь оплатил билет и платёжный провайдер снял деньги с карты, необходимо уведомить об этом Ticketon, чтобы он у себя отметил, что этот билет продан, и затем выслал ваучер покупателю. Для этого у Ticketon есть HTTP API эндпоинт, на который платёжный провайдер шлёт HTTP запросы с подтверждениями покупок билетов.</p>
  <p id="kc9K">Проблема возникла именно с этим эндпоинтом.</p>
  <p id="BbPJ">Для повышения безопасности и надёжности системы Ticketon позволял слать запросы на эндпоинт только с ограниченного списка IP адресов - адресов платёжного провайдера. Это грамотное решение. Нельзя давать возможность кому угодно слать запросы на такой важный эндпоинт.</p>
  <p id="gBws">Так что же произошло после того, как команда подключила Cloudflare Waiting Room? В постмортеме это явно не указано, но я вижу только один возможный сценарий. Для того, чтобы Waiting Room заработал, нужно начать проксировать трафик через Cloudflare. То есть запросы от пользователей сначала отправляются на сервера Cloudflare и потом Cloudflare переотправляет запросы на сервера Ticketon. Это позволяет решить, перегружен ли сайт, и, если да, то вместо запроса на сайт Ticketon вернуть HTML-страницу электронной очереди.</p>
  <p id="mS3L">Думаю, внимательные читатели уже поняли, что пошло не так.</p>
  <p id="ItIn"><strong>После включения проксирования через Cloudflare запросы от платёжного провайдера стали также проходить через Cloudflare. И запросы на эндпоинт подтверждения покупок в Ticketon стали приходить с IP адресов Cloudflare, а не с IP адресов платёжного провайдера. Поэтому эти запросы блокировались. Покупки перестали подтверждаться.</strong></p>
  <p id="FtcH">Вот как это выглядело с точки зрения покупателя. Он заходил на сайт, выбирал место, нажимал &quot;Оплатить&quot; и вводил платёжные данные. После этого платёжный провайдер списывал деньги и говорил покупателю, что платёж успешно завершён. Покупатель думал, что всё хорошо, и билет теперь его.</p>
  <p id="WRuz">Но подтверждение оплаты покупателем не доходило от платёжного провайдера до Ticketon. И Ticketon думал, что покупатель выбрал билет, перешёл на его оплату, но оплату не произвёл. Из-за этого через некоторое время бронь с билета снималась, и его мог купить уже другой человек. В итоге, было совершено более 10 тысяч таких повторных продаж.</p>
  <p id="ppAw">К сожалению, в постмортеме не указано, как можно было предотвратить эту проблему. Поэтому я напишу 2 технических решения, которые позволили бы избежать сбоя:</p>
  <ol id="yjNo">
    <li id="SFd8">Можно было начать проксировать через Cloudflare не все запросы на Ticketon, а только запросы от пользователей. Но для этого эндпоинт подтверждения платежей должен был изначально быть на другом (под)домене. Cloudflare позволяет включать проксировать только для конкретных доменов. Если бы эндпоинт был, к примеру, по адресу <a href="https://payments.ticketon.kz/webhook" target="_blank">https://payments.ticketon.kz/webhook</a>, то можно было не включать проксирование для <a href="https://payments.ticketon.kz/webhook" target="_blank">payments.ticketon.kz</a>, и проблема бы не возникла</li>
    <li id="XdB7">Использование прокси по пути запроса от клиента к целевому серверу это частая практика. И поэтому нельзя смотреть только на IP адрес пришедшего запроса, чтобы понять, кто его изначальный отправитель. Для сохранения информации об IP адресе исходного отправителя прокси в переотправляемые запросы добавляют HTTP-заголовок <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For" target="_blank">X-Forwarded-For</a>. Cloudflare <a href="https://developers.cloudflare.com/fundamentals/reference/http-headers/#x-forwarded-for" target="_blank">тоже так делает</a>. Поэтому сервера Ticketon должны были проверять наличие этого заголовка и брать IP адрес отправителя оттуда. Там бы они нашли адрес платёжного провайдера и проблема бы не возникла.</li>
  </ol>
  <p id="j2ei">Указанные выше меры позволили бы избежать сбоя в этом конкретном случае. Но могут возникнуть и другие проблемы. Поэтому у команды должен был быть план на случай, когда такая важная часть общего процесса покупки перестала работать. К примеру, должна быть метрика отношения количества бронирований к количеству покупок. И в случае аномального изменения этой метрики, команде должен сразу прилетать алёрт. И затем у команды должны были быть средства быстро предотвращения проблемы. Например, автоматическое продление бронирования для всех неоплаченных билетов. Чтобы их нельзя было купить, пока команда не решит проблему.</p>
  <p id="2NWP">На этом я завершаю анализ технических деталей и хочу поделиться своим мнением о постмортеме в целом.</p>
  <p id="hvIC">Упор в документе сделан на организационных проблемах и на том, как их предотвращать в будущем. Я бы хотел, чтобы технические проблемы были проанализированы так же глубоко. Чтобы в посмортеме было больше технических деталей, таких как графики потребления ресурсов и времени обработки запросов, и описание того, что в сайте отказало под нагрузкой.</p>
  <p id="3SUi">Но нужно отдать должное команде Ticketon и Freedom Holding в целом. Казахстанские компании всё ещё очень редко публикуют постмортемы, и шаг Ticketon заслуживает большого уважения. Это повышает прозрачность и помогает всему сообществу казахстанских ИТ-специалистов учиться на реальных ситуациях. Надеюсь, другие компании последуют примеру Ticketon и тоже будут публиковать разбор сбоев своих ИТ-систем. Это сделает рынок более зрелым, а продукты надёжнее.</p>
  <p id="NgFz">P.S. Подписывайтесь на мой канал, чтобы получать подобные глубокие технические разборы и быть в курсе событий ИТ-индустрии <a href="https://t.me/drim_channel" target="_blank">https://t.me/drim_channel</a></p>
  <p id="hKgq">ДОПОЛНЕНИЕ от 13 мая 2025 года:</p>
  <p id="nFYx">В комментарии ниже написали, что причина сбоя была несколько другой. И заключалась в том, что запросы от платёжного провайдера просто не доходили до эндпоинта, потому что они вставали в очередь наравне с запросами от пользователей. Для корректной работы нужно было в конфигурации Cloudflare Waiting Room настроить <a href="https://developers.cloudflare.com/waiting-room/additional-options/waiting-room-rules/bypass-rules/" target="_blank">Bypass Rules</a>, чтобы запросы с IP адресов платёжных провайдеров не попадали в очередь ожидания. Либо настроить правило, чтобы в очередь не попадали запросы на конкретный URL эндпоинта Ticketon. Спасибо комментатору Владимиру за уточнение, это ценно.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@drimdev/ticketon-reliability</guid><link>https://teletype.in/@drimdev/ticketon-reliability?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=drimdev</link><comments>https://teletype.in/@drimdev/ticketon-reliability?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=drimdev#comments</comments><dc:creator>drimdev</dc:creator><title>Подходы к созданию надёжных систем на примере ситуации с Ticketon</title><pubDate>Mon, 21 Apr 2025 07:38:28 GMT</pubDate><description><![CDATA[1 августа в Астане состоится концерт Дженнифер Лопес. Звёзды такой величины редко посещают Казахстан, поэтому это событие ожидаемо вызвало ажиотаж. Почитатели таланта знаменитости стали терпеливо ждать 11 апреля - день, когда в сервисе Ticketon должны были начаться продажи билетов. В первые минуты этого дня десятки тысяч покупателей устремились на сайт.]]></description><content:encoded><![CDATA[
  <p id="ooF5">1 августа в Астане состоится концерт Дженнифер Лопес. Звёзды такой величины редко посещают Казахстан, поэтому это событие ожидаемо вызвало ажиотаж. Почитатели таланта знаменитости стали терпеливо ждать 11 апреля - день, когда в сервисе Ticketon должны были начаться продажи билетов. В первые минуты этого дня десятки тысяч покупателей устремились на сайт.</p>
  <p id="SqWe">И сервис упал.</p>
  <p id="X1UQ">Ситуация, когда интернет-сервисы не справляются с нагрузкой и перестают стабильно работать, не является редкой. На это есть разные причины. Возможно, маркетологи недооценили спрос. Или техническая команда неверно рассчитала сколько железа необходимо. Или с нагрузкой не справились внешние сервисы. Ситуация плохая и она бьёт по репутации компании. Но всё же она не критичная. Обычно команда достаточно быстро находит причины падения и устраняет их. Те, кто не смог купить билеты сразу, могут это сделать через некоторое время.</p>
  <p id="P8kw">Но в случае с Ticketon ситуация оказалась гораздо хуже.</p>
  <p id="12lt">После падения сервис подняли и люди продолжили покупать билеты. И только позже стало понятно, что Ticketon даёт возможность купить несколько билетов <strong>на одно и то же место</strong> 💥</p>
  <p id="Eila">А вот это уже катастрофа. Представьте, что человек за 100 тысяч тенге купил билет и пришёл на концерт. А вокруг его места стоит ещё 5 человек с таким же билетом. На трибунах будет одна большая драка. И это сто процентов приведёт к срыву концерта.</p>
  <p id="IZhi">Как только стала понятна проблема дублирования билетов, продажи тут же прекратили. Но множество одинаковых билетов уже было продано. Начались действия по минимизации ущерба. Кому-то смогли найти новые места, кому-то пришлось возвращать деньги вместа с компенсацией. Как итог - тысячи разгневанных клиентов, сотни миллионов тенге убытков для Ticketon и большой репутационный ущерб. Детали рекомендую прочитать в сообщениях руководителей Freedom Holding - компании, владеющей Ticketon. Вот сообщения Тимура Турлова - https://www.threads.net/@timurturlov/post/DIePx8Zt_VX Вот сообщения Алексея Ли - https://www.threads.net/@alexnomad/post/DIWntcuokzV</p>
  <p id="nrXf">Как говорится, умные учатся на чужих ошибках. Поэтому давайте подумаем, как должны были отработать менеджмент и техническая команда Ticketon, чтобы исключить возможность подобных катастроф. И попробуем сформулировать конкретные рекомендации.</p>
  <p id="HfV5"><strong>Менеджмент и маркетинг:</strong></p>
  <p id="S4Xv">1. <strong>Реалистичная оценка ажиотажа</strong>: Понятно, что JLo – это мегазвезда для Казахстана. Ожидать стандартной нагрузки было нельзя. Менеджменту следовало не просто <em>предположить</em> высокий спрос, а заложить в планы пиковую, возможно, даже чрезмерную нагрузку, исходя из масштаба события и медийного шума. Это включает коммуникацию с технической командой о <em>порядке</em> ожидаемых цифр (не &quot;будет много&quot;, а &quot;ожидаем X десятков тысяч одновременных запросов в первую минуту&quot;).</p>
  <p id="YOSg">2. <strong>Стратегия продаж</strong>: Запуск всех билетов одномоментно в полночь – классический рецепт для создания пиковой нагрузки. Менеджмент мог рассмотреть альтернативы:</p>
  <p id="eOsw">* <strong>Предрегистрация/лотерея</strong>: Собрать заявки заранее и распределить возможность покупки.</p>
  <p id="LBby">* <strong>Поэтапный старт</strong>: Начинать продажи по секторам или ценовым категориям с интервалом в несколько часов.</p>
  <p id="UYOI">* <strong>Очередь</strong>: Внедрить систему виртуальной очереди, которая пропускает на сайт ограниченное количество пользователей одновременно. Да, это тоже вызывает недовольство ожидающих, но предотвращает падение и хаос.</p>
  <p id="Dspm">3. <strong>Коммуникация</strong>: Заранее предупредить пользователей о возможном высоком спросе и потенциальных сложностях, объяснить, как будет работать система (если используется очередь или поэтапный старт). Это управляет ожиданиями.</p>
  <p id="d8w5"><strong>Техническая команда:</strong></p>
  <p id="ij06">1. <strong>Нагрузочное тестирование</strong>: Это альфа и омега подготовки к таким событиям. Нужно было не просто проверить, что сайт работает, а <em>симулировать</em> реалистичный сценарий: одновременный заход десятков тысяч пользователей, массовые запросы к базе данных (проверка наличия мест, создание заказов). Тестирование должно выявить &quot;узкие места&quot; – будь то серверные мощности, пропускная способность сети, неоптимизированные запросы к БД или проблемы во внешних сервисах (например, эквайринг).</p>
  <p id="8HEY">2. <strong>Масштабируемая архитектура</strong>: Современные облачные технологии позволяют гибко наращивать мощности (auto-scaling) под нагрузку. Команда должна была убедиться, что инфраструктура настроена на автоматическое или быстрое ручное масштабирование всех компонентов системы: веб-серверов, серверов приложений, баз данных.</p>
  <p id="gHFf">3. <strong>Оптимизация</strong>: Проанализировать и оптимизировать самые ресурсоемкие операции, особенно те, что связаны с проверкой и бронированием мест. Использовать кэширование где возможно (например, для статической информации о мероприятии).</p>
  <p id="j251">4. <strong>Самое главное! - предотвращение продажи дубликатов</strong>: Вот здесь и произошла катастрофа. Падение сервера – полбеды. Продажа одного места нескольким людям – это фундаментальная ошибка в логике приложения или управлении данными. Как это предотвратить:</p>
  <p id="Fwbg">* <strong>Атомарность операций</strong>: Процесс &quot;проверить доступность места -&gt; занять место -&gt; создать заказ&quot; должен быть <em>атомарным</em>. Это означает, что он либо выполняется целиком и успешно, либо полностью откатывается, если на каком-то этапе произошел сбой или место уже занято другим запросом. Это достигается с помощью механизмов транзакций в базах данных.</p>
  <p id="7cWg">* <strong>Блокировки</strong>: При попытке купить конкретное место, на него должна ставиться блокировка на короткое время (пока идет оформление), чтобы другой процесс не мог его занять. Важно использовать правильный уровень изоляции транзакций и грамотно управлять блокировками, чтобы не парализовать систему, но гарантировать эксклюзивность места.</p>
  <p id="N62D">* <strong>Уникальные ограничения (unique constraints)</strong>: На уровне базы данных должно быть жесткое ограничение, не позволяющее добавить две записи с одинаковым местом на одно и то же мероприятие. Это последняя линия обороны, которая не даст записать дубликат, даже если логика приложения даст сбой.</p>
  <p id="e9Se">* <strong>Тестирование конкурентного доступа</strong>: Нужно было <em>специально</em> тестировать сценарии, когда несколько &quot;покупателей&quot; одновременно пытаются купить одно и то же место. Эти тесты должны доказать, что система корректно обрабатывает такие &quot;гонки запросов&quot; (race conditions).</p>
  <p id="SCzM">5. <strong>План действий при сбоях (incident response plan)</strong>: Что делать, если система все-таки упала? Как быстро ее поднять? <em>Критически важно</em>: перед тем как снова открывать продажи после сбоя, необходимо провести проверку целостности данных. Убедиться, что не возникло аномалий вроде &quot;подвисших&quot; заказов или некорректного статуса мест. Похоже, именно этот шаг был пропущен, что и привело к продаже дублей после восстановления работы.</p>
  <p id="LDSj">Катастрофа с Ticketon – это результат целого комплекса проблем: недооценка нагрузки менеджментом, недостаточная подготовка и тестирование со стороны технической команды, и, вероятно, отсутствие должного контроля и стратегического видения со стороны технического руководства (CTO) в части обеспечения фундаментальной надежности критически важной функции – продажи уникального товара (билета на место). Падение сервера – это плохо. Продажа дубликатов – это показатель системного сбоя на уровне архитектуры, процессов разработки и тестирования.</p>
  <p id="W7LA">Ticketon обещали опубликовать постмортем, где они опишут все причины, приведшие к этой ситуации. Посмотрим, насколько они будут пересекаться с тем, что я написал выше.</p>
  <p id="xgcS">Этот случай – болезненный, но ценный урок для всей IT-индустрии Казахстана о том, насколько важен не только внешний функционал сервиса, но и его внутренняя надежность, особенно когда на кону стоят большие деньги и доверие тысяч людей. Надеюсь, нужные выводы будут сделаны и подобных ситуаций в будущем удастся избежать.</p>

]]></content:encoded></item></channel></rss>