【问题标题】:Do JNDI lookups keep their connection open - and is this why my load balancing is broken?JNDI 查找是否保持连接打开 - 这就是我的负载平衡被破坏的原因吗?
【发布时间】:2012-05-08 16:09:52
【问题描述】:

我们有几台 JBoss 服务器位于使用循环策略的硬件负载平衡器后面。我们所有的(JBoss)客户端过去都偶尔连接,这些客户端会正确地进行负载平衡。但是,一个新客户端每分钟发送约 100 个查询,这些查询都被定向到同一台服务器。

我想正在发生的事情是远程客户端创建了它的初始上下文,进行查找,并在一段时间(大约 15 秒)内保持与 JNDI 服务器的连接,以节省重新创建连接的开销。这意味着第 2 个和第 N 个请求将发送到同一台服务器。我们用以下代码证明了这一点(Jython 使用 JBoss 库):

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 重新协商它的初始连接?

【问题讨论】:

  • JNDI 只是一个 API,它没有说明协议或连接管理。这是特定于实现的,在这个 JBoss 的 JNP 协议中。
  • 您是否启用了会话粘性?然后是它的预期行为。
  • @mazaneicha 不,它不粘

标签: java jboss jndi


【解决方案1】:

也许吧。 JNDI 是一种对象缓存。因此,如果您在同一个 VM 中多次询问相同的名称,您总是会得到相同的结果。这是正确的行为,但你不喜欢它。

解决方案是在 JNDI 中注册工厂而不是实例本身。这样,工厂可以从 JNDI 获取创建连接的信息,但每次调用它时都会返回一个新实例(或从内部池返回一个)。

同样的方法用于 JDBC。不是将 JDBC 连接添加到 JNDI 缓存,而是添加了 DataSource - 这是 JDBC java.sql.Connection 实例的工厂。

【讨论】:

  • 感谢 Aaron,这是一种看待事物的有用方式 - 我认为这基本上归结为我们对 JBoss 所做的一些错误假设。
  • 或许有用,但大错特错。 JNDI 规范没有强制要求任何特定的缓存行为,从同一个 VM 进行两次 JNDI 查找很可能会产生两个不同的结果。工厂“解决方案”也用于 EJB 规范。 JNDI 查找确实为您提供了一个工厂,您必须在其上调用 create() 以获取实际的远程存根。但是,在这种情况下,它不能解决您的问题,因为工厂也不知道负载均衡器和其他集群节点。
【解决方案2】:

您忘了告诉我们硬件负载平衡器实际上是在“平衡”什么。

由于我无法想象硬件负载平衡器知道专有的 JBoss 远程处理协议,所以在您的情况下,很可能只是负载平衡 JNDI 查找。这意味着您从同一个 InitialContext 获得的所有客户端存根最终都将转到同一个物理服务器。

如果硬件负载平衡器应该循环每个请求,远程调用必须通过负载平衡器支持的协议进行,例如HTTP。如果您正确配置它,JBoss 应该支持它。

当然,您也可以设置一个“真正的”JBoss 集群,让 JBoss 代码处理负载平衡和故障转移,但是 JBoss 集群代码错误多且脆弱,您很可能会破坏其他东西这种方法。

【讨论】:

  • 这是一个 7 级负载均衡器,你是对的。但是我们不控制环境——也没有时间改变技术,所以我们目前正在寻找解决方法。非常感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 2015-02-27
  • 2018-01-03
  • 2020-04-11
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
相关资源
最近更新 更多