2011-08-16 21 views
5

現在、リアルタイムプロセスにコマンドを送受信する必要があるC#ソケットサーバーを開発中です。クライアントはアンドロイドデバイスです。現在のところ、リアルタイム要件は「ソフト」ですが、将来はより厳しいタイミング要件が発生する可能性があります。将来、潜在的に危険な可能性があるコマンドをクレーンに送ることがあると言います。リアルタイムアプリケーションの非同期対同期ソケットサーバー

サーバーが動作していて、現在の同期ソケットサーバーの設計ではうまくいきます。私はデータを送受信するために別々のスレッドを持っています。私は非同期サーバーソケットのアプローチを試みる理由があるのだろうかと思いますか?より安定したパフォーマンスや速いパフォーマンスを提供できますか?

+1

非同期設計は、複数のクライアントおよび/または複数のメッセージ/接続が並行して処理される場合にのみ有益です...非同期設計によりサーバのスケーラビリティが向上します – Yahia

答えて

6

私はリアルタイムの定義を詳しく見ていきますが、非同期ソケットは要求プロセスの本体を速くしませんが、並行性(一度に取れる要求の数)は増えます。すべてのプロセッサが何かを処理している場合、何の利益も得られません。これは、プロセッサがソケットを受け取るのを待っていた状況でしか得られません。

あなたのリアルタイム要件がx時間の応答を保証する必要性のようなものであれば、C#と.NETはあなたにそのような保証を与えません。ただし、これはあなたの現在および将来の「ソフト」の定義に依存します。 になると、応答時間が伸びることがありますが、それを実際のリアルタイムシステムと混同しないでください。

+1

回答ありがとうございました!私は、非同期ソケットサーバの高速化についてのすべての投稿で混乱していたようだが、今はどのような状況にあるのか分かっている。そして私はあなたのノートに完全に同意します、C#はリアルタイム要件のための良い選択ではありません。もっと難しい場合は、おそらくC言語のサーバーを使うつもりです。もう1つのことは、TCPソケットはリアルタイムコミュニケーションのための実用的な選択肢ですか、それとも別のものを検討すべきですか? – Cartaya

+1

非同期C#と比較して同期Cを実行している場合は、自分自身に大きな不利益を与えています。 – Henrik

+0

潜在媒体(すなわちネットワーク)を越えたあらゆる種類の通信は、リアルタイムシステムにとって魅力的ではありません。信頼性を望むならば、TCPは十分な選択肢です。 –

1

あなたのアプリケーションで非同期の有用性が疑われるなら、間違いなくthisを読んでください。これは、非同期ソリューションがアプリケーションに加える可能性のある明確なアイデアを提供します。

+0

LMAXのリファレンスを投稿していただきありがとうございます。とても興味深い。 – kakridge

+0

http://disruptor.googlecode.com/files/Disruptor-1.0.pdf - Fowlerのカットコピーアンドペーストの簡略化ではなく、読んでください。) – Henrik

0

私はあなたがより安定性を増したり、より速いパフォーマンスを得ることはないと思います。本当に「リアルタイム」システムであれば、それは同期しているはずです。 「ほぼリアルタイム」に耐えることができ、長時間実行または高価なコンピューティング操作がある場合は、非同期アプローチを検討できます。私は複雑さを追加しませんが必要ではない場合。

0

リアルタイムであれば、コミュニケーションをキューにバックアップして、そのキューで一時的なロジックを証明できるようにしてください。これはnio/io-completion-ports/asyncが提供するものです。同期プログラミングを使用している場合は、RAMからネットワークカードにデータをコピーしながらCPUを無駄にしています。

さらに、サーバーが完全にシングルスレッドであることを意味します。非同期でも1つのスレッドしか持つことができますが、依然として何千もの要求に対応できます。

たとえば、クライアントがDOS攻撃を実行したかったとします。彼は接続し、1バイトのデータを送るだろう。あなたのアプリケーションは、その接続のタイムアウトのためのさらなるコマンドを受け取ることができなくなります。これは非常に大きくなる可能性があります。 asyncを使用すると、SYNパッケージをACKに戻しますが、コードは完全な送信を待機しません。

+0

彼はUDPを使用しています。 ACK攻撃は適用されません。あなたのアドバイスは、彼のアプリケーションのリアルタイム性を強化するものではありません。 CPUのパフォーマンスとネットワークのセキュリティが向上します。非同期メッセージキューの一時的なロジックに関して書くことができるのは、サービスレートが低下している場合にキューの内容を操作して「追いつく」寛容度を持つ場合にのみ実用的です。同期ソリューションが回避できるサービスレートの擬似ランダム変動を導入します(ただし、これは「クレーン」へのリンクが完全に専用/潜在的に潜在的である場合にのみ重要です)。 –

+0

彼はどこでUDPを使用していると言いますか?私はそれの言及を見つけることができません。私はあなたに同意しているとは確信していませんが、同期ソケットの代わりにasyncを使用することで、複数の接続が与えられた場合、待ち時間が短縮され、インターネット上の殺人者となり、インターネットは、 - あなたが話していることがどのように適用されているのか分かりません。また、変動があれば何が問題になるのですか?それはどういう意味ですか? - ここで推測すると、パッケージは不整然と到着し、とにかく遅れるかもしれません。 – Henrik

+0

あなたは彼がUDPについて言及していないことは間違いありません。なぜ私はそれを仮定したのかわからない、多分産業用アプリケーション(クレーン)への参照は私の頭の中に入れた。 –