Scala for Backend Engineering & Functional Programming · บทเรียน

พื้นฐานโมเดลแอกเตอร์ของ Akka

ทำความเข้าใจหลักการของโมเดลแอกเตอร์ วงจรชีวิตของแอกเตอร์ และการส่งข้อความเพื่อการทำงานพร้อมกัน

บทเรียน 1 จาก 312 ขั้นตอน

พื้นฐานโมเดลแอกเตอร์ของ Akka เป็นบทเรียน Scala for Backend Engineering & Functional Programming ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Scala for Backend Engineering & Functional Programming และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 3 บทเรียน

เผชิญความท้าทายของการทำงานพร้อมกัน

ในแอปพลิเคชันสมัยใหม่ งานต่าง ๆ มักต้องทำงานในเวลาเดียวกัน ซึ่งเรียกว่าการทำงานพร้อมกัน แม้การทำงานพร้อมกันจะมีประสิทธิภาพ แต่ก็มาพร้อมกับความท้าทาย

  • สภาวะแข่งขัน: เกิดขึ้นเมื่อเธรดหลายรายการพยายามเข้าถึงและแก้ไขข้อมูลที่ใช้ร่วมกันในเวลาเดียวกัน ทำให้ได้ผลลัพธ์ที่คาดเดาไม่ได้
  • การหยุดชะงัก: เกิดขึ้นเมื่อเธรดอย่างน้อยสองรายการถูกบล็อกอย่างไม่มีกำหนด เพราะรอให้กันและกันปล่อยทรัพยากร

รูปแบบการใช้เธรดแบบดั้งเดิมอาจซับซ้อนและเกิดข้อผิดพลาดได้ง่ายเมื่อต้องจัดการปัญหาเหล่านี้

ทำความเข้าใจรูปแบบนักแสดง

รูปแบบนักแสดงเป็นแนวทางที่มีประสิทธิภาพสำหรับจัดการการทำงานพร้อมกัน แทนที่จะแชร์หน่วยความจำ นักแสดงจะสื่อสารกันด้วยการส่งข้อความถึงกันเท่านั้น

  • การแยกออกจากกัน: นักแสดงแต่ละตัวมีสถานะส่วนตัวของตนเอง ซึ่งนักแสดงตัวอื่นไม่สามารถเข้าถึงได้โดยตรง
  • การส่งข้อความ: นักแสดงโต้ตอบกันด้วยการส่งข้อความที่แก้ไขไม่ได้ไปยังกล่องจดหมายของกันและกัน
  • แบบอะซิงโครนัส: การส่งข้อความไม่บล็อกการทำงาน ผู้ส่งไม่ต้องรอการตอบกลับ

ลองนึกภาพว่านักแสดงแต่ละตัวเป็นคนอิสระที่มีโต๊ะของตนเอง (สถานะ) และมีบริการไปรษณีย์ (การส่งข้อความ)

เหตุใดจึงเลือก Akka

Akka เป็นชุดเครื่องมือโอเพนซอร์สที่นำรูปแบบนักแสดงมาใช้ใน Scala (และ Java) โดยออกแบบมาสำหรับสร้างแอปพลิเคชันที่ทำงานพร้อมกันในระดับสูง แอปพลิเคชันแบบกระจาย และแอปพลิเคชันที่ทนทานต่อข้อผิดพลาด

  • ความเรียบง่าย: Akka ลดความซับซ้อนของการเขียนโปรแกรมแบบทำงานพร้อมกันด้วยการซ่อนรายละเอียดระดับต่ำของการใช้เธรด
  • ความสามารถในการขยาย: ขยายแอปพลิเคชันได้อย่างง่ายดาย ตั้งแต่เครื่องเดียวไปจนถึงกลุ่มเครื่องหลายเครื่อง
  • ความทนทาน: มีกลไกในตัวสำหรับจัดการความล้มเหลว ทำให้ระบบฟื้นฟูตัวเองได้

Akka ช่วยให้คุณเขียนระบบที่ "ทำงานได้ตามที่คาดหวัง" แม้อยู่ภายใต้ภาระงานสูงหรือเกิดความล้มเหลวบางส่วน

ภายในนักแสดง Akka

นักแสดง Akkaเป็นหน่วยพื้นฐานของการทำงานพร้อมกัน นักแสดงแต่ละตัวมีสิ่งต่อไปนี้:

  • พฤติกรรม: กำหนดโดยวิธีที่นักแสดงตอบสนองต่อข้อความ
  • กล่องจดหมาย: พื้นที่สำหรับจัดคิวข้อความขาเข้า ข้อความจะถูกประมวลผลทีละรายการตามลำดับ
  • สถานะส่วนตัว: ข้อมูลที่เป็นของนักแสดงเพียงตัวเดียว และแก้ไขได้โดยนักแสดงตัวนั้นเท่านั้น
  • ActorRef: ที่อยู่เฉพาะสำหรับส่งข้อความไปยังนักแสดงตัวนี้

การแยกออกจากกันอย่างเคร่งครัดนี้ช่วยป้องกันข้อผิดพลาดทั่วไปของการทำงานพร้อมกัน เช่น สภาวะแข่งขัน

ActorSystem แรกของคุณ

ก่อนสร้างนักแสดง คุณต้องมี ActorSystem เสียก่อน ซึ่งเป็นจุดเริ่มต้นของ Akka และจัดการนักแสดงทั้งหมดภายในขอบเขตของระบบ

ระบบนี้มีบริการต่าง ๆ เช่น การจัดตาราง การกำหนดค่า และลำดับชั้นสำหรับการกำกับดูแล (เราจะกล่าวถึงเรื่องนี้ในภายหลัง)

ลองสร้างระบบขึ้นมาหนึ่งระบบ:

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 ของ Akka และนำเมธอด receive ไปใช้

เมธอด receive กำหนดวิธีที่นักแสดงประมวลผลข้อความขาเข้า เมธอดนี้เป็นฟังก์ชันบางส่วนที่จับคู่กับชนิดของข้อความ

import akka.actor.Actor

class GreeterActor extends Actor {
  def receive: Receive = {
    case message: String =>
      println(s"Greeter received: $message")
  }
}

สร้างนักแสดงและ ActorRef

นักแสดงจะถูกสร้างขึ้นโดยใช้เมธอด actorOf ของ ActorSystem เมธอดนี้จะคืนค่าเป็น ActorRef

ActorRef เป็นตัวอ้างอิงน้ำหนักเบาที่สามารถแปลงเป็นข้อมูลเพื่อส่งต่อได้สำหรับนักแสดง คุณใช้ตัวอ้างอิงนี้เพื่อส่งข้อความไปยังนักแสดง โดยไม่โต้ตอบกับอินสแตนซ์ของนักแสดงโดยตรง

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()
}

ส่งข้อความไปยังนักแสดง

การสื่อสารระหว่างแอกเตอร์เกิดขึ้นผ่านข้อความเท่านั้น คุณส่งข้อความไปยัง 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
  • พื้นฐานวงจรชีวิตและลำดับชั้นของแอกเตอร์

ถัดไป เราจะเจาะลึกการออกแบบระบบแอกเตอร์และการจัดการปฏิสัมพันธ์ที่ซับซ้อนยิ่งขึ้น

เริ่มต้นได้ฟรี

เรียนรู้ Scala ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
39
บทเรียน
143

คำถามที่พบบ่อย

บทเรียน “พื้นฐานโมเดลแอกเตอร์ของ Akka” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “พื้นฐานโมเดลแอกเตอร์ของ Akka” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Scala for Backend Engineering & Functional Programming ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “พื้นฐานโมเดลแอกเตอร์ของ Akka”

ทำความเข้าใจหลักการของโมเดลแอกเตอร์ วงจรชีวิตของแอกเตอร์ และการส่งข้อความเพื่อการทำงานพร้อมกัน คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Scala for Backend Engineering & Functional Programming หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Scala for Backend Engineering & Functional Programming บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน

บทเรียน “พื้นฐานโมเดลแอกเตอร์ของ Akka” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Scala for Backend Engineering & Functional Programming นี้ได้ไหม

ได้ บทเรียน Scala for Backend Engineering & Functional Programming ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐานโมเดลแอกเตอร์ของ Akka
  2. การออกแบบระบบแอกเตอร์
  3. การควบคุมดูแลและความทนทานต่อความผิดพลาด
← กลับไปที่ Scala for Backend Engineering & Functional Programming