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

时间:2016-08-27 11:04:46

标签: tcp apache-camel netty load-balancing

我是Apache Camel和Netty的新手,这是我的第一个项目。我正在尝试使用带有Netty组件的Camel来在后端负载测试场景中负载平衡大量流量。这是我现在的设置: 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)

问题是我在客户端系统中发现的响应中收到的意外缓冲区大小,这些响应将tcp流量发送给Camel。当我一个接一个地发送多个请求时,我看到没有问题,缓冲区大小是预期的。但是,当我尝试运行多个用户在同一端口上向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:

我也尝试过与netty4和mina组件相同的方法。该路线看起来类似于netty中的路线。 netty4的路由如下: 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);

你能指出我如何减少个人交易时间吗?

2 个答案:

答案 0 :(得分:0)

对于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实现相同的功能。你可以在http://sockettest.sourceforge.net/找到sockettest。

答案 1 :(得分:0)

我终于用上面相同的路线设置解决了这个问题。问题在于请求和响应分隔符未正确配置,因为它过早地关闭连接导致意外的缓冲区大小,或者即使在收到整个缓冲区导致高响应时间之后它也等待太长时间。