2011-01-31 27 views
11

Tôi đang sử dụng MailboxProcessor lớp học để giữ các đại lý riêng biệt làm việc của riêng họ. Thông thường các tác nhân có thể giao tiếp với nhau trong cùng một quy trình, nhưng tôi muốn các nhân viên nói chuyện với nhau khi họ đang ở trên các quy trình riêng biệt hoặc thậm chí các máy khác nhau. Loại cơ chế nào là tốt nhất để thực hiện giao tiếp giữa chúng? Có một số giải pháp tiêu chuẩn?Truyền tin nhắn giữa các Nhà cung cấp hộp thư từ xa?

Xin lưu ý rằng tôi đang sử dụng các phiên bản Ubuntu để chạy tác nhân.

+7

Ai đã bỏ phiếu này là 'chủ đề không chính thức'? Nếu bạn không hiểu câu hỏi, xin đừng can thiệp vào nó. –

+1

http://stackoverflow.com/questions/501656/f-mailbox-processor-on-distributed-systems có thể cung cấp một số thông tin chi tiết. –

+0

có thể xem cửa sổ hàng đợi xanh. Những gì họ sử dụng để cho các máy khác nhau (họ gọi họ là vai trò công nhân) nói chuyện với nhau. Những gì bạn có thể làm là có một tác nhân trên mỗi máy có trách nhiệm giao tiếp với những người khác để yêu cầu công việc, thông báo công việc được thực hiện vv .. – jlezard

Trả lời

3

Tôi nghĩ bạn sẽ viết các thói quen của riêng bạn để sắp xếp các thông điệp, chuyển chúng qua các ranh giới quy trình và sau đó gửi chúng ở phía bên kia. Điều này cũng sẽ yêu cầu thực hiện một hệ thống ID trong đó mỗi hộp thư có một ID và các tiến trình có thể gửi tin nhắn tới các ID thay vì chỉ là Mailbox.Send. Điều này không dễ, vì các hộp cục bộ sẽ có thể truy cập vào bộ nhớ cục bộ, nhưng các hộp thư từ xa sẽ không hoạt động.

Tôi sẽ xem xét một thứ như RPyC (http://rpyc.wikidot.com/) vì nó cung cấp một giao thức giống như bạn đang tìm kiếm.

Về cơ bản câu trả lời là 'không' không thực sự là một cách hay để thực hiện việc này.

+0

bạn có biết cách thức này sẽ được thực hiện bằng các ngôn ngữ khác có đại lý: Erlang, Scala và co? Cảm ơn! – jlezard

+0

Vâng, trong Erlang, bạn không có bộ nhớ dùng chung. Mỗi "thread" thực sự là một quá trình riêng biệt. Vì vậy, khi bạn nói 'pid! "foo" 'pid chỉ đơn giản là một id của một quá trình mà' "foo" 'được gửi tới. Vì không có bộ nhớ chia sẻ, và các tiến trình đã có sẵn, kết nối mạng đơn giản như tạo từ điển pid tới ánh xạ IP và truyền thông điệp dựa trên thông tin đó. Vấn đề với phương pháp này là tất cả các thông tin liên lạc phải được thực hiện thông qua tin nhắn đi qua, và hiện cũng liên quan đến một bản sao bộ nhớ của tin nhắn. Hiệu suất khôn ngoan này không phải lúc nào cũng tốt nhất. Tôi không có kinh nghiệm với Scala. –

+0

Và tôi nên claify, quá trình Erlang không phải là quá trình hệ điều hành, họ là các quá trình VM. Một quá trình Erlang có một chi phí bộ nhớ của một vài trăm byte. Một quá trình hệ điều hành có một chi phí trong phạm vi đa KB. –