12章並行ネットワークサーバ

同時に多くのクライアントと通信するサーバ型のアプリケーションは、高度な並行性と高い性能の両方をI/Oサブシステムに要求します。よいウェブサーバは、数十万の接続を並行に扱い、毎秒数万の要求に応答できなければなりません。

この種のアプリケーションはスレッドを用いて書くのが理想的です。スレッドは適切な抽象化です。スレッドのおかげで、開発者は単一クライアントとのやりとりを実現することに集中できます。そして、この単一クライアント用のコードを別々のスレッドとして多数生成するだけで、複数のクライアントに対応できます。この章では一連のサーバアプリケーションの開発を通じて、この基本的な考え方を探求します。クライアント間での対話のない簡単なサーバから始めて、共有する状態を追加し、最後に状態とクライアント間の対話があるチャットサーバを構築します。

途中、これまでの章で出てきた概念を多数引いてくる必要があるでしょう。MVarとSTMの両方を使ったサーバの設計や失敗の処理方法、「11.2 対称型並行性コンビネータ」で導入した抽象化を用いたスレッドグループを構成する方法ついて議論します。

12.1 簡単なサーバ

この節では、以下のような振る舞いをする単純なネットワークサーバを実装する方法について考えます。

  • クライアントからの接続を44444番ポートで受け入れます。
  • クライアントが整数 n を送ってくれば、サービスは 2n の値で応答します。
  • クライアントが文字列「end」を送ってくれば、サーバは接続を閉じます。

まず、単一クライアントとの対話を実装します。以下に定義するtalk関数はクライアントとの通信用のHandleを引数として取ります。このHandleがネットワークソケットに結び付けられると、クライアントが送ったデータをこの ...

Get Haskellによる並列・並行プログラミング now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.