7
5
私は現在、私たち/アプリケーションがLAN上で実行されている同じアプリケーション名(以降、ノードと呼ばれる)を持つアプリケーションの他のインスタンスを検出できるようにする必要があるプロジェクトに参加しています。
前提条件:すべてのノードは自身のIPアドレスとTCPポート番号を知っているすべてのノードは名前を持っているすべてのノードはLANにアクセスできる
必要なもの
すべてのノードは、お互いのノードのIPアドレスとTCPポートを知る必要があります。 ノードがダウンした場合、プログラムでこれを通知する必要があります。 新しいノードが起動した場合、これをプログラムで通知する必要があります。 マスターサーバーや他のアプリケーションが必要ないことは必須です。現在のアプリケーションに統合できるAPIでなければなりません。 また、オープンソースであり、できればMITまたはApacheV2のライセンスが必要です。
それで全部です!
アプリケーションはJVMベースなので、どのAPIでも実行できます。 私はZooKeeperを見てきましたが、私たちが必要とする小さな機能にはかなり大きな依存関係があるようです。
また、APIを知らないが、自分で書くことでこれを達成する方法(ホワイトペーパー、ブログ、書籍、その他)として共有できるリンクがあれば、そのようなことも喜んで受け入れます。
質問は、どうすればいいですか?
4 Answer
5
2
すべて同じサブネット上にいる場合、簡単な解決策はhttp://www.sm.luth.se/~peppar/java/multicast_example/ [マルチキャストソケット]を使用することです。 アドレスを選択して(構成可能にします)、新しいインスタンスが起動すると、マルチキャスト「ping」を送信します。 これは他のサーバーに通知します。
もちろん、これはインスタンスがダウンしたときに通知しません。 それには2つの選択肢があります。
pingを頻繁に実行し、特定のpingを受信できない場合 インスタンスがダウンしていると想定する時間。または
新しいインスタンスが通知されたら、TCP接続を開いて そのインスタンス。 ソケットを開いたままにするためにソケットをpingする必要はあまりありません(非アクティブになると最終的に強制終了されます)。ソケットタイムアウトの反対側またはTCPセマンティクスによって閉じられたことが通知されます。
これを監視し、適切なイベントをトリガーするには、1〜2個のスレッドが必要です。
1
この種のものには多くのオプションがありますが、私のお気に入りはhttp://www.hazelcast.com/[hazelcast]です。これはApacheライセンスであり、依存関係がなく、構成も最小限です。
より確立されたオプションはhttp://www.jgroups.org/[jgroups]です。これはLGPLの下でライセンスされています。
1
絶対に最も簡単な方法-私の意見では最も簡単な方法-これを行うにはZeroConfを使用します!
各ノードは自分自身をアナウンスし、他のノードが現れて消えるのを聞きます。 中央のレジストリはなく、マルチキャストDNSのみ。 OS Xを見てください。
移植可能なアプローチは、jmdns-http://jmdns.sourceforge.net/を使用することです-OS Xの方法は、Apple Javaファサードを使用することです。