Tôi đang sử dụng cụm akka để thực hiện tính toán phân tán trong hai pahs. Đầu tiên phaseA
rồi phaseB
. Để xử lý các pha, tôi sử dụng FSM của akka.Cách đúng để trì hoãn tin nhắn trong Akka
Không có đồng bộ hóa cứng để một trong các nút có thể đạt đến phaseB
trong khi các nút khác vẫn ở trong phaseA
.
Vấn đề là, một trong phaseB
gửi phaseB-related
tin nhắn cho người khác (họ đang ở số phaseA
chưa) điều gì khiến họ mất thông báo phaseB-related
.
Để bây giờ tôi sử dụng thủ thuật đơn giản để hoãn thông điệp không rõ:
case any => self ! any
Nhưng IMO đây không phải là cách thích hợp để làm điều đó. Tôi biết tôi cũng có thể lên lịch any
bằng cách sử dụng lịch trình akka, nhưng tôi cũng không thích điều này.
đây được đơn giản hóa mã:
package whatever
import akka.actor._
object Test extends App {
case object PhaseA
case object PhaseB
class Any extends Actor {
def phaseA: Receive = {
case PhaseA => {
context.become(phaseB)
println("in phaseB now")
}
case any => self ! any
}
def phaseB: Receive = {
case PhaseB => println("got phaseB message !")
}
def receive = phaseA
}
val system = ActorSystem("MySystem")
val any = system.actorOf(Props(new Any), name = "any")
any ! PhaseB
any ! PhaseA
}
cách chính xác để hoãn thông điệp trong một tình huống như vậy là gì?
Yêu cầu diễn viên trong giai đoạn A đặt các thông điệp vào hàng đợi và sau đó gửi chúng cho chính nó khi nó đi vào giai đoạn B. Lý do về các diễn viên như thể họ là người. Bạn sẽ làm gì nếu ai đó đưa cho bạn một tin nhắn trên một mảnh giấy mà bạn chưa sẵn sàng xử lý? Đặt trên đống trên bàn của bạn cho đến khi bạn đã sẵn sàng để đối phó với nó. –