انسَ الاستعلام الدائم: مرحبًا بأحداث مرسلة من الخادم في Kotlin
\n\nتخيل: تفتح محطة تداول أسهم، وتتحديث الأسعار تلقائيًا. أو تدخل إلى لوحة تحكم الموقع، وتجد تغذية حية لعدد المستخدمين المتصلين. لا أزرار "تحديث"، ولا طلبات لا نهائية للخادم. مجرد تدفق بيانات يتدفق في الوقت الفعلي.
\n\nفي عالم تطوير الويب، يتم التعامل مع هذا بواسطة أحداث مرسلة من الخادم (SSE) — بروتوكول يسمح للخادم بإرسال البيانات إلى العميل تلقائيًا عبر اتصال HTTP واحد. واليوم سأوضح كيفية تنفيذ SSE في Kotlin باستخدام إطار العمل Ktor. لن تكون نظرية جافة، بل مثالًا عمليًا كاملاً من الخادم إلى العميل.
\n\nما هي الأحداث المرسلة من الخادم ولماذا هي رائعة؟
\n\nمنذ زمن بعيد، للحصول على بيانات حديثة، كان المطورون يستخدمون الاستعلام الدوري (polling). كان العميل يتصل بالخادم كل N ثانية: "هل هناك أخبار؟". كان الخادم يرد: "لا". وهكذا في حلقة مفرغة. هذا غير فعال بشكل كبير: 99% من الطلبات فارغة، والخادم يهدر الموارد في معالجة اتصالات غير ضرورية.
\n\nيحل SSE المشكلة بشكل جذري: يفتح العميل اتصالًا واحدًا، ويقوم الخادم بإرسال البيانات بنفسه عند ظهورها. إنه مثل الاشتراك في الأخبار — تنتظر فقط، ويتم توصيل العدد الجديد إليك.
\n\nمزايا الأحداث المرسلة من الخادم في Kotlin:
\n- \n
- البساطة — تعمل عبر HTTP العادي، ولا تتطلب مكتبات إضافية على العميل (باستثناء EventSource المدمج في المتصفح). \n
- الاسترداد التلقائي — إذا انقطع الاتصال، سيعيد المتصفح الاتصال تلقائيًا. \n
- توفير الموارد — اتصال واحد بدلاً من عشرات الاتصالات. \n
- دعم أصلي في Kotlin — مع Ktor و coroutines، كتابة خادم SSE هي متعة. \n
العيب الرئيسي؟ SSE هي قناة أحادية الاتجاه (فقط من الخادم إلى العميل). إذا كنت بحاجة إلى اتصال ثنائي الاتجاه، فانظر نحو WebSocket. ولكن للإشعارات، وتغذية الأخبار، وأسعار الأسهم، والمراقبة — SSE مثالي.
\n\nمتى يجب استخدام SSE في مشروعك Kotlin؟
\n\n- \n
- تغذية الإشعارات — رسائل جديدة، تعليقات، إعجابات. \n
- المراقبة والسجلات — تدفق سجلات الخادم في الوقت الفعلي. \n
- بيانات التداول — تحديث أسعار العملات، الأسهم، العملات الرقمية. \n
- تقدم تنفيذ المهام — تقرير عن تحميل ملف أو معالجة بيانات. \n
- أنظمة الإنذار — إشارات الطوارئ، حالات الأجهزة. \n
إذا كنت تبحث عن طريقة لنقل التحديثات من الخادم إلى العميل دون صداع — SSE Kotlin هو خيارك. دعنا ننتقل إلى الكود.
\n\nإعداد المشروع: Ktor + SSE
\n\nللبدء، سننشئ مشروع Ktor جديد. سأستخدم Gradle Kotlin DSL. في ملف build.gradle.kts نضيف التبعيات:
val ktor_version = "2.3.7"\n\ndependencies {\n implementation("io.ktor:ktor-server-core:$ktor_version")\n implementation("io.ktor:ktor-server-netty:$ktor_version")\n implementation("io.ktor:ktor-server-content-negotiation:$ktor_version")\n implementation("io.ktor:ktor-serialization-kotlinx-json:$ktor_version")\n implementation("ch.qos.logback:logback-classic:1.4.14")\n implementation("io.ktor:ktor-server-cors:$ktor_version")\n}\n\nلاحظ: لسنا بحاجة إلى مكتبة منفصلة لـ SSE — يدعم Ktor نقل البيانات المتدفقة بشكل مدمج عبر coroutines.
\n\nإنشاء نقطة نهاية SSE
\n\nالآن الجزء الممتع — سنكتب خادمًا يرسل أحداثًا للعميل كل ثانيتين. سيكون هذا محاكاة لأسعار التداول.
\n\nimport io.ktor.server.application.*\nimport io.ktor.server.engine.*\nimport io.ktor.server.netty.*\nimport io.ktor.server.response.*\nimport io.ktor.server.routing.*\nimport kotlinx.co