أحداث مرسلة من الخادم (Server-Sent Events) في Kotlin: كيفية جعل تدفق البيانات بسيطًا وسريعًا

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

انسَ الاستعلام الدائم: مرحبًا بأحداث مرسلة من الخادم في 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
\n\n

العيب الرئيسي؟ SSE هي قناة أحادية الاتجاه (فقط من الخادم إلى العميل). إذا كنت بحاجة إلى اتصال ثنائي الاتجاه، فانظر نحو WebSocket. ولكن للإشعارات، وتغذية الأخبار، وأسعار الأسهم، والمراقبة — SSE مثالي.

\n\n

متى يجب استخدام SSE في مشروعك Kotlin؟

\n\n
    \n
  • تغذية الإشعارات — رسائل جديدة، تعليقات، إعجابات.
  • \n
  • المراقبة والسجلات — تدفق سجلات الخادم في الوقت الفعلي.
  • \n
  • بيانات التداول — تحديث أسعار العملات، الأسهم، العملات الرقمية.
  • \n
  • تقدم تنفيذ المهام — تقرير عن تحميل ملف أو معالجة بيانات.
  • \n
  • أنظمة الإنذار — إشارات الطوارئ، حالات الأجهزة.
  • \n
\n\n

إذا كنت تبحث عن طريقة لنقل التحديثات من الخادم إلى العميل دون صداع — SSE Kotlin هو خيارك. دعنا ننتقل إلى الكود.

\n\n

إعداد المشروع: Ktor + SSE

\n\n

للبدء، سننشئ مشروع Ktor جديد. سأستخدم Gradle Kotlin DSL. في ملف build.gradle.kts نضيف التبعيات:

\n\n
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\n
import 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                

المدونات

توصيات الكتب