2013-01-12 39 views
6

Ứng dụng của tôi cần có khả năng tạo cấu trúc cây của diễn viên. Cách tiêu chuẩn để làm điều này tôi tưởng tượng sẽ là đặt mã instantiation bên trong các diễn viên để họ có thể nhanh chóng con cái của họ. Cách tiếp cận tôi thà sẽ là để có thể nhanh chóng một diễn viên tại một con đường nhất định. Chẳng hạn như tạo diễn viên A trong mySystem và sau đó có thể trực tiếp tạo ra akka: // mySystem/A/B và các diễn viên khác. Chức năng này có tồn tại không? Nó sẽ đơn giản hóa mã của tôi rất nhiều.Tạo thủ công phân cấp diễn viên trong akka

EDIT: Bây giờ tôi không có trên điện thoại của tôi, hãy để tôi xây dựng.

nói rằng tôi có một lớp

class myActor extends actor 

và tôi cần phải thực hiện một cây n chiều trong số này. Thay vì có mã cần thiết để nhanh chóng trẻ em của mình trong chức năng nhận được với một cái gì đó giống như

case Create(n:Int) => {} 

Tôi đang tìm kiếm để đơn giản hóa mã myActor bằng cách không bao gồm bất kỳ đó và thay vào đó là khả năng tạo ra hệ thống cấp bậc của tôi khi bắt đầu mã của tôi theo cách thủ công. Vì vậy, lý tưởng một cái gì đó như thế này (giả sử hàm tĩnh giả "tạo ra"):

val sys = ActorSystem("mySystem") 
Akka.Actors.Create("akka://mySystem/a", new myActor()) 
Akka.Actors.Create("akka://mySystem/a/b", new myActor()) 
Akka.Actors.Create("akka://mySystem/a/c", new myActor()) 

mà sẽ tạo ra cây diễn viên:

a 
/\ 
b c 

Bây giờ, điều này có tồn tại? Có cách nào tốt hơn để làm điều này mà không làm lộn xộn mã diễn viên của tôi với mã trình diễn không?

CHỈNH SỬA, vòng 2:

Ok, có vẻ như chức năng này không tồn tại. Thay vào đó, tôi đã tạo ra một đặc điểm phụ của diễn viên và buộc tất cả mã instantiation của tôi ở đó để các lớp triển khai cụ thể của tôi vẫn còn gọn gàng.

Trả lời

2

Mọi diễn viên đều có cha mẹ. Để làm những gì bạn muốn, bạn cần một lớp Actor để làm phụ huynh cho tất cả các diễn viên khác (không phải là diễn viên gốc). Vì các diễn viên phụ đồng nghĩa với các diễn viên giám sát, bạn muốn có một số phương tiện để ra lệnh cho chiến lược giám sát áp dụng cho các diễn viên phụ huynh đó.

Tôi giả sử bạn có thể xác định cha mẹ chung Actor để đặt vào vị trí bên trong của phân cấp tác nhân và viết phương pháp phân tách tên đường dẫn diễn viên và tạo phân cấp được chỉ định bởi một hoặc nhiều đường dẫn đó. Bạn có thể muốn có một cách để xác định chiến lược giám sát và, tối thiểu, chức năng receive để cài đặt trong diễn viên lá. Vì chỉ một diễn viên mới có thể tạo con, các diễn viên phụ sẽ phải trả lời các tin nhắn để tạo diễn viên con của họ (hoặc các diễn viên phụ hoặc diễn viên khác) bằng cách nào đó để chọn cách phân lớp Actor các diễn viên lá.

Nhưng để trả lời câu hỏi của bạn, không có gì tích hợp để thực hiện việc này. Tôi không nghĩ rằng nó có đủ tiện ích chung để biện minh cho chính Akka.

2

Tạo diễn viên gốc, từ bên trong diễn viên gốc tạo cây của bạn với actorFor. Sử dụng application.conf trong classpath cho cấu hình tĩnh của hệ thống phân cấp của tên, hoặc tạo ra một số cấu trúc địa chỉ liên tục. Các tùy chọn khác là phân tích đường dẫn và tạo trẻ em trong overriden preStart.Có các chương trình khác nhau để giám sát vòng đời của trẻ em, khởi động lại và định tuyến các thông điệp một cách minh bạch thông qua một diễn viên duy nhất.

4

Câu hỏi của bạn bắt đầu bằng cách đưa ra giải pháp và rất tiếc là không bao gồm mô tả sự cố.

Cây diễn viên là quan trọng nhất để được hiểu là hệ thống phân cấp giám sát: cha mẹ xử lý thất bại của con mình và vòng đời của địa điểm cha mẹ giới hạn trong vòng đời của con cái. Có hay không một diễn viên nên là đứa trẻ của người khác cần phải được xác định bằng cách xem xét những tác động này.

Tôi nói rằng bởi vì câu hỏi của bạn ngụ ý rằng bạn đang lập mô hình cây giám sát theo một số tiêu chí khác, có thể lạm dụng nó như một cơ quan đăng ký với system.actorFor làm cơ chế tra cứu. Có thể có những trường hợp hiếm hoi mà nó hoạt động, nhưng một ưu tiên tôi sẽ không khuyên bạn nên; Tôi muốn đặt một bản đồ băm bên trong một diễn viên điều phối và có xử lý việc tra cứu. Nếu bạn kết luận - bằng cách đo lường - rằng điều đó không hoạt động đủ tốt, bạn có thể mở rộng quy mô bằng cách sử dụng router.

Để trả lời câu hỏi của bạn ngay bây giờ: mỗi phụ huynh cần tạo con riêng, điều đó có nghĩa là cha mẹ phải theo cách này hay cách khác chứa mã để làm điều đó. Bạn có thể vượt qua Props xuống cấu trúc phân cấp để làm cho các phần của cấu hình có thể được định cấu hình, nhưng bạn không nên làm việc xung quanh what supervision means; hãy tự hỏi mình điều gì sẽ xảy ra nếu một trong những chiếc lá không thành công, và sau đó tự hỏi xem liệu lá giả định của bạn có nên được khởi động lại và/hoặc bị giết khi một tác nhân trung gian được khởi động lại hay không.

+0

Tôi thấy rằng về mặt lý thuyết đây là một câu trả lời hay, tuy nhiên tôi không thể không nhận thấy có bao nhiêu mã spaghetti từ các hệ thống phân cấp hệ thống lớn. Một cấu hình trung tâm như đã đề cập trong câu hỏi có thể cung cấp một cơ chế cho sự hiểu biết rõ ràng về hệ thống phân cấp tổng thể cho các mục đích phần mềm thực tế. Bạn có đề xuất một số phương pháp thay thế để làm rõ phân cấp phức tạp? Hay đây chỉ là cách mà nó phải được trao cho các mối quan hệ giữa phụ huynh và con? –

+0

Rất khó để tôi trả lời câu hỏi này vì dường như bạn ngụ ý ngữ cảnh mà tôi không có. Hệ thống diễn viên được cấu trúc trong các subtrees cung cấp chức năng nhất định, theo nghĩa đó chúng rất mô đun. Điểm vào của mỗi mô-đun con này là diễn viên hàng đầu của nó, có hiệu quả là toàn bộ cây con của nó. Tôi có thể thấy cách phá vỡ mô hình này bằng cách cố gắng cài đặt các diễn viên trong các subtrees từ bên ngoài sẽ tạo ra mã spaghetti, bởi vì điều đó đơn giản là không có nghĩa là phải làm. Bất cứ khi nào một diễn viên cần tạo một đứa trẻ, nó có thể xem ví dụ về cấu hình để xác định cách thực hiện điều đó. –

Các vấn đề liên quan