2015-01-14 14 views
7

Câu hỏi này không phải là triết học như tiêu đề có thể gợi ý. Hãy xem xét cách tiếp cận sau để kiên trì:Trong diễn viên dai dẳng của Akka, việc tạo ra một diễn viên trẻ được coi là một tác dụng phụ hay tạo ra trạng thái?

Lệnh để thực hiện Hoạt động đến từ nhiều Khách hàng khác nhau. Tôi đại diện cho cả Hoạt động và Khách hàng là diễn viên liên tục. Trạng thái của Máy khách là lastOperationId để đi qua. Hoạt động của nhà nước là khá nhiều FSM của tiến trình hoạt động (nó có hiệu quả một Saga, vì nó sau đó cần phải tiếp cận với các hệ thống khác bên ngoài để ActorSystem để di chuyển qua các tiểu bang của nó).

Một diễn viên tiếp nhận nhận lệnh vận hành, chứa id ứng dụng và id hoạt động. Nhân viên Reception tạo hoặc truy xuất diễn viên Client và chuyển tiếp lệnh đó. Các tác nhân khách hàng đọc và xác nhận lệnh hoạt động, vẫn tồn tại nó, tạo ra một sự kiện OperationReceived, cập nhật trạng thái riêng của nó với id hoạt động này. Bây giờ nó cần phải tạo một diễn viên hoạt động mới để quản lý hoạt động dài hạn mới. Nhưng đây là nơi tôi bị lạc và tất cả các ví dụ hay trong tài liệu và trên các blog khác nhau đều không giúp ích gì. Hầu hết các nhà bình luận đều nói rằng PersistentActor chuyển đổi các lệnh thành các sự kiện, và sau đó cập nhật trạng thái của chúng. Chúng cũng có thể có tác dụng phụ miễn là chúng không được gọi trong khi phát lại. Vì vậy, tôi có hai lĩnh vực nhầm lẫn:

  1. Việc tạo một diễn viên hoạt động trong ngữ cảnh này có tương đương với tạo trạng thái hoặc thực hiện tác dụng phụ không? Nó không có vẻ giống như một tác dụng phụ, nhưng đồng thời nó không thay đổi trạng thái riêng của nó, nhưng gây ra một sự thay đổi trạng thái trong một đứa trẻ mới.
  2. Tôi có phải tạo một Lệnh để gửi cho diễn viên Hoạt động mới hay tôi chỉ cần chuyển tiếp sự kiện OperationReceived?

Nếu tôi giả định rằng việc tạo diễn viên con không phải là tác dụng phụ, điều đó có nghĩa là tôi cũng phải tạo con khi phát lại. Điều này sẽ làm cho tình trạng của đứa trẻ được phục hồi.

Tôi hy vọng câu hỏi cơ bản là rõ ràng. Tôi cảm thấy đó là một câu hỏi chung, nhưng cách tốt nhất tôi có thể xây dựng nó là bằng cách đưa ra một ví dụ cụ thể.

Chỉnh sửa: Trên phản ánh, tôi nghĩ rằng việc tạo một tác nhân liên tục từ một tác nhân khác là hành động tạo trạng thái, mặc dù bên ngoài. Điều đó có nghĩa là sự kiện kích hoạt việc tạo ra sẽ kích hoạt việc tạo ra trên một lần phát lại tiếp theo (điều này sẽ dẫn đến việc truy lục trạng thái tồn tại của chính đứa trẻ). Điều này làm cho tôi nghĩ rằng việc chuyển sự kiện (chứ không phải là lệnh gói) có thể là điều sạch nhất để làm vì cùng một sự kiện có thể được áp dụng để cập nhật trạng thái ở cả cha lẫn mẹ. Không cần phải kiên trì sự kiện khi nó đến với đứa trẻ - nó đã được lưu giữ trong phần tử cha và sẽ phát lại.

+0

Tôi sẽ thêm bản chỉnh sửa ở trên làm câu trả lời vì bản thân câu hỏi dường như có một số lượng upvotes. – Brendan

+0

Bạn có khái niệm về cách kết hợp kiến ​​trúc này với một nhật ký ảnh chụp nhanh không? Vì trạng thái của các diễn viên trẻ không được phản ánh trong diễn viên chính, bạn sẽ làm thế nào? – thwiegan

+0

@thwiegan xin lỗi vì sự chậm trễ trong trả lời - câu hỏi của bạn (cũng được thực hiện dưới đây bằng cách bùng phát) là rất pertinant. Với thực tế của ảnh chụp nhanh, tôi nghĩ rằng nó không thể tránh khỏi để nói rằng bất kỳ trường hợp diễn viên kiên trì chỉ có thể chịu trách nhiệm về tình trạng riêng của mình. Mối quan tâm của tôi xung quanh câu hỏi 'điều gì sẽ khiến một diễn viên trẻ bị phục hồi sau khi cha mẹ của nó được phục hồi?' Tôi nghĩ câu trả lời là không cần thiết. Một diễn viên con sẽ chỉ được phục hồi khi nó được tham chiếu trực tiếp. Nó có vẻ là một lỗi thể loại để cố gắng xử lý đồ thị của các diễn viên như một cấu trúc dữ liệu theo đúng nghĩa của nó. – Brendan

Trả lời

2

Trên phản ánh, tôi nghĩ rằng việc tạo một diễn viên liên tục từ một diễn viên khác là một hành động tạo trạng thái, mặc dù được thuê ngoài. Điều đó có nghĩa là sự kiện kích hoạt quá trình tạo sẽ kích hoạt cùng một sáng tạo đó trong lần phát lại tiếp theo. Điều này làm cho tôi nghĩ rằng việc chuyển sự kiện (chứ không phải là lệnh gói) có thể là điều sạch nhất để làm vì cùng một sự kiện có thể được áp dụng để cập nhật trạng thái ở cả cha lẫn mẹ. Không cần phải kiên trì sự kiện khi nó đến với đứa trẻ - nó đã được lưu giữ trong phần tử cha và sẽ phát lại.

+0

sẽ làm việc này chiến lược (tạo ra các diễn viên trẻ thông qua phát lại) trong trường hợp ảnh chụp nhanh? tức là khi ứng dụng được khởi động lại và nếu ảnh chụp nhanh được sử dụng, không phải tất cả các tin nhắn đều sẽ được phát lại. – flare

+0

@flare đó là một điểm tuyệt vời, và tôi nghĩ rằng câu trả lời là một vang dội 'không, điều này sẽ không hoạt động'. Tôi trở lại Akka sau một khoảng trống và tôi nghĩ tôi sẽ phải suy nghĩ thẳng thắn trước khi tiếp tục. Cảm ơn! – Brendan

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