0

初心者アラート。

Vertx で、10 秒ごとにデータベース (PostGres) をポーリングし、結果をクライアントにプッシュする単純なモジュールを作成しようとしています。ブロッキング コード (JDBC を介してデータベースにクエリを実行する) をワーカー バーティクルに限定することを考えています。上記の残りのレイヤーは完全にノンブロッキングで非同期です。

このモジュールは jar としてパッケージ化され、javascript ブリッジを介してイベント バスにサブスクライブできる別のアプリ (通常は webapps) に配布されます。

ここでの私の質問は、頂点モジュールで実行されている webapp の 5 つのプロセスがあるクラスター化された環境にあります。データベースをクエリする頂点頂点が 1 つだけであることを確認するにはどうすればよいですか。すべてのバーティクルがデータベースにクエリを実行して、さらに負荷がかかるのは望ましくありません。または、この問題を解決するために考える別の方法がありますか。Vertx バージョン 3.4.1 を使用しています

4

2 に答える 2

0

ここで私の単純な解決策を提示します。それがあなたの問題を完全に解決するかどうかはわかりませんが、私の思考プロセスは次のとおりです。

1)ポーリングビット、はい、確かに、呼び出しをブロックするためのワーカーバーチクルを使用できます[または、10秒ごとの部分に対して、非同期ポストグレスJDBCクライアントが既にあるため、ここでも非同期ビットを使用できます]。このようなコードスニペットはあなたを助けることができます

vertx.setPeriodic(10000, id -> {
  // This handler will get called every 10 seconds
  JsonObject jdbcObject = fetchFromJdbc();
  eventBus.publish("INTRESTED_PARTIES", jdbcObject); 
});

2) リスニング部分では、他のすべての verticles がイベント バスにサブスクライブし、そのアドレスをリッスンして、何かが起こるたびにメッセージを受け取ることができます。

3) これは、jar のすべての実行中のインスタンスがデータベースのポーリングを開始しないようにするためのものです。これを処理する最善の方法は、任意の jar にバーティクルをデプロイせず、ランタイム vertx を使用してスタンドアロンの方法でバーティクルを実行することだと思います。のようなコマンド

vertx run DatabasePoller.java -cluster

また、非常に凝ったものにしたい場合は、特定のサービスが既に登録されている場合、他のデプロイが登録をトリガーしないようにするために、 Service Discoveryを投入できます。

しかし、システム間通信を処理するためのはるかに優れた方法でその情報を取得するためのイベントを検討することに賛成したいと思います。

于 2017-04-22T14:39:48.290 に答える