Результати у Callback

Остання зміна 2024/05/17 10:53 автором Ashterix

Іноді у вас може виникнути необхідність отримувати відповідь від запитів, що можуть опрацьовуватися довгий час. Виконувати їх синхронно може бути невдалою ідеєю, бо це призводить до блокування клієнта, затримок у відповіді і загального зниження продуктивності системи. У таких випадках функціональність callback після виконання запиту стає особливо корисною.

Замість того, щоб чекати на завершення всіх операцій, клієнт може отримати миттєве підтвердження про прийняття запиту. Після обробки запиту сервер надішле результат на вказаний callback URL, що дозволяє клієнту продовжувати свою роботу без затримок.

Моя бібліотека надає можливість використовувати callback після виконання запиту. Це досягається за допомогою параметра $rpc.callback, який містить DSN (Data Source Name).

Коли сервер отримує запит з цим параметром, він інтерпретує його як метод для асинхронного виклику. Тому після перевірки DSN, який вказаний як callback, миттєво повертає відповідь з підтвердженням про те, що запит буде відправлено на callback.

Ця функціональність дозволяє вказати, куди буде відправлено відповідь після обробки запиту. Це може бути POST запит на вебхук, який передасть об'єкт відповіді в тілі, або вебсокет.

Алгоритм

  1. Отримати запит з параметром $rpc.callback.
  2. Провалідувати DSN.
  3. Повернути миттєве підтвердження клієнту про прийняття запиту.
  4. Обробити запит.
  5. Відправити відповідь на вказаний в $rpc.callback DSN.

Приклад

Уявімо, що ми керуємо інтернет-магазином, де користувачі можуть замовляти товари. Кожне замовлення потребує обробки, включаючи перевірку наявності товарів, розрахунок загальної вартості, і підтвердження оплати. Ці операції можуть займати деякий час.

Використовуючи $rpc.callback, ми можемо значно покращити досвід користувачів. Наприклад, після того як користувач підтверджує замовлення, ми можемо одразу повернути йому повідомлення про те, що замовлення прийняте і обробляється, не чекаючи завершення всіх операцій.

 Запит може виглядати так.

Request /api
1
2
3
4
5
6
7
8
{
  "id": "example_order",
  "method": "OrderService.processOrder",
  "params": {
     "orderId": "12345",
     "$rpc.callback": "https://example.com/order/callback"
   }
}

Наразі, DSN що ви можете вказати в цей параметр має містити лише HTTPS протокол!

Протокол HTTP не підтримується з міркувань безпеки даних.

В майбутніх планах розширення переліку протоколів, що підтримуються.

У відповідь користувач одразу отримує  підтвердження.

Response from /api
1
2
3
4
5
6
7
8
9
10
{
  "id": "example_order",
  "result": {
       "callback": {
           "url": "https://example.com/order/callback",
           "status": true,
           "data": []
        }
    }
}

Після опрацювання запиту на DSN, що був вказаний як callback буде відправлено повідомлення.

Callback Request
1
2
3
4
5
6
7
8
9
{
  "id": "example_order",
  "result": {
       "orderId": "12345",
       "status": "completed",
       "totalAmount": 99.99,
       "message": "Your order has been processed successfully."
    }
}

Переваги

  1. Миттєве підтвердження: Клієнт отримує швидку відповідь про прийняття запиту, не чекаючи його повної обробки.
  2. Асинхронна обробка: Запит обробляється асинхронно, а результат відправляється на вказаний callback.
  3. Гнучкість: Можливість вказати різні типи callback, такі як вебхуки або вебсокети, для отримання результатів.

Ця функціональність підвищує ефективність взаємодії з API, забезпечуючи швидке підтвердження прийняття запиту та зручність отримання результатів обробки.