Блокування одночасних викликів

← Блокування одночасних викликів

Ashterix

docs: rewrite JsonRpcBundle docs, add SDK docs, move them under docs/api

uk/docs/api/json-rpc-bundle/add_rpc_service/lock.md новий файл +50 −0

1 + ## Summary
2 +
3 + | | |
4 + | --- | --- |
5 + | **Classname** | `Lock` |
6 + | **Namespace** | `Ufo\RpcObject\RPC` |
7 + | **Target** | method |
8 +
9 + ```php
10 + public function __construct(
11 + public ?string $paramName = null,
12 + public ?int $ttl = null,
13 + )
14 + ```
15 +
16 + # Блокування одночасних викликів
17 +
18 + Деякі методи не можна виконувати паралельно: оплата одного замовлення, генерація звіту, синхронізація з зовнішньою системою. Атрибут `#[RPC\Lock]` не дає запустити метод, поки попередній виклик ще виконується.
19 +
20 + ```php
21 + use Ufo\RpcObject\RPC;
22 +
23 + #[RPC\Lock(paramName: 'orderId', ttl: RPC\Lock::T_10_SECOND)]
24 + public function pay(string $orderId): bool
25 + {
26 + // ...
27 + }
28 + ```
29 +
30 + * `paramName` — блокування окремо для кожного значення параметра: два виклики `pay` з різними `orderId` виконуються одночасно, з однаковим — ні. Без `paramName` метод блокується цілком, незалежно від аргументів.
31 + * `ttl` — час життя блокування в секундах, щоб воно не лишилося назавжди, якщо процес впав. Константи: `T_SECOND`, `T_2_SECOND`, `T_5_SECOND`, `T_10_SECOND`, `T_20_SECOND`, `T_30_SECOND`.
32 +
33 + Блокування захоплюється перед виконанням методу (подія `rpc.pre_execute`) і звільняється після нього, зокрема при помилці. Захоплення блокувальне (`acquire(true)`): паралельний виклик з тим самим ключем чекає, доки блокування звільниться. Якщо сховище блокувань повідомляє про конфлікт, виклик завершується помилкою:
34 +
35 + ```json
36 + {
37 + "jsonrpc": "2.0",
38 + "id": 1,
39 + "error": {
40 + "code": -32400,
41 + "message": "Method 'Order.pay' is locked."
42 + }
43 + }
44 + ```
45 +
46 + :::warning subtitle="Відома нестиковка"
47 + У поточній версії конфлікт не перетворюється на помилку: паралельний виклик чекає звільнення блокування. Деталі й обхідний шлях — у розділі [Актуальні помилки](/docs/api/json-rpc-bundle/developers/known_issues/open).
48 + :::
49 +
50 + Блокування реалізоване на [Symfony Lock](https://symfony.com/doc/current/components/lock.html); для нього потрібне розширення `ext-sysvsem`.