Колбэк (callback, функция обратного вызова) — паттерн программирования, при котором функция A получает функцию B в качестве аргумента и вызывает B в определённый момент: после завершения асинхронной операции, при наступлении события, при возникновении ошибки. Это один из фундаментальных паттернов асинхронного программирования: позволяет продолжить выполнение кода без блокирования на ожидание медленной операции.
Как работает
В синхронном программировании функции вызываются последовательно: каждая ждёт завершения предыдущей. В асинхронном — операция (I/O, сетевой запрос, таймер) инициируется, и выполнение продолжается без ожидания результата. Когда операция завершается, вызывается колбэк с результатом.
Классический пример JavaScript: fs.readFile('file.txt', (err, data) => { /* колбэк */ }). Node.js продолжает выполнять другой код, пока операция чтения файла не завершится. Паттерн «error-first callback» в Node.js: первый аргумент колбэка — ошибка (null если успешно), второй — результат.
«Callback hell» (или «pyramid of doom») — антипаттерн, возникающий при вложенных колбэках: каждый следующий шаг вложен в предыдущий, образуя лестницу отступов. Решения: Promise (ES6, 2015), async/await (ES2017) — синтаксический сахар над Promise, превращающий асинхронный код в линейный.
В серверном контексте колбэки используются в обработчиках событий: server.on('request', callback) в Node.js HTTP Server. PHP не имеет нативной асинхронности в стандартном исполнении — каждый HTTP-запрос обрабатывается синхронно. Для PHP-колбэков используют анонимные функции (замыкания) как аргументы: array_map(function($item) { ... }, $array).
HTTP-колбэк (Webhook)
В контексте API и интеграций колбэк часто означает Webhook — HTTP-запрос от одного сервиса к другому при наступлении события. Пример: платёжная система отправляет POST-запрос на URL вашего сервера при успешной оплате. Сервер «колбэк» принимает запрос и обновляет статус заказа. Это событийная модель (event-driven): вместо периодических опросов API (polling) — сервис сам уведомляет при изменении.
Webhook отличается от REST API: REST API — клиент инициирует запрос к серверу. Webhook — сервер инициирует запрос к клиенту при событии. Webhooks широко используются: GitHub (push event), платёжные системы (Stripe, ЮKassa), CRM, телеграм-боты.
История
Концепция callback появилась вместе с событийно-ориентированным программированием в операционных системах 1960–1970-х годов. В Unix сигналы (SIGINT, SIGTERM) — ранняя форма колбэков: ядро вызывает зарегистрированный обработчик при событии. В JavaScript колбэки стали центральным паттерном с 1995 года. Термин «Webhook» ввёл Джефф Линдси в 2007 году. Promise/async-await (2012–2017) снизили необходимость явных колбэков в асинхронном коде.
На что обращать внимание
Для Webhook-колбэков проверяйте подпись запроса (HMAC) — убедитесь, что запрос пришёл от ожидаемого источника, а не от злоумышленника. Серверный колбэк должен отвечать быстро (HTTP 200 за 5–30 секунд) — иначе отправляющий сервис может посчитать доставку неудачной и повторить запрос. Для тяжёлой обработки — принять колбэк мгновенно (HTTP 200), поставить задачу в очередь и обработать асинхронно. Для приёма Webhook на VPS убедитесь, что файрвол открыт для входящих HTTPS-запросов на порт 443.
Callback в программировании
Callback (обратный вызов) — функция, передаваемая как аргумент другой функции для вызова после завершения операции. Используется для асинхронного программирования: HTTP-запрос → callback при получении ответа. Node.js построен на event-loop + callbacks/Promises/async-await.
Webhook как HTTP Callback
Webhook — механизм уведомления через HTTP POST. Сервис отправляет данные на ваш URL при событии: новый заказ, изменение статуса, входящее сообщение. Примеры: GitHub Webhooks (push, PR), Stripe (payment), Telegram Bot API (сообщения). Ваш сервер должен отвечать 200 OK в течение 5–30 секунд.
Надёжная обработка Webhook
Принять Webhook → вернуть 200 OK немедленно → обработать асинхронно через очередь (Redis/RabbitMQ). Идемпотентность: повторная доставка одного события не должна дублировать действие. Верификация подписи: Stripe, GitHub добавляют HMAC-подпись в заголовки — проверяйте перед обработкой.
Callback и Webhook широко используются при интеграции: биллинг получает webhook при оплате, CI/CD запускается по webhook из Git. Redis или RabbitMQ как очередь для надёжной обработки. Nginx принимает webhook-запросы. HTTPS обязателен — webhook содержит чувствительные данные.