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