使用Apache Camel和Netty进行负载平衡TCP流量会导致事务失败



我是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页面上提到的多个选项,比如:

  • 增加积压
  • keepAlive
  • buffersizes
  • 超时
  • poolSizes
  • workerCount
  • 同步
  • 流缓存(不工作)
  • 为性能禁用了useOriginalMessage
  • 系统级TCP参数等。
我还没有解决这个问题。我不确定我是否从根本上错过了什么。我确实看了一下编码器/解码器,并猜测这是否可能是一个问题。但是,我不明白为什么负载均衡器需要编码/解码消息。我曾经使用过其他负载平衡器,它们只需要端点配置,因此,我假设Camel不需要这个。我说的对吗?请知道,问题不在于我的客户端/后端,因为我从客户端到后端运行了2000个用户负载测试,失败不到1%,但看到Camel出现了大量失败(并不是没有成功)。我有以下问题:

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

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

3。我需要编码器/解码器还是应该这样配置工作?

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

如果你有任何其他建议,请让我知道。TIA。

Edit1:

我也对nety4和mina组件尝试了相同的方法。这条路线看起来和《netty》中的路线很相似。带nety4的路由如下:from("netty4:tcp:\this-ip:9445?defaultCodec=false&sync=true").to("netty4:tcp:\backend1:9445?defaultCodec=false&sync=true")我读了一些有同样问题的帖子,但没有找到任何与我的问题相关的解决方案。

Edit2:

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

from("netty:tcp://this-ip:9445?sync=true&allowDefaultCodec=false&workerCount=20&requestTimeout=30000") .threads(20) .loadBalance() .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);

你能告诉我怎样才能减少个人交易时间吗?

对于nety4组件,没有名为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工具(如socketttest)发送测试消息,以验证一切正常。然后通过Camel实现相同的功能。您可以在这里找到socketttest http://sockettest.sourceforge.net/.

我最终用相同的路由设置解决了这个问题。问题在于请求和响应分隔符配置不正确,因为它要么过早关闭连接,导致意外的缓冲区大小,要么在接收到整个缓冲区后等待太长时间,导致高响应时间。

最新更新