2012-09-06 23 views
12

Tôi đang phát triển trong Vert.x (dựa trên Netty và Hazelcast), và tôi đang cố gắng chia sẻ dữ liệu giữa hai cá thể máy chủ (mỗi trường hợp trong các máy khác nhau, trên cùng lan).Clustering and Shared Data trong Vert.x

Vấn đề của tôi là tôi không biết cách định cấu hình các máy chủ vert.x để cho phép họ chia sẻ bản đồ bộ nhớ đồng thời của họ (lý thuyết cho biết điều đó là có thể).

Tôi đã đọc nhiều tài liệu từ Vert.x và Hazelcast nhưng chưa có kết quả. (Tôi không biết làm thế nào để lực lượng vert.x để tải các tập tin cấu hình xml hazelcast).

Cảm ơn trước!

Trả lời

4

Afaik bạn không thể chia sẻ dữ liệu giữa các trường khác nhau của vert.x - từ tài liệu

"[...] một trường hợp sử dụng như vậy là tốt hơn giải quyết bằng cách cung cấp một cấu trúc bản đồ chia sẻ rằng có thể được truy cập trực tiếp bởi các cá thể verticle khác nhau trong cùng một thể hiện vert.x. "

Vì "thể hiện vert.x" có nghĩa là "thể hiện jvm" bạn không thể sử dụng sharedmap/set giữa jvm khác nhau. Bạn có thể sử dụng xe buýt sự kiện cho việc này.

+2

Tôi không hoàn toàn quen thuộc với vert.x & không cố gắng để không đồng ý với tuyên bố của bạn - điều này ta có thể sử dụng Hazelcast (bản đồ được nhân rộng). –

+0

@castarco Tài liệu cũng cho biết: "Trong các phiên bản sau của vert.x, chúng tôi muốn mở rộng điều này để cho phép dữ liệu được chia sẻ bởi tất cả các phiên bản vert.x trong cụm." Vì vậy, hãy theo dõi điều đó. –

+0

@CarloBertuccini có cách nào để sử dụng cấu trúc dữ liệu Hazelcast trong Vert.x không? –

2

Như đã được chỉ ra, các đối tượng chia sẻ dữ liệu được gói trong Vert.x không hỗ trợ chia sẻ dữ liệu trên nhiều phiên bản Vert.x. Để thực hiện điều đó, bạn phải thực hiện:

  1. Sử dụng cơ sở dữ liệu được chia sẻ "bình thường".
  2. Thiết lập Verticle quản lý các trường hợp SharedMap và xuất bản và lắng nghe các bản cập nhật đến và từ phần còn lại của cụm.
  3. Thiết kế ứng dụng của bạn để bạn không cần phải chia sẻ dữ liệu theo cách này.
7

Có những lựa chọn để chia sẻ dữ liệu giữa các trường Vertx trên các máy khác nhau

Lựa chọn 1.

Bạn có thể sử dụng Vert.x ClusterManager và đó là bản đồ:

ClusterManager clusterManager = ((VertxInternal)vertx).clusterManager(); 
Map map = clusterManager.getSyncMap("mapName"); // shared distributed map 

Bản đồ đó được hỗ trợ bởi một IME Hazelcast và được phân phối. Điều này giả định bạn đang chạy vertx với tham số -cluster và đã định cấu hình phân cụm.

Tuy nhiên, lưu ý rằng đây là API nội bộ và thường không được khuyến nghị cho sản xuất. Nếu bạn đang làm một thử nghiệm một lần thì nó có thể hữu ích.

Lựa chọn 2.

Bạn có thể nhận được quyền truy cập vào Hazelcast lần Vertx được bắt đầu trong chế độ clustered:

Set<HazelcastInstance> instances = Hazelcast.getAllHazelcastInstances(); 
    HazelcastInstance hz = instances.stream().findFirst().get(); 
    Map map = hz.getMap("mapName"); // shared distributed map 
+0

Đã đi với tùy chọn 1 và gói nó trong một lớp học. Nếu chúng tôi muốn cập nhật vertx trong tương lai, điều này sẽ xảy ra, chúng tôi sẽ có một điểm dừng mua sắm. FYI mục đích là để đăng ký cho các thông báo để giám sát cho các nút bị downed. – fionbio

3

Vert.x 2 không hỗ trợ chia sẻ dữ liệu theo cụm rộng. Tuy nhiên, Vert.x 3 hiện ra một API không đồng bộ bao bọc trình quản lý cụm Hazelcast bên dưới.

Dành cho Vert.x 2, tuy nhiên, bạn có thể sử dụng cá thể Hazelcast trực tiếp trong các đỉnh công nhân của bạn. Chỉ cần sử dụng phương pháp tĩnh Hazelcast của để có được những ví dụ Vert.x Hazelcast:

HazelcastInstance hazelcast = Hazelcast.getAllHazelcastInstances().iterator().next(); 

Lưu ý rằng bạn chỉ nên truy cập vào API Hazelcast trực tiếp theo cách này từ bên trong một verticle nhân. Hazelcast API đang chặn, do đó, nó sẽ chặn vòng lặp sự kiện nếu được sử dụng trong một verticle bình thường.

3

Với Vert.x 3 - nếu bạn định cấu hình các phiên bản Vert.x của mình thành "chế độ nhóm" (có thể đơn giản như thêm -cluster vào dòng lệnh của trình khởi chạy Vert.x, see here for details), thì bạn có thể sử dụng giao diện SharedData để truy cập vào "bản đồ phân tán" cho phép các thành viên cụm đọc và ghi dữ liệu trên toàn bộ cụm một cách minh bạch.

Ví dụ:

if (vertx.isClustered()) { 
    log.info("Using clustered data store"); 
    vertx.sharedData().<String, MyEntity>getClusterWideMap("entities", 
      res -> { 
       AsyncMap<String, MyEntity> dataMap = res.result(); 
       setDataStore(dataMap); 
      }); 
}