Задача: дізнатися, що в сторонньому сервісі щось змінилося - оплата пройшла, посилка доставлена, клієнт оновився в CRM.
Опитування (polling) - ваш застосунок періодично питає API:
Schedule::job(new RefreshParcelStatuses)->everyFifteenMinutes();
- плюси: просто, працює з будь-яким API, ви контролюєте частоту й момент; не потрібна публічна адреса;
- мінуси: затримка до інтервалу опитування; більшість запитів - марні («нічого не змінилося»); з'їдає ліміти частоти провайдера; погано масштабується на тисячі об'єктів.
Вебхуки - провайдер сам надсилає запит на ваш URL, коли подія сталася:
- плюси: майже миттєво; немає марних запитів; масштабується;
- мінуси: потрібна публічна HTTPS-адреса; треба перевіряти підпис; провайдер може не доставити (збій у нього, ваш простій) - подію буде втрачено або доставлено пізніше; дублікати й зміна порядку.
На практиці найнадійніше - поєднання:
- вебхук - як сигнал для швидкої реакції;
- періодичне опитування - як страховка (звірка): раз на годину чи добу перевірити об'єкти в «незавершених» станах (оплата «очікується» понад годину) і підтягнути їхній актуальний статус.
Так система не залежить від того, що кожен вебхук дійде.
Правила обробки вхідних вебхуків:
- перевірити підпис, відповісти
200швидко, а обробку - в чергу; - ідемпотентність за
idподії: дублікат не повинен обробитися двічі; - не покладатися на порядок подій - порівнювати з поточним станом чи запитувати свіжі дані з API;
- для локальної розробки - тунель (Expose, ngrok) чи CLI провайдера, що пересилає події на
localhost.
Коли лише опитування: провайдер не має вебхуків; дані змінюються рідко і затримка неважлива; застосунок не має публічної адреси (внутрішня мережа).
Коли лише вебхуки (без звірки): втрата події некритична, або провайдер гарантує повторну доставку довго й надійно, а у вас є журнал отриманих подій.