Обробка синхронізації процесів за допомогою Laravel Cache Lock

0
Перекладено ШІ
Оригінал: Laravel News
Оновлено: 17 січня, 2025
У статті розглядається функціональність системи блокування кешу в Laravel, яка допомагає уникати конфліктів при обробці одночасних операцій. Дізнайтеся, як налаштувати розподілені блоки для захисту ваших процесів від умов гонки та забезпечення цілісності даних у вашій аплікації

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

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

use Illuminate\Support\Facades\Cache;

$lock = Cache::lock('process-payment', 120);

if ($lock->get()) {
    // Безпечно обробити платіж
    // Блокування автоматично знімається через 120 секунд
}

Ось практичний приклад обробки вебхуків із використанням блокувань:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Cache;
use App\Jobs\ProcessWebhook;

class WebhookController extends Controller
{
    public function handle(Request $request)
    {
        $webhookId = $request->input('webhook_id');
        $lockName = "webhook-{$webhookId}";

        $lock = Cache::lock($lockName, 60);

        try {
            if (!$lock->get()) {
                Log::info("Webhook {$webhookId} вже обробляється");
                return response()->json([
                    'message' => 'Webhook обробляється'
                ], 409);
            }

            // Початкова валідація
            $this->validateWebhook($request);

            // Виклик обробної роботи з інформацією про блокування
            ProcessWebhook::dispatch(
                $request->all(),
                $lock->owner()
            )->onQueue('webhooks');

            return response()->json([
                'message' => 'Webhook прийнято для обробки',
                'processing_id' => $lock->owner()
            ]);

        } catch (Exception $e) {
            $lock?->release();
            throw $e;
        }
    }
}

class ProcessWebhook implements ShouldQueue
{
    public function __construct(
        private array $payload,
        private string $lockOwner
    ) {}

    public function handle()
    {
        $lock = Cache::restoreLock(
            "webhook-{$this->payload['webhook_id']}",
            $this->lockOwner
        );

        try {
            // Безпечно обробити вебхук, знаючи, що у нас є блокування
            $this->processWebhookPayload();

        } finally {
            // Завжди зняти блокування після завершення
            $lock->release();
        }
    }
}

Блокування кешу в Laravel забезпечують надійний спосіб обробки синхронізації процесів, гарантуючи, що ваша програма підтримує цілісність даних навіть під час роботи з одночасними операціями.

Популярні

Logomark Logotype

Використання штучного інтелекту для управління перекладами в Laravel

Досліджуйте нові можливості локалізації вашого Laravel-додатку з пакунками, які використовують штучний інтелект, такими як ChatGPT та Claude. Які рішення можуть спростити ваш процес перекладу та зробити його більш точним? Читайте далі, щоб дізнатися більше!

Logomark Logotype

4 поширені помилки Vite у Laravel

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

Logomark Logotype

Журнал аудиту в Laravel

Хочете забезпечити повну прозорість у своїх Laravel-додатках? Пакет Laravel Audit Log допоможе вам детально відстежувати всі зміни моделей Eloquent та відповідати вимогам регуляторів. Читайте далі, щоб дізнатися, як цей потужний інструмент може підвищити надійність вашого проєкту