جلوگیری از همزمانی فرایند ها با Cache Locks

وقتی داریم یه پروژه رو کدنویسی می‌کنیم در مدیریت فرایند همزمان (concurrent operations) خیلی باید حواسمون باشه باشه با هم تداخل نداشته باشند.
Cache لارول آمده و یه سیستم خیلی کارامد و باحال برای این کار آماده کرده که با هم قراره ببینم چطوری کار می‌کنه. 😁

سیستم Cache lock به شما امکان می‌دهد قفل‌های توزیع‌شده ایجاد کنید؛ به این معنی که این قفل‌ها در سرورها، فرآیندها و queue worker های مختلف کار می‌کنند و همین ویژگی آن‌ها را برای جلوگیری از race condition ها در سیستم‌های توزیع‌شده ایده‌آل می‌سازد.

[!NOTE] قفل‌های توزیع‌شده (Distributed Locks)
قفل‌های توزیع‌شده رو میشه اینطور توضیح داد که وقتی چندین سرور یا فرآیند می‌خوان به یه منبع مشترک مثل دیتابیس یا کش دسترسی داشته باشن، ممکنه باعث بروز مشکلاتی بشه چون همزمان چند تا درخواست ممکنه تغییرات مشابهی رو اعمال کنن. اینجاست که قفل‌های توزیع‌شده وارد می‌شن. این قفل‌ها کاری می‌کنن که فقط یک فرآیند در یه زمان مشخص بتونه به منبع دسترسی داشته باشه و از بروز مشکلاتی مثل race condition جلوگیری می‌کنه. به این ترتیب، مطمئن می‌شیم که چند فرآیند به طور همزمان با هم درگیر تغییرات روی یه منبع نمی‌شن.

یک مثال عملی برای مدیریت پردازش وب‌هوک‌ها با قفل‌ها به شکل زیر است:

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Cache;
use Illuminate\Http\Request;

class WebhookController extends Controller
{
    public function handle(Request $request)
    {
        // شناسه وب‌هوک برای ایجاد قفل منحصر به فرد
        $webhookId = $request->input('webhook_id');
        $lockName = "webhook-{$webhookId}";

        // قفل کش برای جلوگیری از پردازش همزمان
        $lock = Cache::lock($lockName, 60); // قفل 60 ثانیه‌ای

        // اگر قفل گرفته نشد، به این معنی است که در حال حاضر پردازش در حال انجام است
        // در واقع اگر توی خط بالا false بده یعنی از قبل رزرو شده 
        if (!$lock->get()) {
            return response()->json([
                'message' => 'Webhook is already being processed'
            ], 409); // وضعیت 409 برای تداخل
        }

        try {
            // انجام پردازش وب‌هوک
            $this->processWebhook($request);

            return response()->json([
                'message' => 'Webhook processed successfully'
            ]);
        } finally {
            // آزادسازی قفل بعد از اتمام پردازش
            $lock->release();
        }
    }

    // متد پردازش وب‌هوک
    private function processWebhook(Request $request)
    {
        // پردازش اطلاعات وب‌هوک
        // مثلاً ذخیره داده‌ها در پایگاه داده
    }
}Code language: PHP (php)

قفل‌های کش لاراول یک روش قابل اعتماد برای مدیریت همزمانی فرآیندها فراهم می‌کنند، به طوری که از یکپارچگی داده‌ها در زمان برخورد با عملیات هم‌زمان اطمینان حاصل می‌شود.

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *