أساسيات نموذج Akka Actor
افهم مبادئ نموذج Actor ودورة حياة الـ actor وتمرير الرسائل للتنفيذ المتزامن
أساسيات نموذج Akka Actor درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 1 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Scala for Backend Engineering & Functional Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Scala for Backend Engineering & Functional Programming 3 دروس في المجموع.
مواجهة تحديات التزامن
في التطبيقات الحديثة، تحتاج المهام غالبًا إلى العمل في الوقت نفسه. ويُسمى ذلك التزامن. ورغم قوة التزامن، فإنه ينطوي على تحديات.
- حالات التسابق: تحدث عندما تحاول عدة خيوط الوصول إلى البيانات المشتركة وتعديلها في الوقت نفسه، مما يؤدي إلى نتائج غير متوقعة.
- حالات الجمود: تحدث عندما تُحظر خيطان أو أكثر إلى أجل غير محدد، بانتظار أن يحرر أحدها الموارد التي يحتاج إليها الآخر.
قد تكون نماذج الخيوط التقليدية معقدة وعرضة للأخطاء عند التعامل مع هذه المشكلات.
فهم نموذج Actor
يوفر نموذج Actor طريقة فعالة لإدارة التزامن. فبدلًا من مشاركة الذاكرة، يتواصل Actors مع بعضهم بعضًا فقط عبر إرسال الرسائل.
- العزل: لكل Actor حالة خاصة به، ولا يستطيع أي Actor آخر الوصول إليها مباشرة.
- تمرير الرسائل: يتفاعل Actors عبر إرسال رسائل غير قابلة للتغيير إلى صناديق بريد بعضهم بعضًا.
- عدم التزامن: لا يؤدي إرسال الرسائل إلى الحظر؛ إذ لا ينتظر المرسل ردًا.
تخيلوا Actors أشخاصًا مستقلين، لكل منهم مكتبه الخاص (حالته) وخدمة بريد (تمرير الرسائل).
لماذا تختارون Akka؟
إن Akka مجموعة أدوات مفتوحة المصدر تطبق نموذج Actor في Scala (وJava). وقد صُممت لبناء تطبيقات عالية التزامن وموزعة وقادرة على تحمل الأعطال.
- البساطة: تبسّط Akka البرمجة المتزامنة عبر إخفاء تفاصيل التعامل منخفضة المستوى مع الخيوط.
- قابلية التوسع: يمكنكم توسيع نطاق التطبيقات بسهولة من جهاز واحد إلى مجموعة من الأجهزة.
- المرونة: تتضمن آليات مدمجة للتعامل مع الأعطال، مما يتيح للأنظمة إصلاح نفسها.
تساعدكم Akka على كتابة أنظمة «تعمل ببساطة» حتى تحت الأحمال الكبيرة أو عند حدوث أعطال جزئية.
داخل Actor في Akka
يُعد Actor في Akka وحدة أساسية للتزامن. ولكل Actor ما يلي:
- السلوك: يُحدد بالطريقة التي يستجيب بها للرسائل.
- صندوق البريد: حيث تُوضع الرسائل الواردة في قائمة انتظار. وتُعالج الرسائل واحدة تلو الأخرى وبالترتيب.
- الحالة الخاصة: بيانات تخص Actor وحده، ولا يمكن تعديلها إلا من خلاله.
- ActorRef: عنوان فريد لإرسال الرسائل إلى هذا Actor.
يمنع هذا العزل الصارم أخطاء التزامن الشائعة، مثل حالات التسابق.
أول ActorSystem لكم
قبل أن تتمكنوا من إنشاء Actors، تحتاجون إلى ActorSystem. وهذه هي نقطة الدخول إلى Akka، إذ تدير جميع Actors الموجودة ضمن نطاقها.
وهي توفر خدمات مثل الجدولة والإعدادات وتسلسلًا هرميًا للإشراف (سنتناوله لاحقًا).
حاولوا إنشاء واحد:
import akka.actor.ActorSystem
object Main extends App {
// Create an ActorSystem
val system = ActorSystem("MyActorSystem")
println(s"ActorSystem created: ${system.name}")
// Terminate the system when done (important for clean shutdown)
system.terminate()
}إنشاء أول Actor لكم
لإنشاء Actor، تعرّفون class يمتد trait Actor في Akka وتنفذون الدالة receive.
تحدد الدالة receive كيفية معالجة Actor للرسائل الواردة. وهي دالة جزئية تطابق أنواع الرسائل.
import akka.actor.Actor
class GreeterActor extends Actor {
def receive: Receive = {
case message: String =>
println(s"Greeter received: $message")
}
}إنشاء Actors وActorRef
تُنشأ Actors (أو «تُطلَق») باستخدام الدالة actorOf الخاصة بـ ActorSystem. وتعيد هذه الدالة ActorRef.
إن ActorRef مرجع خفيف الوزن وقابل للتسلسل إلى Actor. وتستخدمونه لإرسال الرسائل إلى ذلك Actor، من دون التفاعل مباشرة مع نسخة Actor نفسها.
import akka.actor.{ActorSystem, Props, Actor}
class GreeterActor extends Actor {
def receive: Receive = {
case message: String =>
println(s"Greeter received: $message")
}
}
object Main extends App {
val system = ActorSystem("MyActorSystem")
// Create an actor and get its ActorRef
val greeterRef = system.actorOf(Props[GreeterActor], "greeter")
println(s"Greeter actor created with path: ${greeterRef.path}")
system.terminate()
}إرسال الرسائل إلى Actors
يحدث التواصل بين الممثلين حصريًا عبر الرسائل. تُرسل الرسائل إلى ActorRef باستخدام عامل التشغيل ! (tell).
تُرسل الرسائل بشكل غير متزامن، وتكون عادةً فئات حالة غير قابلة للتغيير أو أنواعًا بسيطة مثل String.
import akka.actor.{ActorSystem, Props, Actor}
class GreeterActor extends Actor {
def receive: Receive = {
case message: String =>
println(s"Greeter received: $message")
}
}
object Main extends App {
val system = ActorSystem("MyActorSystem")
val greeterRef = system.actorOf(Props[GreeterActor], "greeter")
// Send a message to the greeter actor
greeterRef ! "Hello Akka!"
greeterRef ! "How are you?"
// Give actors time to process messages before terminating
Thread.sleep(100)
system.terminate()
}أساسيات دورة حياة الممثل
يمتلك الممثلون دورة حياة تبدأ من الإنشاء وتنتهي بالإيقاف. يوفر Akka نقاط ربط تتيح لكم تنفيذ إجراءات الإعداد والتنظيف:
preStart(): يُستدعى مباشرةً قبل أن يبدأ الممثل في معالجة رسالته الأولى. وهو مفيد لتهيئة الموارد.postStop(): يُستدعى بعد إيقاف الممثل وقبل إزالته نهائيًا من النظام. وهو مفيد لتحرير الموارد.
يُعد فهم دورة الحياة أمرًا أساسيًا لإدارة موارد الممثلين بفعالية.
تسلسلات الممثلين الهرمية
يُنظَّم الممثلون في تسلسل هرمي يشبه نظام الملفات. لكل ممثل، باستثناء ممثل "الحارس الجذر"، ممثلٌ أب.
- الإشراف: يتحمل الممثلون الآباء مسؤولية الإشراف على أبنائهم. إذا فشل أحد الممثلين الأبناء، يقرر أبوه كيفية التعامل مع الفشل، مثل إعادة التشغيل أو الإيقاف.
- المسار: لكل ممثل مسار فريد، مثل
/user/myActor/childActor، يعكس موضعه في التسلسل الهرمي.
يمثل هذا التسلسل الهرمي أساس ميزات تحمّل الأخطاء والمرونة في Akka.
اختبار أساسيات Akka
لنختبر مدى فهمكم لأساسيات نموذج الممثلين في Akka.
مراجعة: نموذج الممثلين في Akka
أحسنتم! لقد تعلمتم في هذا الدرس المفاهيم الأساسية لنموذج الممثلين في Akka:
- تحديات التزامن التقليدي.
- مبادئ نموذج الممثلين: العزل، وتمرير الرسائل، وعدم مشاركة الحالة.
- دور Akka باعتباره حزمة أدوات لبناء أنظمة ممثلين قوية.
- كيفية تعريف
ActorSystemوالممثلين البسيطين في Scala. - كيفية إنشاء الممثلين وإرسال الرسائل إليهم باستخدام
ActorRef. - أساسيات دورة حياة الممثلين وتسلسلهم الهرمي.
سنتعمق لاحقًا في تصميم أنظمة الممثلين والتعامل مع تفاعلات أكثر تعقيدًا!
الأسئلة الشائعة
هل درس «أساسيات نموذج Akka Actor» مجاني؟
نعم — نص درس «أساسيات نموذج Akka Actor» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Scala for Backend Engineering & Functional Programming، انتقل إلى CoddyKit PRO. تتضمن دورة Scala for Backend Engineering & Functional Programming 3 دروس في المجموع.
ماذا ستتعلم في «أساسيات نموذج Akka Actor»؟
افهم مبادئ نموذج Actor ودورة حياة الـ actor وتمرير الرسائل للتنفيذ المتزامن تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟
لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 3.
كم من الوقت يستغرق درس «أساسيات نموذج Akka Actor»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟
نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات نموذج Akka Actor
- تصميم أنظمة Actor
- الإشراف وتحمل الأعطال