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