قوائم المهام لـ Kotlin: من Coroutines إلى الحلول المتقدمة
في التطوير الحديث باستخدام Kotlin، تلعب قوائم المهام (task queues) دورًا رئيسيًا في بناء تطبيقات سريعة الاستجابة وقابلة للتوسع. بغض النظر عما إذا كنت تقوم بإنشاء تطبيق خادم باستخدام Ktor، أو تطبيق جوال لنظام Android، أو حل سطح مكتب باستخدام Compose، فإن فهم آليات المعالجة غير المتزامنة للمهام هو مهارة أساسية. في هذه المقالة، سنستعرض الأدوات والمكتبات والأنماط الرئيسية للعمل مع قوائم المهام في Kotlin.
1. الأدوات المدمجة: Kotlin Coroutines
أول ما يجب البدء به هو Kotlin Coroutines. فهي توفر خيوطًا خفيفة (coroutines) وقوائم مدمجة عبر القنوات (Channel) والموزعين (Dispatcher).
مثال أساسي لقائمة انتظار على القنوات:
import kotlinx.coroutines.*import kotlinx.coroutines.channels.Channel
fun main() = runBlocking { val channel = Channel<String>(capacity = 10) // قائمة انتظار مخزنة
// المنتج launch { repeat(5) { channel.send("المهمة رقم ${it + 1}") delay(100) } channel.close() }
// المستهلك launch { for (task in channel) { println("جارٍ معالجة: $task") delay(200) } }}يسمح هذا النمط بإنشاء قوائم انتظار بسيطة بمستهلك واحد أو عدة مستهلكين. ومع ذلك، بالنسبة للسيناريوهات المعقدة (الأولويات، إعادة تشغيل المهام الفاشلة، المراقبة)، هناك حاجة إلى مكتبات متخصصة.
2. KJob — مكتبة للمهام الخلفية
KJob (Kotlin Job Queue) هي مكتبة خفيفة لإدارة المهام الخلفية مع دعم الأولويات، وإعادة المحاولة، وتتبع الحالة. وهي مبنية فوق coroutines ومناسبة تمامًا لتطبيقات Android والخوادم.
التثبيت (Gradle):
dependencies { implementation("com.github.kjob:kjob:0.6.0")}مثال على الاستخدام:
import com.github.kjob.*import kotlinx.coroutines.runBlocking
fun main() = runBlocking { val queue = KJobQueue()
// إضافة مهام بأولوية queue.add(KJob("أولوية-عالية") { println("المهمة الهامة قيد التنفيذ") }.priority(10))
queue.add(KJob("أولوية-منخفضة") { println("المهمة غير الهامة قيد التنفيذ") }.priority(1))
// بدء المعالجة queue.processAll()}يدعم KJob:
- الأولويات — يتم تنفيذ المهام ذات الأولوية العالية أولاً.
- إعادة المحاولة — إعادة تشغيل تلقائية عند حدوث أخطاء.
- المهلات الزمنية — تحديد وقت التنفيذ.
- أحداث دورة الحياة — يمكن الاشتراك في البداية، الإكمال، الخطأ.
3. KQueue — قوائم الانتظار الموزعة
إذا كنت بحاجة إلى قائمة انتظار مهام موزعة (على سبيل المثال، للخدمات المصغرة)، فانظر إلى KQueue. هذه مكتبة للعمل مع قوائم الانتظار عبر Redis أو Kafka، مكتوبة بلغة Kotlin الخالصة.
مثال مع Redis:
import com.kqueue.*import io.lettuce.core.RedisClient
fun main() { val client = RedisClient.create("redis://localhost") val queue = KQueue(client)
// إرسال مهمة queue.push("orders", "معالجة الطلب #123")
// استهلاك المهام queue.poll("orders") { task -> println("تم استلام المهمة: ${task.body}") // المعالجة... task.ack() // تأكيد التنفيذ }}يوفر KQueue:
- تسليم مضمون (at-least-once).
- موازنة الحمل بين عمليات العمل.
- دعم المهام المؤجلة (scheduled tasks).
- المراقبة عبر مقاييس Prometheus.