2013-09-05 33 views
9

Tôi đang cố gắng tìm cách tiếp cận tốt nhất để chia sẻ cùng một nhóm kết nối giữa các diễn viên với các nhân viên cụm. Tôi có cấu trúc sau:Akka và ReactiveMongo

Thạc sĩ diễn viên -> Diễn viên lao động (có thể lên đến 100 hoặc hơn) -> MongoDB

giữa người lao động và MongoDB Tôi muốn đặt reactivemongo, tuy nhiên tôi không chắc chắn cách chính xác để cung cấp chia sẻ kết nối giữa tất cả các diễn viên.

Theo reactivemongo tài liệu:

Một MongoDriver dụ quản lý một hệ thống diễn viên; một kết nối quản lý một nhóm các kết nối. Nói chung, MongoDriver hoặc tạo một MongoConnection không bao giờ được khởi tạo nhiều hơn một lần. Bạn có thể cung cấp một danh sách gồm một máy chủ nữa; trình điều khiển sẽ đoán nếu đó là một máy chủ độc lập hoặc một cấu hình thiết lập bản sao. Ngay cả với một nút bản sao, trình điều khiển sẽ thăm dò các nút khác và thêm chúng tự động.

Tôi có nên tạo nó trong diễn viên chính và sau đó đóng gói với mỗi thư không? Vì vậy, điều này sẽ có trong diễn viên chính:

val driver = new MongoDriver 
val connection = driver.connection(List("localhost")) 

Và sau đó tôi chuyển kết nối đến diễn viên trong thư. Hoặc tôi nên truy vấn một kết nối trong mỗi tác nhân làm việc và vượt qua chỉ trình điều khiển trong một tin nhắn?

Mọi trợ giúp đều được đánh giá cao. Cảm ơn.

Trả lời

14

Tôi sẽ tạo driverconnection trong tác nhân chính. Sau đó tôi sẽ thiết lập các nhân viên công nhân để lấy một ví dụ của MongoConnection làm một đối số hàm tạo để mỗi nhân viên có một tham chiếu đến kết nối (mà thực sự là một proxy cho một nhóm các kết nối). Sau đó, trong một cái gì đó như preStart, hãy tạo ra các tác nhân chính (mà tôi giả sử được định tuyến) và cung cấp kết nối như là một arg. Một ví dụ rất đơn giản có thể trông giống như sau:

class MongoMaster extends Actor{ 
    val driver = new MongoDriver 
    val connection = driver.connection(List("localhost")) 

    override def preStart = { 
    context.actorOf(Props(classOf[MongoWorker], connection).withRouter(FromConfig())) 
    } 

    def receive = { 
    //do whatever you need here 
    ... 
    } 
} 

class MongoWorker(conn:MongoConnection) extends Actor{ 
    def receive = { 
    ... 
    } 
} 

Mã này không chính xác, nhưng ít nhất nó cho thấy các khái niệm mức cao tôi mô tả.

+0

Cảm ơn câu trả lời của bạn, điều này có vẻ tốt, tôi sẽ thử. –

6

Câu trả lời bằng cmbaxter hoạt động miễn là bạn không cần phải khởi tạo diễn viên công nhân từ xa. MongoConnection không phải là serializable.

Tôi tìm thấy bài viết này https://github.com/eigengo/akka-patterns/wiki/Configuration rất hữu ích. Ý tưởng cơ bản là thực hiện một đặc điểm có tên là Configured, được điền bởi ứng dụng chính. Các diễn viên sau đó có thể sử dụng đặc điểm đó để truy cập vào các đối tượng cục bộ, không thể tuần tự hóa như MongoConnection.

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