Перейти до основного вмісту
Версія: 2.x

Виклики сервісів між namespace

Сервісна операція, також звана операцією Nexus, є підтримуваним довговічним викликом між namespace одного кластера Durable Workflow. Адреса містить цільовий namespace і трійку endpoint/сервіс/операція. Дочірній workflow або звичайний signal залишається у своєму namespace. Ні ім’я черги, ні інша мова не змінюють цього правила.

Вибір підтримуваного API​

ВикликачОпублікований APIЦільовий namespace
Вбудований PHPWorkflow::serviceOperation() або helper serviceOperation()ServiceOperationOptions(targetNamespace: 'billing')
PHP SDKWorkflowContext::serviceOperation()Параметр масиву ['namespace' => 'billing']
Python SDKyield context.call_nexus_service(...)Ключовий аргумент target_namespace='billing'
Rust SDKАвторські очікування Nexus не опублікованіВідстежуються у Rust SDK #86. Призупинена чернетка не є підтримкою встановленого пакета.

Для Laravel workflow використовуйте вбудований приклад, для прямолінійного API worker — приклад PHP SDK, а для генераторів — довідник Python workflow. Перед розгортанням викликача перевірте оголошений підключеним runtime контракт сервісних операцій. Сам API керування клієнта не доводить підтримку workflow worker.

У PHP SDK міжпросторові виклики наразі використовують параметр масиву. Еквівалентний типізований параметр відстежується у PHP SDK #193.

Публікація цільової операції​

Цільовому namespace належать endpoint, сервіс, операція та worker обробника. Спочатку створіть namespace і запустіть worker, який реєструє цільовий тип workflow у вибраній черзі. Цей каталог використовує namespace billing, тип workflow billing.invoice і чергу billing.

Зміни каталогу потребують облікових даних адміністратора. Коли орендований workflow надсилає сервісну команду, runtime окремо перевіряє повноваження викликача.

curl --fail-with-body -X POST "$DURABLE_WORKFLOW_SERVER_URL/api/service-endpoints" \
-H "Authorization: Bearer $DW_ADMIN_TOKEN" \
-H "X-Namespace: billing" \
-H "X-Durable-Workflow-Control-Plane-Version: 2" \
-H "Content-Type: application/json" \
-d '{"endpoint_name":"billing"}'

curl --fail-with-body -X POST "$DURABLE_WORKFLOW_SERVER_URL/api/service-endpoints/billing/services" \
-H "Authorization: Bearer $DW_ADMIN_TOKEN" \
-H "X-Namespace: billing" \
-H "X-Durable-Workflow-Control-Plane-Version: 2" \
-H "Content-Type: application/json" \
-d '{"service_name":"invoices"}'

curl --fail-with-body -X POST "$DURABLE_WORKFLOW_SERVER_URL/api/service-endpoints/billing/services/invoices/operations" \
-H "Authorization: Bearer $DW_ADMIN_TOKEN" \
-H "X-Namespace: billing" \
-H "X-Durable-Workflow-Control-Plane-Version: 2" \
-H "Content-Type: application/json" \
-d '{"operation_name":"create","operation_mode":"sync","handler_binding_kind":"start_workflow","handler_target_reference":"billing.invoice","handler_binding":{"workflow_type":"billing.invoice","queue":"billing"},"deadline_policy":{"timeout_seconds":30}}'

Імена каталогу нормалізуються до нижнього регістру. Записи endpoint і сервісу організовують операцію, але не замінюють її справжнього обробника. Підтримуйте доступність сумісного worker у цільовому namespace. Реєстрація не доводить виконання роботи.

Очікування та записані результати​

PHP SDK за замовчуванням використовує mode_override=sync і wait_for=completed. Python використовує mode='sync' і wait_for='completed'. Обидва призупиняють виконання до довговічного кінцевого результату сервісу та відтворюють записаний результат або типізовану помилку в початковому місці виклику. Стан pending або started не є успішним бізнес-результатом.

Щоб чекати лише прийняття, PHP використовує wait_for='accepted' або mode_override='async'; Python підтримує wait_for='accepted', mode='async' і helper start_nexus_operation(). Зберігайте повернений id виклику для перевірки. Пізніше завершення не замінює початкове записане прийняття викликача. Якщо рішення workflow потребують результату цілі, вибирайте очікування завершення.

Обмежуйте виконання сервісу через deadline_policy каталогу, як вище. Політика приймає рівно одне поле: додатне ціле timeout_seconds або RFC3339 deadline_at із часовим зміщенням. Runtime записує один call_deadline_at від початкового прийняття. Replay, повторні спроби й пізніші зміни каталогу не можуть його скинути. Політика null не створює нового deadline сервісу.

Не використовуйте wait_timeout_seconds викликача як timeout виконання. Односекундний параметр очікування без deadline каталогу все ще може повернути результат цілі, яка завершується після трьох секунд. Після timeout перевірте початковий виклик і пов’язану ціль. Сплив часу не доводить відсутність зовнішніх ефектів, а скасування цілі є окремою політикою.

Помилки, повторні спроби та ідемпотентність​

PHP передає кінцеві результати помилок сервісу через ServiceOperationFailed; Python піднімає NexusOperationFailed у точці yield. Обробляючи помилку, зберігайте типізовані подробиці та id виклику. Очікувані бізнес-помилки може обробити код workflow; неочікувані можуть залишитися помилками workflow.

Runtime керує записаною політикою повторних спроб сервісу. Не додавайте другий цикл HTTP-повторів у код workflow. Для звичайних викликів PHP і Python створюють стабільні ключі. Якщо ключ задає застосунок, зберігайте ті самі ціль, запит і задуману операцію для повторів і replay. Новий ключ означає новий бізнес-запит, а не відновлення втраченої відповіді.

Для відкритих історій зберігайте стабільними цільовий namespace, трійку каталогу, payload і параметри очікування. Якщо довговічний намір змінюється, використовуйте гілку версії workflow.

Дотримання межі namespace​

Міжпросторовий параметр за замовчуванням — allow. Автентифікація, перевірки ролей, інші політики меж і авторизація namespace продовжують діяти. Ідентичність викликача походить від орендованого workflow; вхідні дані застосунку не можуть видати його за інший namespace.

Щоб самостійно розгорнутий PHP Server відмовляв у міжпросторових сервісних викликах, узгоджено налаштуйте й перезапустіть його ролі API/worker:

DW_SERVICE_BOUNDARY_CROSS_NAMESPACE_DEFAULT=deny

Політика відмовляє у міжпросторовому виклику до dispatch обробника. Виклики в межах одного namespace та інші політики меж також потрібно перевірити. Ця змінна не замінює облікові дані або ACL орендарів.

Перевірка початкового виклику​

Використовуйте API подробиць виклику й каталогу або перевірку сервісних викликів CLI. Зберігайте разом id workflow/run викликача та цільового сервісного виклику. Перевірка лише для читання не запитує нового виконання. Для перевірки втраченої відповіді або заміни worker використовуйте початковий id.