17

私はVert.x(NettyとHazelcastに基づく)で開発しており、2つのサーバーインスタンス間でデータを共有しようとしています(同じLAN上の異なるマシンにあるこれらのインスタンスのそれぞれ)。

私の問題は、同時メモリマップを共有できるようにvert.xサーバーを構成する方法がわからないことです(理論によれば、それは可能です)。

Vert.xとHazelcastから多くのドキュメントを読みましたが、まだ結果がありません。(vert.xにhazelcast xml構成ファイルをロードさせる方法がわかりません)。

前もって感謝します!

4

5 に答える 5

11

異なるマシン上のvertxインスタンス間でデータを共有するためのオプションがあります

オプション1。

Vert.xClusterManagerとそのマップを使用できます。

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

そのマップはHazelcastIMapに支えられており、配布されています。-clusterこれは、パラメーターを指定してvertxを実行し、クラスタリングを構成していることを前提としています。

ただし、これは内部APIであり、通常、本番環境には推奨されないことに注意してください。一度だけ実験をしているなら、それは役に立つかもしれません。

オプション2。

vertxがクラスターモードで開始されると、Hazelcastにアクセスできるようになります。

Set<HazelcastInstance> instances = Hazelcast.getAllHazelcastInstances();
HazelcastInstance hz = instances.stream().findFirst().get();
Map map = hz.getMap("mapName"); // shared distributed map
于 2015-01-08T14:34:48.330 に答える
8

Vert.x 3の場合-Vert.xインスタンスを「クラスターモード」に構成する場合(これ-clusterは、Vert.xランチャーのコマンドラインに追加するのと同じくらい簡単です。詳細については、こちらを参照してください)、SharedDataインターフェイスを使用できます。クラスタメンバーがクラスタ全体でデータを透過的に読み書きできるようにする「分散マップ」にアクセスするため。

例:

if (vertx.isClustered()) {
    log.info("Using clustered data store");
    vertx.sharedData().<String, MyEntity>getClusterWideMap("entities", 
            res -> {
                AsyncMap<String, MyEntity> dataMap = res.result();
                setDataStore(dataMap);
            });
}
于 2017-02-05T14:26:08.923 に答える
4

vert.xの異なるインスタンス間でデータを共有することはできません-ドキュメントから

「[...]このようなユースケースは、同じvert.xインスタンス内の異なるバーティクルインスタンスから直接アクセスできる共有マップ構造を提供することで、より適切に解決されます。」

「vert.xinstance」は「jvminstance」を意味するため、異なるjvm間でsharedmap/setを使用することはできません。これにはイベントバスを使用できます。

他の人が反対票を投じる前に編集する:私の答えは、これが不可能だった6年前の2012年のものです。他の人がすでに言ったように今それは可能です

于 2012-10-22T19:40:10.953 に答える
3

Vert.x 2は、クラスター全体の共有データをサポートしていません。ただし、Vert.x 3は、基盤となるHazelcastクラスターマネージャーをラップする非同期APIを公開します。

ただし、Vert.x 2の場合、Hazelcastインスタンスをワーカーバーティクルで直接使用できます。Hazelcastの静的メソッドを使用して、Vert.xHazelcastインスタンスを取得するだけです。

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

この方法では、ワーカーバーティクル内からのみHazelcastAPIに直接アクセスする必要があることに注意してください。Hazelcast APIはブロックしているため、通常のバーティクルで使用するとイベントループがブロックされます。

于 2015-02-06T06:43:42.430 に答える
2

指摘されているように、Vert.xにバンドルされているデータ共有オブジェクトは、複数のVert.xインスタンス間でのデータ共有をサポートしていません。これを行うには、次のいずれかを行う必要があります。

  1. 「通常の」共有データベースを使用します。
  2. SharedMapインスタンスを管理し、クラスターの残りの部分との間で更新を公開およびリッスンするVerticleをセットアップします。
  3. この方法でデータを共有する必要がないようにアプリケーションを設計します。
于 2014-10-12T11:35:27.997 に答える