Akka Kill vs. Stop vs. Poison Pill?


212

คำถาม Newbie ของ Akka - ฉันกำลังอ่านเกี่ยวกับ Akka Essentials มีใครช่วยอธิบายความแตกต่างระหว่าง Akka Stop / Poison Pill vs. Kill ได้ไหม? หนังสือเล่มนี้มีคำอธิบายเล็ก ๆ น้อย ๆ "ยาฆ่าแบบซิงโครนัสกับยาพิษเป็นแบบอะซิงโครนัส" แต่ในทางใด นักแสดงหัวข้อที่โทรเข้าล็อคในช่วงเวลานี้หรือไม่? นักแสดงเด็กได้รับแจ้งระหว่างการฆ่าโพสต์ - หยุด envoked ฯลฯ ? ตัวอย่างการใช้แนวคิดหนึ่งกับอีกแนวคิดหนึ่ง?

ขอบคุณมาก!


12
rs_atl ตอบเป็นอย่างดีให้ฉันแค่เพิ่มว่าไม่มีอะไรเกี่ยวกับนักแสดงที่เป็นแบบซิงโครนัสไม่ใช่บริบทแม้กระทั่งหยุด (ตัวเอง)
Roland Kuhn

1
@RolandKuhn แล้วcontext.becomeเหรอ?
Ionuț G. Stan

3
context.becomeกำหนดพฤติกรรมที่จะนำไปใช้กับข้อความถัดไปซึ่งหมายความว่ามันจะมีผลหลังจากที่ข้อความปัจจุบันได้รับการประมวลผล; ในเรื่องนี้มันค่อนข้างเป็นเช่นcontext.stop(self)นั้น
Roland Kuhn

คำตอบ:


328

ทั้งสองstopและPoisonPillจะยุตินักแสดงและหยุดคิวข้อความ พวกเขาจะทำให้นักแสดงหยุดการประมวลผลข้อความส่งการโทรหยุดให้กับเด็ก ๆ ทุกคนรอให้พวกเขายุติแล้วเรียกpostStopเบ็ด ข้อความเพิ่มเติมทั้งหมดจะถูกส่งไปยังกล่องจดหมายที่ตายแล้ว

ความแตกต่างคือข้อความที่ได้รับการประมวลผลก่อนที่ลำดับนี้จะเริ่ม ในกรณีของการstopโทรข้อความที่กำลังประมวลผลอยู่จะเสร็จสิ้นก่อนโดยที่คนอื่น ๆ จะถูกยกเลิก เมื่อส่ง a PoisonPillนี่เป็นเพียงข้อความอื่นในคิวดังนั้นลำดับจะเริ่มเมื่อPoisonPillได้รับ ข้อความทั้งหมดที่อยู่ข้างหน้าในคิวจะถูกประมวลผลก่อน

ตรงกันข้ามKillข้อความที่ทำให้นักแสดงที่จะActorKilledExceptionได้รับการจัดการโดยใช้กลไกผู้บังคับบัญชาปกติ ดังนั้นพฤติกรรมที่นี่ขึ้นอยู่กับสิ่งที่คุณได้กำหนดไว้ในกลยุทธ์หัวหน้างานของคุณ ค่าเริ่มต้นคือการหยุดนักแสดง แต่กล่องจดหมายยังคงอยู่ดังนั้นเมื่อนักแสดงรีสตาร์ทจะยังคงมีข้อความเก่ายกเว้นกล่องจดหมายที่ทำให้เกิดความล้มเหลว

ดูที่ส่วน 'การหยุดนักแสดง', 'การฆ่านักแสดง' ในเอกสาร:

http://doc.akka.io/docs/akka/snapshot/scala/actors.html

และเพิ่มเติมเกี่ยวกับกลยุทธ์การกำกับดูแล:

http://doc.akka.io/docs/akka/snapshot/scala/fault-tolerance.html


4
คำตอบที่ดีขอขอบคุณคุณควรโพสต์ในการกวดวิชา Akka!
LaloInDublin

16
ข้อความฆ่าไม่ทำให้นักแสดงเริ่มต้นใหม่โดยใช้กลไกผู้ดูแลปกติยกเว้นว่าคุณใช้กลยุทธ์ผู้ดูแลที่ไม่ใช่ค่าเริ่มต้นเนื่องจาก ActorKilledException แก้ไขเป็นหยุดไม่ใช่รีสตาร์ท
lisak

ที่จริงแล้วมันค่อนข้างน่ารำคาญเพราะมีเพียงวิธีเดียวในการรีสตาร์ทนักแสดงที่มีข้อยกเว้น
lisak

หรือส่ง PoisonPill จากผู้กำกับดูแลไปยังผู้ที่ควรเริ่มต้นใหม่และเริ่มใหม่อีกครั้ง
lisak

มีความแตกต่างถ้าใช้context.stop(self)?
BAR

1

ใช้ PoisonPill ทุกครั้งที่คุณทำได้ มันถูกวางไว้บนกล่องจดหมายและถูกใช้เหมือนข้อความอื่น ๆ นอกจากนี้คุณยังสามารถใช้ "context.stop (ตัวเอง)" จากภายในนักแสดง


0

PoisonPill หยุดการทำงานของนักแสดงทันทีหลังจากข้อความทั้งหมดที่ได้รับลงในกล่องจดหมายก่อน PoisonPill


20
ไม่ Kill ไม่มีลำดับความสำคัญเป็นพิเศษเช่นเดียวกับ PoisonPill
Roland Kuhn

0

คุณสามารถใช้ทั้งหยุดนักแสดงและยาพิษเพื่อหยุดการประมวลผลของนักแสดงและฆ่าเพื่อยุตินักแสดงทั้งหมด x.stop เป็นวิธีการรับสายที่คุณรับใน akka จะแทนที่สถานะนักแสดงเป็นนักแสดงหน้าใหม่หลังจากโทร postStop x! PoisonPill เป็นวิธีการที่คุณส่งให้กับนักแสดงเพื่อหยุดการประมวลผลเมื่อนักแสดงทำงาน (แนะนำ) จะแทนที่สถานะนักแสดงหลังจากเรียก postStop x.kill จะยุตินักแสดงและจะลบนักแสดงใน Path นักแสดงและแทนที่นักแสดงทั้งหมดด้วยนักแสดงคนใหม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.