В гостях у «дяди Васи». Когда проблема — ужас-ужас, а ремонт — копеечный

Идемпотентность — звучит сложно, говорят о ней редко, но это касается всех приложений, использующих API в своей работе. Меня зовут Денис Исаев, и я руковожу одной из бэкенд групп в Яндекс Такси. Сегодня я поделюсь с читателями описанием проблем, которые могут возникнуть, если не учитывать идемпотентность распределенных систем в своем проекте.

Содержание

Для этого я выбрал формат вымышленных историй о стажёре Васе, который только-только учится работать с API.

Так будет нагляднее дядя вася таксист полезнее. Вася разрабатывал приложение для заказа такси с нуля и получил задачу сделать API для заказа машины. Когда надо было сделать API для отдачи активных заказов, Вася задумался: а может ли понадобиться заказывать одновременно несколько машин такси. Менеджеры ответили, что нет, такая возможность не нужна. В мобильном приложении дядя вася таксист Федя поддержал серверное API следующим образом:.

Как и положено, на серверный код и код приложения написали автотесты, а перед релизом мобильного приложения его вручную тестировали 2 дня.

  • Дядя Вася - группа Любэ, Николай Расторгуев. Альбом: Атас (). Кто автор слов и музыки. История, только факты. Текст песни. Слушать онлайн
  • Текст песни "Дядя Вася" из альбома «Атас» (). Слова Н. Олев, музыкаИгорь Матвиенко. Песню на видео исполняет группа «Любэ»
  • Дядя Вася (Uncle Vasya) Lyrics: Жил да был на свете дядя Вася / Дядю Васю знала вся округа / И до недавних пор мог он
  • Смотрите видео на тему «Фильм Дядя Вася Подвез Девушку» в TikTok. .

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

Подборки товаров в категории Наклейки и знаки автомобильные

Команда разработки и менеджеров отметили пончиками успешный запуск и разошлись по домам.

В 8 утра Васю разбудил звонок от саппорта: двое пользователей пожаловались на то, что к ним приехало две машины вместо одной, и деньги дядя вася таксист за обе машины. Быстро делая кофе, Вася сел за ноутбук, подключился по VPN и начал копать логи, графики и код. По логам Вася обнаружил, что у этих пользователей было по два одинаковых запроса с разницей в несколько секунд. По графикам он увидел: в 7 утра база данных начала тормозить и запросы записи в базу стали работать секундами вместо миллисекунд.

К этому моменту причина медленных запросов уже была найдена и устранена, но нет гарантий, что подобное не повторится когда-нибудь. И тут он дядя вася таксист приложение не блокирует кнопку «заказать такси» после отправки запроса, и, когда, запросы начали тормозить, пользователи стали жать на кнопку еще раз, думая, что первый раз она не нажалась. Приложение стало блокировать кнопку: этот фикс зарелизился через несколько дней.

Вася Чингиз Кадыров. таксист Ольга Кузьмина. Даша Владимир Сычев. Валера Павел Комаров. Саша Магомед Муртазаалиев. Джоник Михаил Богдасаров. Стихотворение автора: Сергей Медведев (Таксист); Название: Дядя Вася, мамин хахаль ; Раздел: Юмор; Тематика: Шуточные стихи; Баллы: ; Читатели: ;. Рашпилевская, д. /, этаж , помещ. Телефоны: + () -- + () -- Email: info@dg-yuru Реклама: sale@dg-yuru.

Но команде пришлось еще несколько недель получать подобные жалобы и просить пользователей обновить приложение.

Пришла очередная подобная жалоба, а саппорт по инерции ответил «обновите приложение». Но тут пользователь сообщил, что у него уже самая новая версия приложения. Васю и Федю вырвали из их текущих фич и попросили разобраться, как же так, ведь этот баг уже пофиксили. Потратив два дня на раскопки этого единичного случая, они выяснили, в чем было. Оказалось, что блокировать кнопку недостаточно: один из пользователей пытался заказать такси, находясь в подземном переходе.

Мобильный у него работал еле-еле: при нажатии на кнопку заказа запрос ушел на сервер, но ответ не был получен. Приложение показало сообщение «произошла ошибка» и разблокировало кнопку заказа. Кто бы мог подумать, что такой запрос мог быть успешно выполнен на сервере, а таксист уже быть в пути.

Любэ - Дядя Вася - текст песни, слова

Выбрали вариант править на сервере, так как это можно сделать в тот же день, не дожидаясь долгой раскатки приложения. Из нескольких вариантов исправления Вася выбрал такой: перед созданием заказа в базе он селектит из базы заказы пользователя с такими же параметрами from и to за последние 5 минут.

Если такой заказ найден, то сервер отдает ошибку Вася написал автотесты, и, случайно, запустил их параллельно: один из тестов упал. Вася понял, что есть гонка между селектом и инсертом в базу при параллельных запросах от дядя вася таксист пользователя. По результатам случившихся багов Вася понял, что и сеть может «моргать», и база данных может тормозить, увеличивая окно гонки, поэтому случай вполне реальный.

Как это чинить правильно, было непонятно. По совету более опытного программиста Вася посмотрел на проблему с другой стороны и обошел гонку, используя такой алгоритм:.

Содержание

Приложение при получении кода ответа перезапрашивало список активных заказов. Фикс на сервере зарелизили в тот же день, дубли миновали, а после выкатки приложения пользователи перестали видеть ошибки. Вася с Федей вернулись к своим фичам.
Feb , Share your videos with friends, family, and the world.
Прошел месяц, и к Васе пришел новенький менеджер: за сколько дней можно сделать фичу «мультизаказ»: чтобы пользователь мог заказать две машины такси?

Вася удивлен: как же так, я же спрашивал, дядя вася таксист вы говорили мне, что это не понадобится. Вася сказал, что это не. Менеджер удивился: дядя вася таксист это не просто поднять лимит с 1 до 2. Но мультизаказ полностью ломал Васину схему защиты от дублей. Вася даже не представлял, как вообще можно решить эту задачу, не вводя дублей. Вася решил изучить, кто как борется с такими проблемами, и наткнулся на понятие идемпотентности.

Дядя Вася — текст и слова песни, видео

Идемпотентным называют такой метод API, повторный вызов которого не меняет состояние.

Здесь есть тонкий момент: результат идемпотентного вызова может меняться. Например, при повторном вызове идемпотентного API создания заказа — заказ не будет создаваться еще раз, но API может ответить кактак и При обоих кодах ответа API будет идемпотентно с точки зрения состояния сервера заказ один, с ним ничего не происходита с точки зрения клиента поведение существенно разное. Вася решил посмотреть примеры и наткнулся на понятие idempotency дядя вася таксист в некоторых публичных API.

Дядя вася таксист аналогично позволяет клиентам слать вместе с формально неидемпотентными POST запросами заголовок Idempotency-Key с уникальным ключом, сгенерированным на клиенте API. Ключи хранятся в дядя вася таксист 24ч. Среди неплатежных систем Вася нашел client tokens у AWS.

Комментарии

Приложение стало генерировать ключ идемпотентности как UUID v4 и слать его на сервер. При повторных попытках создания заказ приложение шлет тот же ключ идемпотентности. На сервере ключ идемпотентности инсертится в базу в дядя вася таксист, на котором есть ограничение базы данных по уникальности.

Если это ограничение не дало сделать инсерт, то код обнаруживал это и отдавал ошибку По совету Феди этот момент был переделан в сторону упрощения приложения: отдавать стали неабудто бы заказ успешно создан, тогда на клиентах не надо учиться обрабатывать код После этого лимит просто подняли с 1 до 2 и поддержали изменение в приложении. При тестировании приложения нашли следующий баг:.

таксист дядя Вася. Отзыв от Дядя Вася о компании-работодателе А и Я, автосервис. А остальную половину он может доверить «дяде Васе», чтобы было дешевле, чем на сервисе, может и проконтролировать его. .

Сначала Вася предложил Феде генерировать новый ключ идемпотентности в таком случае.
  • About Press Copyright Contact us Creators Advertise Developers Terms Privacy Policy & Safety How YouTube works Test new features NFL Sunday Ticket Press Copyright.
  • Байдак Василь Васильович. У Вікіпедії є статті про інших людей із прізвищем Байдак. Василь Васильович Байдак ( січня , Вінниця)український стендап -комік і волонтер. Свої виступи часто
  • Текст песни Дядя Вася в исполнении Любэ c переводом: Жил да был на свете дядя Вася, Дадю Васю знала вся округа, И до недавних пор мог он пить любую дрянь - Политуру, лак, одеколон
  • Sep , Open App. This content isn't available. такси дядя Вася довезёт вас в целости и сохранности. No views minutes ago more. Таксист дядя Вася.

Но Федя дядя вася таксист, что тогда может быть дубль: при сетевой ошибке запроса создания заказа приложение не может знать, был ли действительно заказ создан.

Федя заметил, что хоть это и не решение, но для раннего обнаружения дядя вася таксист багов на сервере следовало проверять, что параметры входящего запроса совпадают с параметрами существующего заказа с таким же ключом идемпотентности. В итоге вдвоем они придумали следующее решение: приложение не дает изменить параметры заказа и бесконечно пытается создать заказ, пока получает коды ответа 5xx дядя вася таксист же сетевые ошибки.

Вася добавил серверную валидацию, предложенную Федей. Но старшие товарищи предложили более общее решение: версионировать состояние списка заказов. Это версия всего списка заказов пользователя, а не конкретного заказа. При создании заказа приложение передает в отдельном поле или заголовке If-Match версию, о которой он знает.

Автор текста — Наум Олев, композитор — Игорь Матвиенко. Премьера композиции состоялась в году. Жил дядя вася таксист был на свете дядя Вася, Дадю Васю знала вся округа, И до недавних пор мог он пить любую дрянь — Политуру, лак, одеколон. И жила-была жена у Васи, Но жена ушла к другому Дядя вася таксист.

Вещи в грузовик, шифоньер, ковер, пальто, А ему оставила стакан. Дядя Вася, дядя Вася, Дядя Вася слезы льет.

Сервер атомарно с изменением увеличивает версию при любых изменениях заказов создание, отмена, редактирование. То есть приложение в запросе к серверу говорит ему, какое состояние заказов оно знает.

И если это состояние заказов версия расходится с тем, что хранится на сервере, то сервер отдает ошибку «заказы были изменены параллельно, дядя вася таксист информацию о заказах». Версионирование решает обе найденные проблемы, и именно его Вася с Федей и поддержали. Также стоит отметить, что версия может быть как числом номером последнего изменениятак и хэшом от списка заказов: так, например, работает параметр дядя вася таксист в Google Cloud API для изменения дядя вася таксист инстансов.

По итогам всех переделок Вася поразмышлял и понял, что любой API создания ресурсов обязательно должен быть идемпотентным. Кроме того важно синхронизировать знание о списке ресурсов на клиенте и сервере через версионирование этого списка.

  Дядя Вася в любой момент может сказать, что он тебя вообще первый раз в жизни видит. Но правда, как говорит общественность тут на Дроме, этого не может .
В один день Васе в телеграм приходит нотификация о том, что в API был код ответа По логам Вася нашел, что это случилось в API отмены заказа. Внутри строка с заказом просто удалялась. В данной ситуации приложение послало первый запрос на отмену, но он стаймаутил.

Приложение, не уведомляя пользователя, сразу сделало перезапрос и получило первый запрос уже выполнился и удалил заказ. Дядя вася таксист же увидел сообщение «неизвестная ошибка сервера». Оказывается, идемпотентным должны быть не только API создания, но и удаления ресурсов, — подумал Вася. Но это создавало риск скрыть и пропустить возможные проблемы. Поэтому дядя вася таксист решил сделать soft delete и переделать API отмены:. Вася решил проверить по коду, есть ли идемпотентность у API изменения поездки: он уже осознал, что идемпотентным должен быть абсолютно любой API.

В приложении пассажир может изменить точку B. Сервер же внутри просто выполняет update в базу:. Тут все идемпотентнее некуда — подумал Вася и был прав. Также Вася проверил API завершения поездки: оно вызывается водительским приложением, когда водитель выполнил заказ. На сервере API помечает заказ выполненным и делает ряд действий, в том числе подсчет статистики. Дядя вася таксист считаемой статистики взгляд Васи упал на метрику кол-ва завершенных заказов у пользователя.

При вызове API счетчик завершенных заказов инкрементился запросом вида. Стало понятно, что при повторных вызовах API счетчик может увеличиться больше, чем на 1. Вася задумался: зачем вообще нужен счетчик, если можно каждый раз по базе дядя вася таксист общее число таких заказов. Коллега подсказал ему, что во-первых, старые заказы уезжают в отдельные дядя вася таксист, а во-вторых, счетчик используется в нагруженных API, где важно не делать лишние запросы в базу.

Вася создал задачу в таск-трекере на переделку расчета счетчика по следующему алгоритму:.

актеры и роли

Длинный какой-то день сегодня получился. И сразу в нем собрались: и деньги, и пчёлы, и мусорная урна. День сегодняшний был похож на грузовое такси, которое перевозит вещи на дачу. Чего только в него не навалено — и детские коляски, и матрасы, и телевизор «Рубин». Милицейская машина мчалась по шоссе. По сторонам мелькали домики и дачки. Их дядя вася таксист крыши порозовели под закатным светом, мерцали в зеленых дядя вася таксист.

такси дядя Вася довезёт вас в целости и сохранности


афс такси лизинг

заказать через такси сигареты