問題タブ [netty]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
netty - Apache Camel で netty を使用するとデッドロックが発生する
私は深刻な問題を抱えています。複数のメッセージをnettyに送信する必要がある状況があります。これらはすべて同じ場所でキャメルによって生成され、すべてのメッセージへの応答を取得します。
コードは次のようなものです。
splitMessage クラスは、少なくとも 10 個のメッセージを生成します。
最初のメッセージが生成された後、netty はそれを受信し、返信を送信して転送します。そして、2 番目のメッセージが生成され、netty に送信されます。ここから問題が始まります。私はいつもそのようなエラーを受け取ります:
メッセージを遅らせることで問題を回避しようとしましたが、役に立ちません。デッドロックを無効にすることでエラーを回避できますが、それは実際の解決策ではありません。
誰でも助けることができますか?
netty - ThreadPoolExecutors での Netty タスクの優先順位付け
ユーザー要求を処理し、ミドルウェアと通信し、応答を送信するサーバーを netty に実装しています。I/O は、ミドルウェアへの往復に比べて無視できると予想されるため、ブロッキングを最小限に抑えるために、パイプラインに OrderedMemoryAwareThreadPoolExecutor の上に ExecutionHandler を配置しています。これまでのところ問題はありません。
サーバーが高負荷下でどのように動作するかを調べています。私たちのプロトコルに関する過去の経験から、偶発的な DOS 攻撃に圧倒される傾向があります。ほとんどの場合、ユーザーのスクリプトが無限ループに陥ったり、同様のことが起こります。理想的には、チャンネルが特定の使用しきい値を超えたら優先度を下げて、他のユーザーのサービスに影響を与えないようにすることができます.
PriorityBlockingQueue を使用し、独自の Session クラス (ChannelHandler のコンテキストに関連付けられている) から抽出されたデータに基づいて優先度を設定する単純な ThreadPoolExecutor を実装しました。繰り返しますが、これまでのところ問題はありません。
問題は、netty の組み込み ThreadPoolExecutors の順序付けとメモリ認識を利用しようとするときに発生します。理想的には、MyThreadPoolExecutor は OrderedMemoryAwareThreadPoolExecutor を拡張し、プライオリティ キューのものに接続できます。残念ながら、これは 2 つの理由で不可能です: 個人的な理由と最終的な理由です。さらに詳細に:
a) ThreadPoolExecutor.workQueue はそのコンストラクターで設定できますが、MemoryAwareThreadPoolExecutor はこれを LinkedTransferQueue としてハードコーディングし、これをその子 OrderedMemoryAwareThreadPoolExecutor に公開しません (つまり、MyThreadPoolExecutor はそれを設定するためのアクセス権を持っていません)。必要に応じて、これはリフレクション ベースのプライベート フィールドのちょっとした微調整で克服できます。
b) MyThreadPoolExecutor.doUnorderedExecute() をオーバーライドして、優先度処理を挿入し、必要なオブジェクトを構築できるようにしたいのですが、最終宣言されています。それを呼び出すコードを変更する必要はありません。
要点は、すべての適切な機能を保持しつつ、プライオリティ キューを使用するには、OrderedMemoryAwareThreadPoolExecutor と MemoryAwareThreadPoolExecutor の両方をコピー アンド ペーストし、それぞれ数行を微調整して、そこから拡張する必要があるということです。これは良いコーディングの練習とは思えません! それを考慮しても警鐘を鳴らします。
いくつかの質問があります。
1) 私は間違った問題を解いていますか? 達成したいことに対して完全に間違ったツリーを吠えていますか?
2)そうでない場合、上記で説明した方法よりも良い方法はありますか?
3) 上記のアプローチでは、サーバーの総負荷が一貫して容量に達している場合、優先度の低いタスクが枯渇するリスクがあります。「やんちゃな」ユーザーのためにこれを許容する準備はできていますが、彼らが通常の状態に戻ったとしても、彼らの既存のタスクはまだ枯渇しているでしょう。これに対処する最善の方法について何か推奨事項はありますか? (ユーザーを禁止することはビジネス上許可されていません。)
4) これは半分質問、半分フィードバックです。OrderedMemoryAwareThreadPoolExecutor の詳細なドキュメントには、スレッド X と Y の便利な図があります。おそらく、これらは ThreadPoolExecutor にプールされたスレッドであり、I/O ワーカー スレッドではありませんか? これをもっと明確にする価値があるかもしれません。また、ExecutionHandler を使用しない場合、各チャネルは単一の I/O ワーカー スレッドにバインドされます。これは、ExecutionHandler の背後にある場合でも当てはまりますか? つまり、タスクが ExecutionHandler に追加される順序は、チャネルに到着する順序と同じであることが保証されていますか? この場合、MemoryAwareThreadPoolExecutor のドキュメントのスレッド X がイベント 1 の前にイベント 2 を処理する方法がわかりません。ここでは、異なるスレッドが任意の順序で作業を終了できることを受け入れますが、できます。作業を順不同で同じスレッドに割り当てる方法を確認してください (workQueue からポップします)。ExecutionHandler のドキュメントはこれをほのめかしていますが、もう少し詳しく説明すると役立ちます。
読んでいただきありがとうございます。どんな助けでも大歓迎です。
netty - Netty で protobuf 拡張機能を使用して汎用ディストリビューターを実装する
Netty と Protobuf を使用してメッセージ ディストリビューターを実装したいと考えています。ディストリビューターは、基本の protobuf メッセージと拡張機能があることを認識し、これらの拡張機能を登録する他のクラスにメッセージを渡すサーバーです。
Protobuf では、拡張機能を個別のファイルで宣言できるため、ディストリビューターは拡張機能の形式について知る必要がありません。ただし、これは、すべての拡張機能を認識している ExtensionRegistry を使用して ProtobufDecoder を作成する必要がある Netty 配管で機能するようです。そうしないと、ここで説明する問題に遭遇します。
ここに何か不足していますか、それとも独自のデコーダーを作成しないとできないことですか? Javaの例があれば、それは非常に役に立ちます。
java - JDK NIO が非常に多くの anon_inode ファイル記述子を使用するのはなぜですか?
私は Sun の JDK 1.6.0_26 と NIO (Netty を使用) を使用しており、lsof には次のような数百のファイル記述子が表示されますanon_inode
。
匿名 inode とは何かについての明確な説明を見つけることができませんでしfs/anon_inodes.c
た。Linux カーネルのソース ツリーを調べたところ、おそらくepoll
それを使用しているように見えますが、なぜそんなに多くの i ノードが必要なのかわかりません。複数の「epoll ループ」とタイマー スレッドがありますが、私の数ほどではありませんanon_inode
。
java - netty でボットを実装する方法
私は今、netty で数か月間働いていますが、大きな質問があります。
私は MMO ゲームを作ろうとしていますが、ノンプレイヤー キャラクター (NPC) がゲーム内を動き回り、実際のユーザー インタラクションに反応できるようにしたいと考えています (また、他のユーザーにもリアルタイムで表示されるようにしたいと考えています)。
これを行うための最良のアプローチは何ですか?
「偽のユーザー」を作成できると思っていましたが、使用しているソケットサーバーに接続する方法がわかりません。
ところで:iPhoneデバイスからクライアントとしてサーバーへのTCP接続を使用しています。
ありがとう!
http - netty HTTP サーバーで Range リクエストをサポートする
Range リクエストをサポートするパイプラインを構築することは可能ですか? または、そのようなサポートを自分で実装したい場合に見るべき API の部分を教えてもらえますか?
java - Netty でメモリ使用量を最小限に抑える正しい方法
Netty には、メモリ コピーを最小限に抑え、メモリ使用量を最適化しようとする 2 つのシナリオがあります。
(1) 非常に大きなフレーム (20 メガバイト) の読み取り。
(2) 非常に小さなフレーム (フレームあたり 50 バイトで 20 メガバイト) を多数読み取り、パイプラインの上位レベルで 1 つのメッセージに再構築します。
最初のシナリオでは、フレームの先頭で長さを取得するため、FrameDecoder を拡張しました。残念ながら、Netty に長さを返す方法がわかりません (フレームが完全かどうかのみを示します)。Netty は複数のフィル バッファー、コピー、および再割り当てのサイクルを実行しているため、必要以上のメモリを使用していると思います。私がここに欠けているものはありますか?または、このシナリオが予想される場合、FrameDecoder を完全に回避する必要がありますか?
2 番目のシナリオでは、現在 ChannelBuffers.wrappedBuffer を使用してラップするすべての小さなフレームのリンク リストを作成していますが (これを ChannelBufferInputStream でラップできます)、予想よりもはるかに多くのメモリを使用しています (おそらく割り当てられた ChannelBuffers に予備のスペースがあるためですか?)。これは Netty ChannelBuffers を使用する正しい方法ですか?
xmpp - openfire で XMPP メッセージが配信されない
以前は、クライアント側のライブラリとして smack を使用し、メッセージを openfire に送信していましたが、正常に動作していました。
ここで、netty と smack を使用して接続を確立したいと考えています。チャネルを作成でき、openfire は作成された接続を表示しますが、登録パケットを openfire に送信できません。チャネルにパケットを書き込んでいますが、たき火で配信されません。
助けてください。
java - HTTP Chunked レスポンスのエラー処理
Java netty でチャンク出力をクライアントに返す Web アプリを構築しています。
インターネットを読んで検索したところ、次のリソースが見つかりました。
要約すると、http 応答や以前のヘッダーに関係なく、「場所」を含むトレーラーヘッダーを尊重する必要があると私は信じています。
ただし、Firefox と Chrome でいくつかのブラックボックス テストを行った後。どちらのブラウザも末尾のヘッダーを尊重しません。
だから私の質問は
- まず第一に、私は何かを逃しましたか?
- 第二に、チャンクされた応答のエラーを処理するための理想的なソリューションは何でしょうか?
- 私は現在、応答の途中で JavaScript を使用していることしか認識していません。
- 最後に、http 応答コードに関係なく、HTTP Location ヘッダーを尊重する必要があると信じているのは間違っていますか? 上記でリンクした仕様では、3xx ヘッダーである必要があるとは言及されておらず、実際には Location の可能性のあるケースとして 201 ヘッダーも言及されていましたが、主要なブラウザーはどれもそれを尊重していません。
buffer - Netty 3.2.6 で動的バッファーの最小値を手動で設定する方法は? たとえば、2048 バイト
TCP/IP で他の IP (ナビゲーション デバイス) からフル パケットを受信する必要があります。たとえば、デバイスは定期的に (1 分間で) 966 バイトを送信する必要があります。私の場合、最初に受信したバッファの長さは 256 バイト (パケットの最初の部分)、2 番目は 710 バイト (パケットの最後の部分)、3 番目は完全なパケット (966 バイト) です。最初に受信したバッファ長の最小値を手動で設定する方法は?
これは私のコードの一部です: