Giao tiếp trong akka actor

I) Akka actor


1) Thư viện akka actor
Akka Actor là một thư viện mã nguồn mở được phát triển nhằm giúp các lập trình viên có thể xây dựng các ứng dụng xử lý đồng thời và phân tán (concurrent and distributed application) một cách dễ dàng .Hơn nữa, các Actors được quản lý theo cấu trúc Supervisory Hierarchy, cho phép Parent Actors có thể quản lý và phân bổ nhiệm vụ cho các Child Actors. Do đó đảm bảo tính fault-torelance và scalability của chương trình.
2) Sức mạnh của akka actor
Một số ưu điểm khác của việc sử dụng Akka actor có thể kể đến là:
– Sử dụng message thay vì method call cho phép sender không bị tạm dừng để đợi return value từ receiver.
– Chúng ta không cần quan tâm đến vấn đề synchronization trong môi trường multi-thread vì các message được xử lý theo thứ tự First In First Out (theo dạng queue).
– Việc quản lý Actor theo dạng Hierarchy giúp thuận tiện trong Error Handling. Các Actor sẽ thông báo về Parent của chúng khi xảy ra lỗi và các Parents sẽ quyết định cách xử lý lỗi cho các Child Actors.
II) Liên lạc giữa các actor
Như đã trình bày trong phần trên, các Actor trao đổi với nhau thông qua message. Ở đây, message có thể là bất kỳ loại object nào nhưng chúng phải immutatble(không thể bị thay đổi). Thông thường các object như String, Int, Boolean đều là immutable objects. Trong bài viết này, chúng ta sẽ tìm hiểu về 3 hoạt động trao đổi message trong Akka là Message Sending, Replying và Forwarding:
1) Khởi động
Để sử dụng được akka actor, chúng ta cần import thư viện này và extend đến nó

import akka.actor.Actor
class TestYourActor extends Actor{
//your code in here
}


2) Message Sending


Trong Akka, message có thể được gửi bằng một trong hai phương thức sau:
– tell() hoặc dùng dấu “!”: hoạt động theo nguyên tắc fire-forget (gửi tin nhắn nhưng không đợi tin nhắn phản hồi). Nếu message được gửi từ một Actor thì sender là tên của Actor đó, nếu không thì mặc định sender sẽ là deadLetters

val senderActor=sender();
senderActor ! self.path.name+" received message!!";


– ask() hoặc dùng dấu “?”: hoạt động theo nguyên tắc Send-And-Receive-Future (Future biểu thị cho các phản hồi có thể nhận được. nếu Future không nhận được sau một khoảng thời gian xác định thì sẽ xảy ra lỗi AskTimeOutException). Khác với tell(), ask() không sử dụng sender(), nó sẽ dùng Actor.noSender.

var actor = actorSystem.actorOf(Props[TestYourActor],"TestYourActor");
val future = actor ? "Hello from Actor.noSender";


3) Message Replying
Để phản hồi lại tin nhắn cho người gửi, chúng ta có thể sử dụng hàm sender() để lấy thông tin của actor gửi tin nhắn. Hàm này trả về kết quả là ActorRef của sender Actor. Tuy nhiên, để gửi tin nhắn phải hồi ta phải dùng 1 trong 2 cách gửi message đã nêu ở trên

val senderActor=sender();

4) Message Forwarding


Akka cho phép người dùng có thể forward message từ actor này sang actor khác. Điều đặc biệt ở đây là address(reference) của một sender Actor gốc vẫn được giữ nguyên dù message được truyền qua các Actor trung gian.

val actor = actorSystem.actorOf(Props[TestYourActor],"TestYourActor");
actor forward("Message forward");

Tags:,

Add a Comment

Your email address will not be published.