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

Мікросервіси

Workflow можуть охоплювати кілька застосунків Laravel. Один застосунок визначає workflow, інший — activity. Обидва використовують спільні базу даних і чергу, кожен запускає власний процес queue:work.

Спільні база даних і черга​

Налаштуйте обидва застосунки на ту саму базу даних і чергу Redis:

// config/database.php — add to both apps

'connections' => [
'shared' => [
'driver' => 'mysql',
'host' => env('SHARED_DB_HOST', '127.0.0.1'),
'port' => env('SHARED_DB_PORT', '3306'),
'database' => env('SHARED_DB_DATABASE', 'workflows'),
'username' => env('SHARED_DB_USERNAME', 'root'),
'password' => env('SHARED_DB_PASSWORD', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
],
],
// config/queue.php — add to both apps

'connections' => [
'shared' => [
'driver' => 'redis',
'connection' => env('SHARED_REDIS_QUEUE_CONNECTION', 'default'),
'queue' => env('SHARED_REDIS_QUEUE', 'default'),
'retry_after' => 90,
'block_for' => null,
'after_commit' => false,
],
],

Запускайте міграції лише з одного застосунку:

php artisan migrate

Якщо застосунки використовують інше з’єднання з базою даних, ніж default, дивіться з’єднання з базою даних, щоб спрямувати моделі до спільного з’єднання.

Визначення workflow й activity​

Зареєструйте ключі типів, щоб рушій міг маршрутизувати завдання за назвою:

// App A (workflow service) — config/workflows.php

'v2' => [
'types' => [
'workflows' => [
'order-processing' => App\Workflows\OrderWorkflow::class,
],
'activities' => [],
],
],
// App B (activity service) — config/workflows.php

'v2' => [
'types' => [
'workflows' => [],
'activities' => [
'charge-payment' => App\Activities\ChargePaymentActivity::class,
],
],
],

Workflow планує activity за ключем типу:

// App A — app/Workflows/OrderWorkflow.php

use function Workflow\V2\activity;
use Workflow\V2\Workflow;

class OrderWorkflow extends Workflow
{
public ?string $connection = 'shared';
public ?string $queue = 'workflows';

public function handle(int $orderId): array
{
$charge = activity('charge-payment', $orderId);
return ['order' => $orderId, 'charge' => $charge];
}
}
// App B — app/Activities/ChargePaymentActivity.php

use Workflow\V2\Activity;

class ChargePaymentActivity extends Activity
{
public ?string $connection = 'shared';
public ?string $queue = 'activities';

public function handle(int $orderId): string
{
return "charged-{$orderId}";
}
}

Запуск worker​

Кожен застосунок запускає worker черги на власній черзі:

# App A
php artisan queue:work shared --queue=workflows

# App B
php artisan queue:work shared --queue=activities

Worker застосунку A відтворює workflow та планує завдання activity. Worker застосунку B отримує ці завдання, виконує їх і повертає результати. Рушій координує передавання через спільну базу даних.