الطائرة الورقية عبارة عن بديل لـ Redis تم تصميمه لتقديم أداء أفضل بكثير باستخدام خوادم أقل بكثير. يمكن لعقدة واحدة إتمام ملايين الاستعلامات في الثانية وتخزين ما يصل إلى 1 تيرابايت من البيانات في الذاكرة. في هذه المقالة، سنستكشف كيفية استخدام الطائرة الورقية مع لارافيل، واحدة من أكثر إطارات الويب استخدامًا وشهرة.
تحافظ الطائرة الورقية على التوافق الكامل مع واجهة Redis، مما يعني أن مطوري لارافيل يمكن دمجها كسائق ذاكرة مؤقتة وطابور دون تغيير في السطر البرمجي واحد. يمكن أن يقدم هذا التكامل السلس مسار ترقية بدون جهد بمنفعة كبيرة.
لذا، سواء كنت محترفًا في لارافيل أو بدأت للتو، انضم إلينا وندخل عالم الطائرة الورقية ولارافيل.
البدء
لنبدأ بإعداد مثيل جديد من الطائرة الورقية. تفضلوا الوثائق الخاصة بنا هنا لتنزيل الصورة أو الملف الثنائي وامتلاك مثيل للطائرة الورقية يعمل في وقت قصير. بمجرد تشغيل مثيل الطائرة الورقية والوصول إليه، يكون دمجه مع مشروع لارافيل أمرًا سهلاً. لحسن الحظ، لدى لارافيل دعم كامل لـ Redis، لذا يمكن إعادة استخدام جميع سائقيها. لاستخدام الطائرة الورقية في تطبيق لارافيل الخاص بك، يمكنك بدء تحديث ملف .env
بالإعدادات التالية.
للتخزين المؤقت وإدارة الجلسات:
CACHE_DRIVER=redis
SESSION_DRIVER=redis
لدمج الطائرة الورقية كسائق طابور أيضًا:
QUEUE_CONNECTION=redis
على الرغم من استخدام redis
كقيمة للسائق، يتم تصميم Dragonfly ليكون بديلًا مباشرًا لـ Redis، لذا لا يلزم تثبيت بديل سائق إضافي. بعد تحديد السائق، الخطوة التالية هي التأكد من أن Laravel يمكنه التواصل مع مثيل Dragonfly. وهذا يتطلب تحديث ملف .env
مرة أخرى بتفاصيل الاتصال الصحيحة:
REDIS_HOST
: اسم المستخدم أو عنوان IP لخادم Dragonfly.REDIS_PORT
: المنفذ الذي يعمل عليه مثيل Dragonfly.REDIS_PASSWORD
: كلمة المرور لمثيل Dragonfly، إذا تم تعيينها.
فيما يلي مثال على التكوين:
REDIS_HOST=127.0.0.1 # Replace with Dragonfly host
REDIS_PORT=6379 # Replace with Dragonfly port
REDIS_PASSWORD=null # Replace with Dragonfly password if applicable
بعد تحديث هذه الإعدادات، تأكد من الاتصال عن طريق تشغيل عملية بسيطة مثل INFO
في Laravel. إذا واجهت أي مشاكل في الاتصال، تحقق مرة أخرى من قيمة المضيف والمنفذ وكلمة المرور. أيضًا، تأكد من أن خادم Dragonfly يعمل ويمكن الوصول إليه من بيئة تطبيق Laravel.
use Illuminate\Support\Facades\Redis;
// اجراء أمر INFO وطباعة الإصدار من Dragonfly.
Redis::info()["dragonfly_version"];
الكفاءة العالية كمكثف
تخزين القيم التي يتم الوصول إليها بشكل متكرر هو إحدى الاستخدامات الرئيسية لقواعد البيانات المؤقتة في الذاكرة مثل Dragonfly وRedis بسبب أوقات استجابتها السريعة. هذا هو المكان الذي يتميز فيه Dragonfly، خاصة في سيناريوهات تتضمن عددًا كبيرًا من المفاتيح والعملاء، وهو أمر شائع كمكثف أساسي لأنظمة متعددة العقد أو الواجهات الأخرى.
A standout feature of Dragonfly is the cache mode, designed specifically for scenarios where maintaining a lean memory footprint is as crucial as performance. In this mode, Dragonfly evicts the least recently accessed values when it detects low memory availability, ensuring efficient memory usage without sacrificing speed. You can read more about the eviction algorithm in the Dragonfly Cache Design blog post.
تفعيل وضع التخزين المؤقت سهل. فيما يلي الأعلام التي ستستخدمها لتشغيل Dragonfly في هذا الوضع، مع حد ذاكرة قدره 12 جيغابايت:
./dragonfly --cache_mode --maxmemory=12G
في سيناريو تحتاج تطبيقك للتعامل مع حجم كبير من الطلبات مع مجموعة بيانات شاسعة، يمكن لوضع ذاكرة التخزين المؤقت Dragonfly إدارة استخدام الذاكرة بفعالية مع توفير الوصول السريع للبيانات، مما يضمن أن تطبيقك يبقى مستجيبًا وسريع التفاعل.
من حيث الواجهة التطبيقية، يجب دعم جميع وظائف ميدان Laravel Cache. على سبيل المثال، لتخزين مفتاح وقيمة مع فترة صلاحية محددة، يمكن استخدام المقطع التالي:
use Illuminate\Support\Facades\Cache;
// تخزين قيمة مع فترة صلاحية 10 دقائق.
Cache::put("key", "value", 600);
استخدام الذاكرة
إحدى مزايا استخدام Dragonfly كذاكرة التخزين المؤقت هي استخدام الذاكرة أقل بشكل ملموس لمعظم الاستخدامات. دعونا نجري تجربة بسيطة ونملأ كل من Redis وDragonfly بسلاسل عشوائية، ونقيس استخدامهما الإجمالي للذاكرة بعد ملء بياناتهما.
Dataset | Dragonfly | Redis |
---|---|---|
3 Million Values of Length 1000 | 2.75GB | 3.17GB |
15 Million Values of Length 200 | 3.8GB | 4.6GB |
بعد إجراء التجربة، لاحظنا أن استخدام ذاكرة Dragonfly يكون أقل بنسبة تصل إلى 20٪ مقارنة بـ Redis تحت ظروف مماثلة. هذا يسمح لك بتخزين كمية أكبر بكثير من البيانات المفيدة مع المتطلبات نفسها في الذاكرة، مما يجعل التخزين المؤقت أكثر فعالية ويحقق تغطية أعلى. يمكنك قراءة المزيد حول مقاييس سرعة Dragonfly واستخدام الذاكرة في مقالة مقارنة Redis وDragonfly في القابلية للتوسع والأداء.
التصوير المباشر
علاوة على استخدام الذاكرة المنخفض، يظهر Dragonfly أيضًا استقرارًا خلال عمليات التّعريف على اللّمس. إنّ التّعريف على اللّمس، وخاصّةً في الحالات المشغولة، يمكن أن تكون تحدّيًا من حيث إدارة الذاكرة. مع Redis، قد يؤدّي التقاط لمسة على حالة نشاط عالي إلى ارتفاع استخدام الذاكرة. ويحدث ذلك لأنّ Redis بحاجة إلى نسخ صفحات الذاكرة، حتى تلك التي قد تمّ تحديثها جزئيًا، ممّا يؤدّي إلى ارتفاع في استخدام الذاكرة.
على النّقيض من ذلك، يعدّل Dragonfly ترتيب التّعريف على اللّمس بناءً على الطّلبات الواردة، ممّا يمنع أيّ ارتفاعات غير متوقّعة في استخدام الذاكرة. وهذا يعني أنه حتى خلال عمليات شديدة الحجم مثل التّعريف على اللّمس، يحافظ Dragonfly على ب footprint ذاكرة مستقر، مؤكّدًا الأداء المتناغم دون مخاطر تداعيات ذاكرة مفاجئة. يمكنك قراءة المزيد حول خوارزمية تعريف Dragonfly على اللّمس في مقالة التوازن مقابل عدم التوازن.
العصابة الرئيسية
يقدّم Dragonfly أيضًا ميزة جديدة بواسطة أمره المخصص STICK
. يصبح هذا الأمر خاصّة مفيدة في الحالات التي تعمل في وضع التخزين المؤقّت. فهو يسمح بتحديد مفاتيح معيّنة كغير قابلة للتخليص، بغضّ النظر عن تكرار الوصول إليها.
هذه الوظيفة مفيدة بشكل خاص لتخزين البيانات الهامة التي لا يتم الوصول إليها في كثير من الأحيان. على سبيل المثال، يمكنك الاحتفاظ بشكل موثوق بالمعلومات التبويبية، مثل قيم التكوين الديناميكي، مباشرة على مثيل Dragonfly. هذا يتغلب على الحاجة إلى مستودع بيانات منفصل للبيانات القليلة الاستخدام ولكن الحيوية، مما يحسن عملية إدارة البيانات.
// تخزين قيمة في مثيل Dragonfly مع التماسك.
Redis::transaction(function (Redis $redis) {
$redis->set('server-dynamic-configuration-key', '...');
$redis->command('STICK', 'server-dynamic-configuration-key');
});
// ...
// سيعود دائمًا قيمة لأن المفتاح لا يمكن طرده.
$redis->get('server-dynamic-configuration-key');
زيادة المعدل التنافسي في إدارة الطابور
Dragonfly، مثل Redis، متمرس في إدارة الطوابير والمهام. قد تكون قد خمنت بالفعل، التحول إلى استخدام Dragonfly لهذا الغرض هو سلس، لا يتطلب تعديلات الكود. ضع في اعتبارك المثال التالي في Laravel، حيث يتم توجيه مهمة تحويل ملف البودكاست:
use App\Jobs\ProcessPodcast;
$podcast = Podcast::create(/* ... */);
ProcessPodcast::dispatchSync($podcast);
كل من Dragonfly و Redis قادران على التعامل مع عشرات الآلاف من المهام في الثانية بكل سهولة.
بالنسبة للمتطلعين إلى تعظيم الأداء، من المهم أن نلاحظ أن استخدام طابور مهمة واحدة لن يحقق مكاسب أداء كبيرة. لاستغلال قدرات Dragonfly حقًا، يجب استخدام طوابير متعددة. هذا الأسلوب يوزع العبء عبر خيوط Dragonfly متعددة، مما يحسن المعدل التنافسي الإجمالي.
ومع ذلك، تنشأ تحديًا شائعًا عندما تنتهي المفاتيح من نفس الطابور على خيوط مختلفة، مما يؤدي إلى زيادة في التأخر. لمكافحة هذا، يوفر دراجونفل استخدام الهاشتاجات في اسماء الطوابير. تضمن هذه الهاشتاجات أن المهام في نفس الطابور (الذي يستخدم نفس الهاشتاغ) تُعين تلقائيًا إلى خيوط محددة، مثلما هو الحال في بيئة كلاستر إريديس، مما يقلل التأخر ويحسن الأداء. لمعرفة المزيد عن الهاشتاجات، تحقق من موضوع المدونة حول تشغيل BullMQ مع دراجونفل، الذي يحتوي على توضيح شامل للهاشتاجات وفوائدها، بينما يُستخدم دراجونفل كمخزن خلفي لأنظمة طابور الرسائل.
كمثال سريع، لتحسين إدارة طوابيرك مع دراجونفل، ابدأ ببدء دراجونفل بأعلام محددة تمكن من القفل المبني على الهاشتاجات ووضع الكلاستر المحاكي:
./dragonfly --lock_on_hashtags --cluster_mode=emulated
بمجرد تشغيل دراجونفل بهذه الإعدادات، ضع الهاشتاجات في اسماء طوابيرك في لارافيل. إليك مثالًا:
ProcessPodcast::dispatch($podcast)->onQueue('{podcast_queue}');
باستخدام الهاشتاجات في اسماء الطوابير، تضمن أن جميع الرسائل التي تنتمي إلى نفس الطابور تُعالج بنفس الخيط في دراجونفل. هذا الأسلوب لا يحتفظ فقط بالرسائل المتعلقة ببعضها البعض، مما يحسن الكفاءة، بل يسمح أيضًا لدراجونفل بتحقيق أقصى قدر من النتاجية عن طريق توزيع طوابير مختلفة عبر خيوط متعددة.
يتمثل هذا الطريق في أنه أكثر فعالية للأنظمة التي تعتمد على Dragonfly كمخزن لطرفية الرسائل، حيث يستفيد من بنية Dragonfly المتعددة الموضوعات للتعامل مع حجم أكبر من الرسائل بكفاءة أعلى.
الخاتمة
قدرة Dragonfly على التعامل مع حجم كبير من العمليات باستخدام ذاكرة أقل وبنيتها المتعددة الموضوعات تجعلها خيارًا جذابًا للتطبيقات الويب الحديثة. خلال هذه المقالة، قمنا باستكشاف كيفية دمج Dragonfly بشكل سلس مع Laravel، مع الحاجة إلى تغييرات في الكود أقل ما يمكن، سواء كان ذلك للتخزين المؤقت، إدارة الجلسات، أو إدارة الطوابير.
Source:
https://dzone.com/articles/using-laravel-with-dragonfly