【发布时间】: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