ラウンドロビン戦略を使用して、ハードウェアロードバランサーの背後に複数のJBossサーバーが配置されています。すべての(JBoss)クライアントは散発的に接続していましたが、これらは正しく負荷分散されていました。ただし、新しいクライアントは1分間に最大100のクエリを送信しており、これらはすべて同じサーバーに送信されています。
リモートクライアントが初期コンテキストを作成し、ルックアップを実行し、接続の再作成のオーバーヘッドを節約するためにJNDIサーバーへの接続を一定期間(約15秒)維持することが起こっていると思います。これは、2番目とN番目のリクエストが同じサーバーに送信されることを意味します。これを次のコードで証明しました(JBossライブラリを使用するJython)。
def __call__(self):
p = Properties()
p[Context.PROVIDER_URL] = "jnp://my.load.balancer:1099"
p[Context.INITIAL_CONTEXT_FACTORY] = JndiLoginInitialContextFactory.name
p[Context.SECURITY_PRINCIPAL] = <redacted>
p[Context.SECURITY_CREDENTIALS] = <redacted>
ctx = InitialContext(p)
home = ctx.lookup("ejb/ServerNameService")
ejbQuery = home.create()
print "Server name: %s", (ejbQuery.getServerName())
ctx.close()
これで、同じJVM(複数のスレッド)内で100回呼び出すと、常に同じサーバーになります。新しいJVMでそれを100回呼び出すと、混合が発生します。
クラスタリングテクノロジを使用せずに、JNDIに最初の接続の再ネゴシエーションを強制する方法はありますか?