RU

Как ИИ-агенты повторяют задачу: промпт, скилл, граф или код

Агент один раз сверил прайс-лист и собрал отчёт. Через неделю пришёл новый файл, и задачу нужно повторить. На повторном запуске агент снова планируе…

ИИ-агентыLLMAgent SkillsMCPn8nCopilot Studiodurable executionидемпотентностьstructured outputsповторный запуск
Habr
RU

Код от AI прошёл демо. Что я дописываю в задачу, чтобы он пережил пятый релиз

AI за вечер собирает интерфейс, backend и рабочий сценарий — и демо проходит. Проблемы начинаются к пятому релизу: новый провайдер требует правок в…

вайбкодингAIархитектураLLMпроектированиеPostgreSQLидемпотентность
Habr
RU

Как запустить платные консультации в Telegram: оплата, срок переписки и работа с клиентами

Клиент оплатил доступ на сутки в 01:00, а первый ответ получил в 10:00. Если срок отсчитывается от оплаты, на переписку осталось 15 часов. Разбираю,…

TelegramTelegram Bot APITelegram StarsTelegram-ботыSLAoutboxуправление доступомплатежиидемпотентностьплатные консультации
Habr
RU

Платёж списывается дважды. Найдите причину в коде, который прошёл ревью

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

идемпотентностьдвойное списаниеплатёжный сервисраспределённые системыSpring BootJavaPostgreSQLретраиконкурентные запросымикросервисная архитектура
Habr
RU

С системой, которую нельзя менять, не интегрируются. Её можно только зеркалить

Ты не владеешь источником — значит, не владеешь временем. Как поллер по updated_at молча теряет строки, почему exactly-once это свойство твоей запис…

Kafkaинтеграция1СERPидемпотентностьсверка данныхupdated_at
Habr
RU

Доставка вебхуков: повторы, дубли и ещё три источника проблем

Получатель записал заказ в базу, но соединение оборвалось до того, как отправитель получил ответ. Повторить вебхук — рискнуть вторым заказом, не пов…

вебхукиwebhooksидемпотентностьretryexponential backoffhmacssrfcircuit breakerочередиphp
Habr
RU

Один разработчик, пять сервисов, три базы: что я понял об архитектуре, когда пришлось самому всё деплоить и чинить

Через год после закрытия проекта я открыл его код и устроил себе code review. Это был автомобильный маркетплейс объявлений, который я в од…

архитектураcode-reviewNestJSSocket.IOKubernetesPostgreSQLlost-updateидемпотентностьoutboxCronJob
Habr
RU

REST, Webhook или Message Broker: что выбрать для интеграции корпоративных систем

В интеграциях корпоративных систем часто спорят не о том, как связать системы , а о том, чем именно их связать : REST API, webhook или брокером сооб…

REST APIwebhookmessage brokerинтеграция корпоративных системброкер сообщенийApache KafkaRabbitMQасинхронная интеграцияидемпотентностьархитектура интеграций
Habr
RU

Событие вместо поля: как журнал медиации вернул историю, которую система стирала

В феврале я написал три текста о том, что статусы не показывают процесс и что юридический сервис без событийной модели не масштабируется. В августе…

событийная модельevent sourcingappend-onlymongodbmongooselegaltechаналитика процессовидемпотентность
Habr
RU

МойСклад после переезда с InSales: где ломается связка сайта с учётом

Разбираем интеграцию интернет-магазина с МойСкладом на собственном движке, Next.js и PostgreSQL, после переезда с InSales. Если ваш магазин живёт в…

МойСкладинтеграция с учётной системойInSalesпереезд интернет-магазинаAPIидемпотентностьобработка ошибокrate limitNext.jsPostgreSQL
Habr
RU

Кнопка нажата, а ответа нет: как не потерять действие пользователя и не наделать дублей

Пользователь нажал кнопку, сеть пропала, а браузер не знает, дошёл ли запрос до сервера. Повторите запрос — можно получить дубль. Не повторяйте — по…

офлайн-очередьService WorkerидемпотентностьIndexedDBBackground Syncповторные запросыFastAPIPostgreSQLhtmxPlaywright
Habr
RU

Как я перестал измерять MVP количеством функций: история создания Prosnix

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

MVPTelegram Mini Appsпродуктовая аналитикаstate machineидемпотентностьoptimistic concurrencyretentionтестированиеархитектура приложений
Habr
RU

Как соцсеть для Егоров превратилась в автономный город на Node.js и SQLite

11 недель назад я начал делать социальную сеть, в которой гражданство зависело только от имени. Если тебя зовут Егор, Георгий или одной из форм имен…

ЕгородNode.jsSQLitebetter-sqlite3ExpressSocket.ioархитектураидемпотентностьfeature flagsсоциальная сеть
Habr
RU

Вебхук ЮKassa принимал payment.succeeded на веру. Подделать оплату брони можно было одним curl

Разбираю находку из технического аудита сервиса аренды авто: вебхук /payments/webhook/yukassa помечал бронь оплаченной по одному полю из тела запрос…

вебхукиплатежибезопасностьидемпотентностьтестирование
Habr
RU

Сервис не ответил. Операция провалилась? Почему timeout не означает, что операция не выполнилась

В статье разберём, почему timeout не позволяет однозначно определить результат бизнес‑операции и как безопасно обрабатывать такие сит…

идемпотентностьтаймаутreconciliationidempotency keyинтеграцииjittertimeoutapi
Habr
RU

Как защитить платежный API от двойных списаний с помощью идемпотентности

Пользователь нажал кнопку оплаты один раз, но деньги списались дважды — такой сценарий возникает не из‑за редкой ошибки, а из‑за…

идемпотентностьраспределённые системымикросервисыAPIbackendплатежные системыотказоустойчивостьPostgreSQLконкурентный доступархитектура ПО
Habr
RU

«Ссылка недействительна» с первой попытки: её открыли до пользователя

В нашем сервисе появились обращения, которые не складывались в картину: человек запрашивает сброс пароля, получает письмо, нажимает на ссылку и види…

сброс пароляаутентификацияпочтовые шлюзыодноразовые ссылкиидемпотентность
Habr
RU

Один Telegram‑бот, три сервиса, один 301: как я сделал webhook‑router вместо монолита

У Telegram-бота может быть только один активный webhook. У меня при этом появились три независимых сценария: поддержка пользователей, управление неб…

Telegram Bot APIwebhookFastAPIRedisPythonHMACидемпотентностьочереди сообщениймаршрутизация запросовDocker
Habr
RU

Ручного курьера приняли за чужого: почему ID оказался плохим признаком происхождения записи

04.09 в 09:06:45 UTC ночной опрос Fleet нашёл одного «нового» курьера. Дальше автоматика отработала без единой ошибки: new_ids: 1 , dispatch_alerted…

n8nавтоматизацияинтеграцииfleetидемпотентность
Habr
RU

В Bot API 10.2 добавили subscription. Почему canceled ещё не означает потерю доступа

В Bot API 10.2 появилось отдельное событие для изменений в регулярной подписке — Update.subscription . Сразу уточню область применения: речь идёт о…

TelegramTelegram Bot APITelegram Starsподпискирекуррентные платеживебхукиидемпотентностьуправление доступом
Habr
RU

«Если что, поднимем и разберемся»

Что происходит с процессом, который исполняется по правилам без постоянного участия человека, и что должно быть записано в момент решения, чтобы спу…

аудит решенийидемпотентностьLLM в продакшеневоспроизводимостьверсионирование правил
Habr
RU

Один контракт данных, разные адаптеры: как перестать писать миграцию магазина заново

Первый файл, который я получил при переезде своего магазина с InSales, парсер прочитал как одну длинную строку мусора. Выгрузка заказ…

миграция данныхETLадаптерыидемпотентностьимпорт данныхInSalesPostgreSQLNext.jsинтернет-магазинblue-green
Habr
RU

Как я случайно напечатал инфляцию в Discord‑боте и переделал ставки в тотализатор

Всё, что ниже — из живого пет-проекта: бот начисляет участникам голосовых каналов баллы лояльности (LP), а на эти баллы люди устраивают пари в стиле…

JavaSpring BootJDADiscord-ботPostgreSQLконкурентностьидемпотентностьтотализаторигровая экономикатранзакции
Habr
RU

Строка «resumes from where it stopped» увела меня в ветку форума 2021 года и в пять вопросов к движку автоматизации

Строка из документации n8n про возобновление с места остановки читается как гарантия перезапуска с точки сбоя. Проверка привела в ветку форума 2021…

n8nавтоматизация процессовworkflowнадёжностьидемпотентностьвебхукиЯндекс 360low-code
Habr
RU

AVM изнутри задачи, сбои и состояние виртуальных машин

В первой части мы разобрали, почему Aeza ушла со сторонней платформы и как AVM устроен в общих чертах. Здесь уровень ниже: путь запроса от вызова до…

AezaAVMвиртуализациявиртуальные машиныlibvirtgRPCраспределённые системыотказоустойчивостьидемпотентностьstate machine
Habr
RU

Rich Messages в Telegram Bot API: как превратить одно сообщение в интерактивный интерфейс

Telegram показал Rich Messages с интерактивными кнопками на примере шахмат. Я захотел проверить подход на более насыщенном сценарии и…

telegram bot apirich messagesserver-driven uistate machinecallback queryидемпотентность
Habr