2016-08-27 1 views
1

Apache Camelと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)Apache CamelとNettyを使用してTCPトラフィックをロードバランシングするとトランザクションが失敗する

問題は私が受け取っている私がクライアントシステムで見ると、tcpトラフィックをCamelに送信します。複数の要求を1つずつ送信すると問題はなく、バッファサイズは期待通りです。しかし、同じポート上のCamelに同様の要求を送信する複数のユーザーを実行しようとすると、予期せぬバッファサイズが時々0バイトになることがあります。私のようなキャメル・ネッティーページに記載された複数のオプションで遊んでみました:

  • はバックログに
  • キープアライブ
  • buffersizes
  • タイムアウト
  • poolSizes
  • workerCount
  • 同期
  • を増やします
  • ストリームキャッシング(機能しなかった)
  • パフォーマンスのための無効な使用オリジナルのメッセージ
  • システムレベルのTCPパラメータなど。

私はまだ問題を解決していません。根本的に何かが欠けているかどうかはわかりません。私はエンコーダ/デコーダを見て、それが問題になるかどうか推測しました。しかし、ロードバランサがメッセージをエンコード/デコードする必要がある理由はわかりません。私はエンドポイントの設定が必要な他のロードバランサと協力してきました。したがって、私はCamelがこれを必要としないと仮定しています。私は正しい?私のクライアント/バックエンドでは、私のクライアントからバックエンドに2000%のユーザー負荷テストを実行したが、失敗率は1%未満でしたが、Camelでは多数の失敗が見られました(成功していないとは限りません)。私は以下の質問をしています:

1.これはApache Camel-Nettyの有効なユースケースですか?ミナなどを見ているべきですか?

2. tcpトラフィックをJMSやその他のコンポーネントにルーティングしてから、最後にtcpエンドポイントにルーティングできますか?

3.エンコーダ/デコーダが必要ですか?この設定は有効ですか?

4.このアプローチを続行するか、他のロードバランサを試すか?

他にもご提案がありましたら教えてください。 TIA。

EDIT1:

Iはまたnetty4とミナ成分と同じアプローチを試みました。ルートは、ネットのものと似ています。 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バイトです。 context.setAllowUseOriginalMessage(false); context.disableJMX(); context.setMessageHistory(false); context.setLazyLoadTypeConverters(true);

はあなたが私は、個々のトランザクション時間を短縮することができます方法については正しい方向に私を指すことができます:私はまた、のような特定の性能強化を使用

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")

:ここに私の最新のルートはありますか?

+0

なぜnetty4を使用していないのですが、以前のnettyコンポーネントは非推奨ですか?データのエンコードとデコードが必要な場合を除き、allowDefaultEncodingを許可することができます。 –

+0

'defaultCodec = false'を指定しないと、セットアップが機能しません。私もnetty4を使ってみましたが、動作させることができませんでした。もう一度試してアップデートを投稿します。 – bnsk

+0

@SoucianceEqdamRashti私はnetty4で同じことを試みましたが、例外が発生しました。以下は、スタックトレースです:** io.netty.util.IllegalReferenceCountException:REFCNT:0、デクリメント:1 \t io.netty.buffer.AbstractReferenceCountedByteBuf.releaseで(AbstractReferenceCountedByteBuf.java:115)io.netty.utilで \t .ReferenceCountUtil.release(ReferenceCountUtil.java:53) \t io.netty.channel.ChannelOutboundBuffer.fail(ChannelOutboundBuffer.java:252)** – bnsk

答えて

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のルートを実行する前に、手動でtesttestのような標準のtcpツールを使ってテストメッセージを送信し、すべてが動作することを確認してください。その後、Camel経由で実装します。 sockettestはhttp://sockettest.sourceforge.net/です。

+0

ここでの問題は、Camelの機能に関するものではありません。 Nettyを使用してルートを使用することができます。これは、5000〜15000バイトの範囲のサイズの個々のtcpトランザクションのパフォーマンスと高い応答時間に関するものです。あなたは正しい方向に指針を持っていますか? – bnsk

+0

あなたはどのような応答時間を得ていますか?それは問題なのですか?私はNettyコンポーネントを使用しており、10回中9回はバックエンドで応答に時間がかかりすぎました。そしてそれがあなたのすべてのルートであるならば、それはまったく時間がかかりません。auditeventnotifierを有効にして、経路のさまざまな部分の長さを確認しますが、原因はバックエンドだと思います。 –

+0

バックエンドの応答時間は約1〜3秒です。私は問題がAppサーバーでないことを確認するためにテストを実行しています。私は結果にあなたを掲載していきます。 tcpトラフィックのロードバランシングを最適化するために、あなたのプロジェクトにチューニングをしましたか? Camel-Nettyのルートと、スループットと応答時間にプラスの影響を与える可能性がある他の設定を投稿できますか? – bnsk

0

最後に、上記と同じルート設定で問題を解決しました。問題は、リクエストとレスポンスデリミタが正しく設定されていないために、接続が早過ぎて予期しないバッファサイズになったり、バッファ全体が受信されて応答時間が長くなってもあまりにも長く待っていたためでした。

関連する問題