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