【问题标题】:Cloud Foundry load balancing instancesCloud Foundry 负载平衡实例
【发布时间】:2018-03-27 15:34:56
【问题描述】:

我有一个 java servlet 应用程序 (.war)。应用程序本身是无状态的,只进行计算。它通过 REST API(使用 Jersey 2 实现)公开其功能。我正在使用多个实例在 Cloud Foundry 上部署应用程序,但结果是所有请求都仅转发到 1 个实例,并且始终是同一个实例。

该应用有一个路由,我可以使用 X-CF-APP-INSTANCE 标头向特定实例发送请求,但我希望我的实例能够自行平衡。

根据 Cloud Foundry 文档,gorouter 在选择应为请求提供服务的实例时应使用循环策略。我是否遗漏了配置中的某些内容,或者是否有人经历过这样的行为?

【问题讨论】:

  • 您使用的请求批次大小是多少?您是否运行了一批请求(例如 20、40 或 100 个)并查看哪个应用程序实例如何处理它们?您在日志中看到了什么应用实例 ID?
  • 负载平衡应该自动发生。它不会的主要原因是如果您使用会话。如果设置了 JSESSIONID,您最终将获得粘性会话,并且请求将转到同一个应用程序实例。您如何向应用程序发送请求?您可以尝试使用curl 之类的方法来发送请求吗?默认情况下,这不会维护会话,因此它应该在所有应用程序实例之间循环。另外,检查curl -vv 的详细输出,看看服务器是否正在尝试为 JSESSIONID 设置 cookie。
  • 首先 - 感谢您的提示。我肯定有负载平衡的问题。无论我如何发送请求(curl、swagger、jmeter、浏览器休息扩展),它们总是会发送到同一个实例。 “cf logs”证实了这一点,我可以看到 [APP/PROC/WEB/0] 或 [APP/PROC/WEB/1] 例如 0 或 1。我能够使用 X-CF-APP- 处理单个实例INSTANCE 标头...

标签: cloud-foundry


【解决方案1】:

两个应用程序之间的问题是使用带有 http 连接池 (PoolingHttpClientConnectionManager) 的 Jersey 客户端。我在开始时将 Client 对象创建为 Spring Bean,并将其配置为从池中获取免费连接。从 ClientConfig 中删除池并使用新创建的 Client 对象导致请求得到正确的负载平衡。

【讨论】:

    猜你喜欢
    • 2015-12-24
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    相关资源
    最近更新 更多