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")
:ここに私の最新のルートはありますか?
なぜnetty4を使用していないのですが、以前のnettyコンポーネントは非推奨ですか?データのエンコードとデコードが必要な場合を除き、allowDefaultEncodingを許可することができます。 –
'defaultCodec = false'を指定しないと、セットアップが機能しません。私もnetty4を使ってみましたが、動作させることができませんでした。もう一度試してアップデートを投稿します。 – bnsk
@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