Рубрика «race condition»

Предисловие

Как‑то раз мне пришлось переносить с монолитного легаси в новенький микросервис интеграцию с платежным провайдером.

Изучив старый код, я понял, что так дело не пойдет. Два клика по «Оплатить» — два запроса в провайдер. Два Check — два финансовых документа по одной оплате. Два Cancel — два Reverse. В монолите это еще как‑то жило, а в микросервисе, который запускается в двух репликах, локальный SemaphoreSlim вообще перестал что‑либо гарантировать.

Читать полностью »

Была миграция из SAP в 1С:ERP. Нужно было разово загрузить около 28 тысяч карточек номенклатуры. Саму номенклатуру мы контролировали очень внимательно, а задвоилось то, на что смотрели меньше всего: номенклатурные группы, виды номенклатуры и другие зависимые справочники, которые создавались по ходу загрузки. Ниже разбор, почему так вышло, почему управляемые блокировки не спасли и как в итоге решили задачу без блокировок вообще.

Весь код в статье — пример. Он упрощён и показывает подход, а не копирует боевую базу. Имена регистров, реквизитов и служебных процедур условные.

Читать полностью »

«...Давайте я сделаю, на моих токенах потестите...»

Привет! Я разработчик из Минска (работаю официально, в статусе НПД). Занимаюсь автоматизацией на связке Self‑Hosted n8n + Redis. Внедряю автономных ИИ‑агентов для мессенджеров и связываю их с amoCRM.

Дисклеймер: в статье упоминается Meta: организация признана террористической и запрещена в РФ)

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

Во‑первых — Читать полностью »

Однажды я решил проверить на практике байку, которую слышал на десятке собеседований: «у нас на проде было такое‑то место продано дважды, потому что…». Оказалось, воспроизвести это не просто легко — это воспроизводится настолько надёжно и настолько наглядно, что грех было не довести дело до конца: взять систему бронирования мест, специально сломать её, замерить, насколько плохо, а потом последовательно починить тремя разными способами — и честно сравнить, что каждый из них стоит по производительности.

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

Читать полностью »

Пятница, 23:47. PagerDuty: “Платёж AmEx, провайдер вернул 5xx три раза подряд, билеты не зарезервированы.” Открываю логи – действительно 3 ответа провайдера с 5xx, ни одной успешной транзакции по нашей базе. Закрываю как временный сбой на стороне провайдера, пишу короткую сводку в дежурный чат и иду досматривать. Через 40 минут второй алерт – уже от ночной поддержки: клиент прислал скрин выписки, 3 списания подряд за одну бронь. У клиента рейс через 6 часов, ему нужна действующая бронь и подтверждение, что он завтра нормально улетит, а не тикет в поддержку.

Читать полностью »

Привет!

Мы команда «Исходного кода“ и уже полгода системно занимаемся нагрузочным тестированием (НТ). Раньше такие проверки были от случая к случаю — оттуда и взяли базу знаний. Сегодня хотим поделиться историей одного показательного фейла, который заставил нас пересмотреть весь подход и прийти к системе, которая показала себя, как работающая. 

Читать полностью »

JavaScript: два интересных сниппета - 1

Hello, world!

В этой небольшой заметке я хочу поделиться с вами двумя сниппетами, которые показались мне очень интересными. Первый сниппет представляет собой пример реализации простой реактивности (signal), второй — способ предотвращения несогласованности данных в результате состояния гонки (race condition). Первая конструкция используется в SolidJS (с некоторыми дополнительными оптимизациями), вторая — заимствована из одного рабочего проекта.

Интересно? Тогда прошу под кат.

Читать полностью »

TL;DR Большинство атакующих использовали ненадежные методы race condition, инструмент racepwn поможет это исправить

Вася хочет перевести 100 долларов, которые есть у него на счету, Пете. Он переходит на вкладку переводов, вбивает Петин ник и в поле с количеством средств, которые необходимо перевести — цифру 100. Далее, нажимает на кнопку перевода. Данные кому и сколько отправляются на веб-приложение. Что может происходить внутри? Что необходимо сделать программисту, чтобы все работало корректно?
Читать полностью »

Компилируем код из кода для воспроизведения гонки двух процессовКласс CSharpCodeProvider позволяет программе на C# компилировать код на C#. Обычный вопрос – «зачем». Обычные ответы:

  1. исполнение кода, данного пользователями, как на ideone.com,
  2. «ну мало ли зачем» и
  3. «а это уже отдельный вопрос»

Сегодня мы используем этот класс для удобного воспроизведения гонки двух процессов.
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js