2014-06-08 13 views
10

Tôi hiện đang trong quá trình tạo một ứng dụng Java dựa trên Akka khá lớn và tôi đang gặp phải một số vấn đề khiến tôi không thể kết thúc.Quy ước đặt tên cho thông điệp và diễn viên Akka

bố trí gói hiện tại của tôi trông kinda như thế này:

Project Structure

lớp Mobile tôi phục vụ như là người giám sát của các diễn viên bên trong gói actors.

Vì tôi không muốn tạo bộ diễn viên mới cho mỗi HttpClientAccount, tôi chuyển những người xung quanh trong các đối tượng tin nhắn được lưu trữ trong gói tin, cùng với điểm cuối ActorRef nhận kết quả cuối cùng. Tuy nhiên, điều này tạo ra một gói messages rất lộn xộn với một thông điệp khác nhau cho mỗi tác nhân. Ví dụ. MobileForActor1, Actor1ForMobile, MobileForActor2 vv Bây giờ câu hỏi của tôi là, có Công ước để sử dụng cho loại nội dung này có liên quan đến vấn đề này không và cấu trúc của tôi (Mobile ->Actor1 ->Mobile ->Actor2 -> vv.) Akka muốn nó được hoặc tôi phải chỉ loại thác các tin nhắn (Mobile ->Actor1 ->Actor2 -> vv.)?

Ngay bây giờ tôi đang gửi một ConnectMessage với nam diễn viên của tôi Mobile mà sau đó gửi nó đến Actor1, Actor1 quá trình nó và gửi một thông điệp mới trở lại Mobile, Mobile gửi rằng phản ứng sau đó đến Actor2 và chu kỳ tiếp tục với một thông điệp mới được tạo dựa trên thông điệp cũ. Ví dụ. new Message2(message1.foo, message1.bar, message1.baz, newComputatedResult, newComputatedResult2, etc);

Thực tiễn tốt này hay tôi nên bao gồm trường hợp cũ (có thể chứa thông tin không hữu ích nữa) và bao gồm nội dung mới? Ví dụ. new Message2(message1, newComputatedResult, newComputatedResult2, etc);

Hoặc tôi có nên làm điều gì đó hoàn toàn khác?

Tôi đã nghĩ đến việc sử dụng TypedActors nhưng tôi yêu cầu sử dụng mẫu thác nước và tôi không biết làm cách nào để truyền ActorRef của người nghe muốn nhận kết quả cuối cùng.

Tôi hy vọng bản thân mình có thể hiểu được đủ bởi vì tiếng Anh không phải là ngôn ngữ thời con gái của tôi và câu hỏi rõ ràng cho mọi người.

Tôi là một nhà phát triển Akka bắt đầu và yêu thích ý tưởng nhưng vì tài liệu không đề cập đến điều này rất tốt, tôi đã nhận ra đây là nơi tốt nhất để hỏi. Cảm ơn vì đã đọc!

Trả lời

7

Tôi sẽ mạo hiểm một vài nhận xét để phản hồi điều này vì tôi đã xử lý các vấn đề tương tự trong đường cong học tập của Akka. Tôi nghĩ rằng bạn đang yêu cầu một số quy tắc của ngón tay cái vì vậy tôi được chứa ở đây.

Đầu tiên, việc tạo diễn viên cực kỳ rẻ; chúng rất nhẹ. Vì vậy, tại sao không tạo ra một cho mỗi HttpClient và tài khoản và cung cấp cho họ tên phù hợp bắt nguồn từ danh tính của họ? Điều này cũng tránh cho bạn phải vượt qua chúng xung quanh càng nhiều, có thể, làm suy yếu mã của bạn.

Thứ hai, giữ tên tin nhắn của bạn ngắn gọn, tập trung và bắt đầu bằng động từ. Mỗi thông báo nên yêu cầu diễn viên làm điều gì đó để bạn muốn tên phản ánh điều đó bằng cách sử dụng động từ.

Thứ ba, bộ thông điệp đi cùng với diễn viên.Tôi thường tuyên bố chúng trong đối tượng đồng hành của lớp diễn viên để sử dụng chúng giống như ActorClass.MessageName trừ khi nó nằm trong phạm vi ActorClass và sau đó chỉ là MessageName.

Thứ tư, thêm một bộ đếm vào tên của một diễn viên. Tôi thường chỉ kết hợp một bộ đếm (sử dụng AtomicInteger) với tên của loại (Car-1, Car-2, v.v.).

Nếu cấu trúc phân cấp quan trọng đối với bạn, tôi khuyên bạn chỉ nên thêm diễn viên mẹ vào tên. Một cái gì đó như Phone-1-in-Car-7 có nghĩa là Phone-1 được chứa trong Car-7. Sau đó, bạn có thể lắp ráp phân cấp theo cả hai chương trình và thủ công bằng cách làm theo các liên kết gốc.

Tôi nghĩ rằng "Thư" trong ConnectMessage là không cần thiết. Chỉ cần làm cho tên tin nhắn là "Kết nối" hoặc thậm chí tốt hơn "ConnectToThing" (bất cứ điều gì là, nếu đó là có liên quan).

Tôi sẽ không kết hợp tên thư của bạn quá nhiều như bạn đang đề xuất với Message2. Sử dụng số lượng thông tin tối thiểu để hữu ích cho bất kỳ ai sẽ đọc những tên đó. Tôi nghĩ rằng việc thiếu phản ứng với điều này có thể là kết quả của phần này trong câu hỏi của bạn. Tôi thấy nó khó hiểu vì thiếu nhiều chi tiết.

Hy vọng điều này sẽ hữu ích.

+0

Bạn có thể hiển thị một số ví dụ về cách đặt tên tin nhắn tốt không? Ví dụ tôi có một nhà cung cấp và người tiêu dùng. Người tiêu dùng muốn hỏi Nhà cung cấp có bao nhiêu hàng hóa. Bạn sẽ đặt tên tin nhắn theo yêu cầu và trả lời như thế nào? –

+0

@TemaBolshakov - Làm thế nào về "GetGoodsCountRequest" và "GetGoodsCountResponse"? –

+0

không chắc chắn những tên này đủ thành ngữ trong scala. Tôi thích cái đầu tiên nhưng sau đó trông hơi dư thừa. Có thể nào tốt hơn để trả lời với Int? Hoặc xác định bí danh loại cho Int, ví dụ 'type GoodsCount = Int'. Whats lựa chọn tốt nhất trong scala? –

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