gpt4 book ai didi

tcp - 使用带 Netty 的 Apache Camel 负载平衡 TCP 流量导致事务失败

转载 作者:可可西里 更新时间:2023-11-01 02:53:58 30 4
gpt4 key购买 nike

我是 Apache Camel 和 Netty 的新手,这是我的第一个项目。我正在尝试将 Camel 与 Netty 组件一起使用,以在后端负载测试场景中对繁重的流量进行负载平衡。这是我现在的设置:from("netty:tcp:\\this-ip:9445?defaultCodec=false&sync=true").loadBalance().roundRobin().to("netty:tcp:\\backend1:9445?defaultCodec=false&sync =true,netty:tcp:\\backend2:9445?defaultCodec=false&sync=true)

问题是我在客户端系统向 Camel 发送 tcp 流量时看到的响应中收到的意外缓冲区大小。当我一个接一个地发送多个请求时,我没有发现任何问题,并且缓冲区大小符合预期。但是,当我尝试让多个用户在同一个端口上向 Camel 发送类似的请求时,我间歇性地看到意外的缓冲区大小,有时是 0 字节,有时甚至大于预期的字节数。我尝试使用 Camel-Netty 页面中提到的多个选项,例如:

  • 增加积压
  • 保持活力
  • 缓冲区大小
  • 超时
  • 池大小
  • worker 数
  • 同步
  • 流缓存(没用)
  • 为了性能禁用了 useOriginalMessage
  • 系统级 TCP 参数等。

我还没有解决这个问题。我不确定我是否从根本上遗漏了什么。我确实查看了编码器/解码器并猜测这是否是一个问题。但是,我不明白为什么负载均衡器需要编码/解码消息。我曾与其他只需要端点配置的负载均衡器一起工作,因此,我假设 Camel 不需要这个。我对吗?请注意,问题不在于我的客户端/后端,因为我从客户端到后端运行了 2000 个用户负载测试,失败率不到 1%,但使用 Camel 时看到了大量失败(并不是说没有成功)。我有以下问题:

1.这是 Apache Camel-Netty 的有效用例吗?我应该看米娜还是其他人?

2.我可以尝试将 tcp 流量路由到 JMS 或其他组件,然后最终路由到 tcp 端点吗?

3.我需要编码器/解码器吗?或者这个配置应该有效吗?

4.我应该继续使用这种方法还是尝试其他负载均衡器?

如果您有任何其他建议,请告诉我。 TIA。

编辑1:

我还对 netty4 和 mina 组件尝试了相同的方法。该路由看起来类似于 netty 中的路由。使用netty4的路由如下:from("netty4:tcp:\\this-ip:9445?defaultCodec=false&sync=true").to("netty4:tcp:\\backend1:9445?defaultCodec=false&sync=true")我阅读了一些具有相同问题的帖子,但没有找到与我的问题相关的任何解决方案。

编辑2:

我增加了客户端的接收超时,并立即注意到预期缓冲区长度问题的不匹配下降到不到 1%。但是,我看到使用 Camel 和不使用它时每个事务的响应时间都很大;几乎高出 10 倍。你能帮我减少每笔交易的响应时间吗?我的客户端收到的消息从 5000 字节到 20000 字节不等。这是我的最新路线:

from("netty:tcp://this-ip:9445?sync=true&allowDefaultCodec=false&workerCount=20&requestTimeout=30000")
.线程(20)
。负载均衡()
.roundRobin()
.to("netty:tcp://backend-1:9445?sync=true&allowDefaultCodec=false","netty:tcp://backend-2:9445?sync=true&allowDefaultCodec=false")

我还使用了某些性能增强功能,例如:context.setAllowUseOriginalMessage(false);
context.disableJMX();
context.setMessageHistory(false);
context.setLazyLoadTypeConverters(true);

关于如何减少单个交易时间,您能否指出正确的方向?

最佳答案

对于 netty4 组件,没有名为 defaultCodec 的参数。它被称为 allowDefaultCodec。 http://camel.apache.org/netty4.html另外,首先尝试这样的事情。

from("netty4:tcp:\\this-ip:9445?textline=true&sync=true").to("netty4:tcp:\\backend1:9445?textline=true&sync=true")

以上表示发送的数据是普通文本。如果您要发送字节或其他内容,则需要为 netty 提供解码/编码以处理数据。

还有一个旁注。在运行 Camel 路由之前,手动测试以通过标准 tcp 工具(如 sockettest)发送测试消息,以验证一切正常。然后通过 Camel 实现相同的。您可以在这里找到 sockettest http://sockettest.sourceforge.net/ .

关于tcp - 使用带 Netty 的 Apache Camel 负载平衡 TCP 流量导致事务失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39180398/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com