Мікросервіси
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 отримує ці завдання, виконує їх і повертає результати. Рушій координує передавання через спільну базу даних.