Подієві API - вебхуки, повідомлення в брокері (Kafka, RabbitMQ), канали WebSocket - мають ті самі проблеми, що й REST: контракт, документація, сумісність. Але є й власні - порядок і дублікати.
Документація - AsyncAPI. Те, чим OpenAPI є для REST, AsyncAPI є для подій: специфікація каналів, повідомлень і їхніх схем:
asyncapi: 3.0.0
info:
title: Orders events
version: 1.4.0
channels:
orderPaid:
address: orders.paid
messages:
orderPaid:
payload:
type: object
required: [id, orderId, paidAt]
properties:
id: { type: string }
orderId: { type: integer }
paidAt: { type: string, format: date-time }
З неї генеруються документація, типи для споживачів і перевірки повідомлень.
Версіонування подій:
- додавання полів - безпечне, якщо споживачі ігнорують невідомі поля (це треба вимагати в документації);
- ламаючі зміни - нова назва чи версія події (
order.paid.v2) і паралельна публікація обох версій на перехідний період; - версія у вебхуках - часто прив'язується до облікового запису одержувача (як
api_versionу Stripe): одержувач сам обирає, коли перейти на новий формат.
Порядок подій не гарантований. Повтори, паралельні воркери й мережа змішують порядок: order.shipped може прийти раніше за order.paid. Стратегії для одержувача:
- мітка часу чи номер версії об'єкта в події - застосовувати лише якщо подія новіша за вже відомий стан;
- «тонкі» події: подія лише повідомляє «замовлення 42 змінилося», а одержувач запитує актуальний стан через API - порядок перестає мати значення;
- впорядкування за ключем у брокері (партиції Kafka за
order_id) - порядок гарантується в межах однієї сутності, а не глобально.
Дублікати - наслідок доставки «щонайменше один раз»: одержувач зберігає оброблені id подій і пропускає повтори.
Документуйте явно: гарантії доставки (щонайменше один раз), відсутність гарантії порядку, тайм-аути й політику повторів, як перевіряти підпис. Більшість помилок інтеграцій - від неявних припущень одержувача про порядок і унікальність.