داتابەیس

چۆن ملیۆنان ڕیکۆرد بسڕیتەوە بەبێ ئەوەی Database داون ببێ ؟

نوسین و ئامادەکردنی

72 بینین

چۆن بەکارهێنانی Queue SQL کارایی بنکەی زانیاری (Database) بەرز دەکاتەوە؟

سڕینەوە یان نوێکردنەوەی بەکۆمەڵ (Mass Deletes and Updates) لەسەر خشتە گەورەکانی بنکەی زانیاری (Database) دەکرێت بێتە هۆی خاو بوونەوە، هێنانە خوارەوەی سیستەم یان تەنانەت Database Locking (کەوانەکردنی خشتەکان). لە پرۆژە گەورەکاندا، سڕینەوەی بەکۆمەڵی ملیۆنان ڕیکۆرد لە یەک کاتدا ڕاستەوخۆ دەبێتە هۆی فشارێکی زۆر لەسەر CPU و Memory.

لە کەپکی (Package) بەناوبانگی queue-sql دا کە بۆ فریمۆرکی لاڕاڤێل (Laravel) گەشەی پێدراوە، ڕێگەیەکی زۆر زیرەکانە پێشنیار دەکرێت: دابەشکردنی ئەرکە قورسەکان بەسەر بەشێکی زۆر لە Queue Job ئاساییدا تا بەیەکەوە و بەتەنیشت-بە-تەنیشت (Parallel) کاربکەن.

کێشەی سەرەکی چییە؟

کاتێک کۆدێکی لەم شێوەیە دەنووسیت لە لاڕاڤێلدا:

 
User::where('last_active_at', '<', now()->subYears(2))->delete();

ئەگەر ئەم داواکارییە 500,000 ڕیکۆرد بگەرێنێتەوە، SQL Server یان MySQL هەوڵدەدات هەموویان لە یەک Transaction دا بسڕێتەوە. ئەمەش دەبێتە هۆی:

  1. Locking: ڕاگرتنی خشتەکە بۆ کاتێکی درێژ، کە وا دەکات بەکارهێنەرانی تر نەتوانن کار بە سیستەمەکە بکن.

  2. High CPU/Memory Consumption: بەکارهێنانی سەرچاوەیەکی زۆری سێرڤەر.

  3. Timeout: شکستهێنانی داواکارییەکە لەبەر درێژەکێشانی کاتەکەی.

چارەسەر: بەکارهێنانی queue-sql

پاڵپشت بە بیرۆکەی دابەشکردن (Chunking)، پاکێجی queue-sql ڕێگەت پێدەدات بە ئاسانی پرۆسەی update یان delete دابەش بکەیت بەسەر چەندین جۆبی بچووکدا، و بنێردرێن بۆ ڕیزی ئەرکەکان (Laravel Queue System).

١. سڕینەوەی بەکۆمەڵ (Mass Delete) لە ڕێگەی Queue

لە شوێنی ئەوەی هەموو ڕیکۆردەکان لە یەک کاتدا بسڕیتەوە، دەتوانیت بەم شێوەیە کارەکە دابەش بکەیت:

use App\Models\User;

User::where('last_active_at', '<', now()->subYears(2))
    ->queueDelete(chunkSize: 1000);

چی روودەدات لە پشت پەردەوە؟

  • queryــەکە دابەش دەبێت بۆ چەندین جۆبی بچووک (پارچەی 1000ڕیکۆردی).

  • هەر جۆبێک دەچێتە ناو Queueـەوە.

  • Workerـەکان بە شێوازی Parallel ئەرکەکان جێبەجێ دەکەن، بەبێ ئەوەی خشتەی سەرەکی سێرڤەر بنکەی زانیاری بپچڕێنن.

٢. نوێکردنەوەی بەکۆمەڵ (Mass Update)

بە هەمان شێواز، دەتوانیت زانیاری ڕیکۆردەکان لە پاشبنەمادا (Background) نوێ بکەیتەوە:

 
use App\Models\Order;

Order::where('status', 'pending')
    ->where('created_at', '<', now()->subDays(30))
    ->queueUpdate([
        'status' => 'cancelled'
    ], chunkSize: 500);

ئەم کۆدە هەموو ئەو داواکارییانەی (Orders) زیاتر لە ٣٠ ڕۆژە هەڵپەسێردراون دەکات بە cancelled بەبێ ئەوەی کار بکاتە سەر خێرایی ماڵپەڕەکەت.

کەی ئەم تەکنیکە بەکاربهێنین؟

  • سڕینەوەی زانیاری کەلەپووری (Archiving/Cleanup): وەک پاککردنەوەی Logـە کۆنەکان، سڕینەوەی بەکارهێنەرە چالاکنەبووەکان.

  • نوێکردنەوەی ستوونەکان (Data Migration): کاتێک دەتەوێت فێڵدێکی نوێ تێکەڵ بکەیت بەسەر ملیۆنان ڕیکۆرددا.

  • سیستەمە گەورەکان (High Traffic Applications): ئەو شوێنانەی ڕاگرتنی Data تەنانەت بۆ بەشێک لە چۆنکەش (Lock) قبوڵکراو نییە.

ئەنجام و سودە سەرەکییەکان

خاڵی بەراورد ڕێگەی ئاسایی (Standard SQL) ڕێگەی Queue SQL
کات (Timeout) ئەگەری زۆرە تووشی Timeout ببێت ڕوونادات، چونكە جۆبەکان بچووکن
کاریگەری لەسەر بەکارهێنەر سیستەم خاو دەکاتەوە (Blocking) هیچ کاریگەرییەک لەسەر بەکارهێنەر نییە
تەنیشت-بە-تەنیشت (Parallelism) تەنها ۱ کاری پێدەکرێت بەپێی ژمارەی Worker دەتوانێت چەندین جۆب ئەنجام بدات

کورتەی بابەت

سڕینەوە و نوێکردنەوەی زانیاری بەکۆمەڵ پێویستی بە وشیاریی هەیە. بەکارهێنانی تەکنیکی دابەشکردن بۆ جۆبی تەنیشت-بە-تەنیشت لە لاڕاڤێلدا ڕێگەیەکی زۆر بەهێزە بۆپاراستنی سەقامگیری و کارایی (Performance) بنکەی زانیارییەکەت.

ئەگەر پرۆژەکەت ڕووبەڕووی داتای گەورە (Big Data) دەبێتەوە، ئەم پاکێجە دەبێتە یەکێک لە ئامرازە سەرەکییەکانت لە لاڕاڤێلدا.

 

🔗 دەتەوێت زیاتر لەسەر ئەم پاکێجە بزانیت؟

دەتوانیت زانیاری زیاتر لەسەر ئەم پاکێجە وەربگریت، ڕێنما تەواوەکانی دامەزراندنی (Installation) ببینیت، و کۆدی سەرچاوەکەی (Source Code) بپشکنیت لە ڕێگەی سەردانیکردنی ڕیپۆزیتۆری queue-sql لە GitHub.

ئەم بابەتە سوودی هەبوو؟ بیری مەکە بڵاوی بکەیتەوە