2013-04-15 3 views
7

私はインターネットサーバー(いくつかのクロスプラットフォームプログラムで使用されるバックエンドコンポーネント)で実行する必要があるプログラムを開発しています。私は、バッファオーバーフローやSQLインジェクション攻撃を防ぐためのセキュリティ上の予防措置に精通していますが、以前にサーバープログラムやこのスケールで使用されるプログラムを作成したことはありませんでした。経験豊富なアドバイスを要求してサーバー上で実行するプログラムを書く

プログラムは、数百または数千のクライアントに同時にサービスを提供できる必要があります。プロトコルは処理速度と交換する必要のあるデータ量を最小限に抑えるように設計されており、サーバー側はCで記述されます。同じコードのWindowsとLinuxの両方のバージョンがあります。

質問:

  • どのようにすべきプログラムハンドル通信 - 複数のスレッド、順番にすべてのソケットを扱う単一のスレッド、またはすべての非常に多くの着信接続のための新しいプロセスを生成(または各1について) ?
  • このプログラムは一度に何ヵ月も実行する必要があるため、メモリの断片化などのことを心配する必要はありますか?
  • この種のプログラミングに特有の他の設計上の問題は、デスクトップとモバイルシステムのクロスプラットフォームプログラムの経験豊富な開発者が気付かないかもしれませんか?

別の言語を使用することをおすすめしません。その決定は、私が自由に行こうとしない理由で既に行われています。

+3

"このプログラムは一度に何ヵ月も実行する必要があるでしょう"プログラムがクラッシュしたり、何かが間違っていたりすると、プログラムを再起動するための監視プロセスを別途*持つことをお勧めします。 – Dukeling

+0

"建設的ではない"?それは、私が直面している実際の問題に基づいて、実践的で、答えることができる3つの質問から成り立っています。よくある質問の定義です。 –

+0

あなたの質問も[合理的スコープにする]必要があります(http://stackoverflow.com/faq#dontask)。 – RandomSeed

答えて

2

稼働時間が3年以上の複数のサーバーを稼働させていて、稼働時間が1年を少し上回っているプログラムでは、システムを正常にシステムエラーから回復し、サーバーを再起動するように設定することをお勧めします。

プログラムを再起動したときにパフォーマンスが低下しても、外部の状況によってプログラムが強制的に再起動する可能性があるため、プログラムを処理できる必要があります。

不要なときに車輪を改造しようとしないでください。入ってくる通信の配信を処理するためにzeromqなどを見てください。 (もしあなたが、PythonのようなC言語よりも寛容な言語でバックエンドをプロトタイプ化したら、Cで再実装しますが、通信プロトコルはそのままにしてください)

+0

ありがとう、ZeroMQは私が必要とするものと正確に思われる。 –

+0

+1 for zeromq。 – CloudyMarble

4

私はlibeventまたはlibevとノンブロッキングI/Oを使用します。このようにして、オペレーティングシステムはあなたのスケジューリングの問題の大半を占めます。私はまた、タスクを処理するためにスレッドプールを使用します。つまり、本来はブロックされているため、メインループをブロックしません。また、大量のデータをディスクとの間で読み書きする必要がある場合は、再度mmapを使用して、できるだけOSを処理させます。

基本的なアドバイスはOSを可能な限り使用しています。このように見えるプログラムの良い例をVarnishにしたいのであれば、それは非常によく書かれており、幻想的です。

+0

アドバイスをいただきありがとうございます。 libevent(とlibev)は、ZeroMQ(Anthonの提案)よりも少し低いようですが、他のプロジェクトで使用することになります。 私はVarnishを見ていきます。このプログラムが動作するように設計されているように思えます。 –

関連する問題