Web サーバ

Web サーバなどにおいて、スレッドの扱いについて簡単に見ていきましょう。

Web Service

まずですが、以前紹介したように Web Server にしろ Web Service にしろ、別に関数みたいなものです。 URL アクセスに対する処理を関数風に実現するのが、基本形です。

例えば、JavaEE では Servlet というのが使われていますが、HTTPServlet という基本クラスになり、例えば以下のようなメソッドが提供されています。

  • void doGet(HttpServletRequest req, HttpServletResponse resp): GET メソッドの処理
    • HttpServletRequest req: リクエスト内容を表す、header, session などの情報を取得可能
    • HttpServletResponse resp: 結果を表す。resp.getOutputStream()を介して、結果を出力可能。

簡単な例:

public class TestServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        resp.setContentType("text/plain");

        String name=req.getParameter("name");
        HttpSession hs = req.getSession(true);
        PrintWriter out=resp.getWriter();

        if(name==null) name="unknown";
        out.println("Hello "+name+", sessionID: "+hs.getId()+"\n");
        out.close();
    }
}

クラウドでは?

さて Web Service ですが、永続的なデータを Servlet に格納するのはおすすめできません。 というのも、大量のアクセスを1台の Web Server で対処するのは厳しいので、基本マシンは複数台数あげることになります。

クラウドコンピューティング環境では、たとえばこんな感じで複数のサーバが動作しています。

cloud.png

  • Web Server は、負荷に応じて「同じ設定のマシン」をドンドン立ち上げる。
    • なので、状態なんてもっていたら、「コピペ」できないので、したくない。
    • 仕事の振り分けは load balancer が担当。といっても、同じセッションのアクセスは、同じ server にまわそうとしてくれる(sticky session)。
  • データは、クラウド上でデータベースシステムに格納する。DB 管理システムには、複数マシンに対応したスケーラブルかつ耐故障性・冗長性のあるシステムが望まれる。
    • データ一貫性は、データベースにお願い。但し、スケーラブル DB は、Eventually Consistency などの緩い一貫性モデルを取るものも多い。
    • それでも排他制御が必要という場合は、Apache Zookeeperのような Atomicity サポートのあるシステムを利用する。