【问题标题】:Load balancing TCP traffic using Apache Camel with Netty leads to transaction failures使用带有 Netty 的 Apache Camel 对 TCP 流量进行负载平衡会导致事务失败
【发布时间】:2017-01-03 23:00:38
【问题描述】:

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

  • 积压增加
  • 保持活动状态
  • 缓冲区大小
  • 超时
  • 池大小
  • workerCount
  • 同步
  • 流缓存(无效)
  • 禁用 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 和不使用 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);

您能否指出我如何减少个人交易时间的正确方向?

【问题讨论】:

  • 为什么不使用netty4,因为以前的netty组件已被弃用?除非您需要对数据进行编码和解码,否则您可以让 allowDefaultEncoding。
  • 当我没有指定defaultCodec=false 时,设置不起作用。我也尝试使用 netty4,但无法正常工作。将再试一次并发布更新。
  • @SoucianceEqdamRashti 我用 netty4 尝试了同样的事情,但得到了一个例外。下面是堆栈跟踪:io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1 at io.netty.buffer.AbstractReferenceCountedByteBuf.release(AbstractReferenceCountedByteBuf.java:115) at io.netty.util.ReferenceCountUtil。在 io.netty.channel.ChannelOutboundBuffer.fail(ChannelOutboundBuffer.java:252) 处发布(ReferenceCountUtil.java:53)
  • 你的路由改成netty4后怎么样了?你能更新问题吗?
  • @SoucianceEqdamRashti 用我尝试使用 netty4 和 mina 的任何方法编辑了这个问题。不确定它是否与编码器/解码器有关。编码器/解码器的问题意味着一个请求都不会成功,对吧?

标签: tcp apache-camel netty load-balancing


【解决方案1】:

对于 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/

【讨论】:

  • 这里的问题与 Camel 的功能无关。我非常能够使用使用 Netty 的路线。它是关于大小在 5000 到 15000 字节范围内的单个 tcp 事务的性能和高响应时间。你有什么正确方向的指点吗?
  • 您的响应时间是多少?你确定是骆驼是问题吗?我使用过 Netty 组件,10 次中有 9 次是后端响应时间过长。如果这就是您的全部路线,那么根本不需要很长时间。启用 auditeventnotifier 以查看路线的不同部分需要多长时间,但我猜罪魁祸首是后端。
  • 后端的响应时间约为 1 到 3 秒。我正在运行测试以确保问题也不在于 App 服务器。我会及时通知你调查结果。您是否对您的项目进行了任何调整以优化 tcp 流量负载平衡?您能否发布您的 Camel-Netty 路由以及您认为可能对吞吐量和响应时间产生积极影响的任何其他配置?
  • 好的,后端的响应是 1-3 秒,客户端多久收到响应?我的路线看起来与您的路线非常相似,只是我添加了解码器和编码器以转换字节消息。
  • 将以下代码添加到您的路线中,以查看每个步骤需要多长时间。 camel.apache.org/…
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-06-04
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 2018-12-20
    • 2012-02-13
    • 2018-03-12
    • 2013-03-24
    相关资源
    最近更新 更多