関西セミナー
気象庁XML利活用セッション
配信サーバを立ててみた
2013/07/11
クラウド・テクノロジー研究部会 リーダー
荒本道隆
（アドソル日進株式会社）

配信サーバを立てたワケ• 気象庁からの配信はPubSubHubbub– グローバルIPを持ったサーバが必要– 受信用Subscriberの動作テストが面倒• いつ飛んでくるか分からない• Googleの動作確認ページの挙動がアヤシイ• 会社に受信サーバを立ててみたけど– sshでログを見ないと、最新の情報が確認できない– 気軽に最新の防災情報XMLを見たい• どうせやるなら– まだ使ったことのない技術を試してみたい– そうだ、WebSocketで配信をしてみよう
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

WebSocketとは
WebSocket（ウェブソケット）は、コンピュータ・ネットワーク用の通信規格の1つである。インターネットの標準化団体であるW3CとIETFがウェブサーバーとウェブブラウザとの間の通信のために規定を予定している双方向通信用の技術規格であり、APIはW3Cが、WebSocket プロトコ
ルはIETFが策定に関与している。プロトコルの仕様は RFC 6455。
TCP上で動く。
Wikipediaより• Comet（Ajax）の代替として、策定された••Comet（コメット）とは、Web アプリケーションを構築する際に利用される技術で、この技術を使うと、サーバで発生したイベントをクライアントからの要請なしにクライアントに送信することができる。
Comet はこのような通信を実現するための複数の手法をまとめた概念である。これらの手法はブラウザにプラグインを追加することなく、（JavaScript のような）デフォルトの機能で実現されるものである。
理論的には Comet は、ブラウザがデータを要求する形の既存のウェブのモデルとは異なっている。実際は Comet アプリケーションは Ajax と Long polling を使用してサーバ上の新規データを取得する。

• WebSocketの状況– HTML5から切り離された– HTTP2.0は、対抗規格のSPDYが優位
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

Wikipediaより

実装方法• サーバにはAmazonEC2を使用• Subscriber– GoogleCodeからJavaのものを使用• http://code.google.com/p/pubsubhubbub-java/– Mainクラスを追加– PuSHhandler.javaに追記• if (request.getMethod().equals("POST")) {public static void main(String[] args) {PubSubHubbub.Web web= new PubSubHubbub.Web(8888);
web.start();}• WebSocket– Tomcat7のWebSocketServletを使用• org.apache.catalina.websocket.WebSocketServlet• Kafka（messaging system）– SimpleConsumerを使用• １つのメッセージを複数から取り出せる– Topic単位で古いものが消えていく

http://kafka.apache.org/design.html
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

モジュール構成
ブラウザ

気象庁

防災情報XMLを取得

WebSocketで接続

GooglePubSubHubbub
ATOMをプッシュ

配信サーバ
WebSocket
定期的にキューをチェック
Messaging
Kafka

受信サーバ
Subscriber
防災情報XMLを格納

古いものから
防災情報XML 消えていく

Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

実際のシステム構成
ブラウザ

気象庁

プロキシ
Squid

GooglePubSubHubbub

企業LAN

Apache2

Tomcat

配信サーバ
WebSocket

受信サーバ
Servlet受信サーバ
Subscriber

ログ
Amazon EC2

Messaging
Kafka

防災情報XML

Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

WebSocket周りで次々と問題発生• Squidがあると– ブラウザはCONNECTを使う• CONNECT cloud.projectla.jp:80 HTTP/1.1• Squidのデフォルト設定：CONNECTは443以外を禁止• Apache2を入れると– セキュリティ確保や微調整をApache2でやりたい– 接続したままを想定していない• 「HTTP/1.1 101 Switching Protocols」で子httpdが落ちる• Amazon EC2のロードバランサを入れると– 60秒でタイムアウトするらしい
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

WebSocketの問題を解決
ブラウザ

ws://ホスト名/アプリ名/~↓
ws://ホスト名:443/アプリ名/~

プロキシ
SquidGoogle
PubSubHubbub
本当は wss://ホスト名/アプリ名/~ にしたい

企業LAN

自作R-Proxy

Tomcat気象庁

50秒ごとにハートビート

Apache2

配信サーバ
WebSocket

受信サーバServlet

受信サーバ
Subscriber

URLを見て、後は単純な中継だけ
Amazon EC2

ログ
Messaging
Kafka

防災情報XML

Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

Kafkaでも問題発生• 新規クライアントからのアクセス時– 全メッセージの先頭から順次空読み– offset値の最新50件だけをリストに残す– 最後まで読んだら、リストにある50件を返す– 以降、メッセージが増えれば、すぐにそれを返す• Kafkaの特徴– 一定量のメッセージが溜まると、古い物から消す• ２週間ほど連続運転してみた結果– 先頭（offset=0）が消去された– 先頭が無いので、先頭から空読みができない• メモリ上でキャッシュしていたので、Tomcat再起動時に発生– APIを調べても、「最後から読む」が無い？

• 解決方法– 「最新から50番目のoffset値」を常にファイルへ保存• 最初の空読みが不要になり、性能も改善
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

Comet版も作ってみた• 作った理由– WebSocket版との比較– WebSocketが使えない環境があるかもしれない• 性能– 最初の「直近50件を取得」は、WebSocketが圧倒的に早い– CPU負荷・ネットワーク負荷とも、WebSocketが優位• 開発のし易さを比較– WebSocket版は作りやすかった• サーバ側は、永久ループ– クライアントへの配信エラーで、切断を検出• クライアント側は、イベントを待つだけ– ハートビートの書き込みエラーで、切断を検出– Comet版は色々と注意が必要だった• クッキーとパラメータを併用してoffset値を制御• Ajax呼び出し中に、前をキャンセルして、新しいリクエストを発行• タイミングによって発生するバグは、解決が困難
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

API• WebSocket版– 接続して、コマンド文字を送信する• 「filter フィルタ文字列」• 「xpath パターン文字列」• 「start」– 50秒ごとにハートビート文字（空白文字）を送信すること• Comet版– リクエストパラメータ• filer=フィルタ文字列• xpath=パターン文字列• offset=最初から取得したい時に0を指定– レスポンスでCookieに前回のoffset値をセット– 何もなければ、50秒ごとに空レスポンスが返る
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

サンプル画面紹介

Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

まとめ• クラウド（AmazonEC2）上にWebSocketサーバを構築– 予想外の問題がいろいろと起きた• まだWebSocketはあまり使われていない？
• CPU負荷やネットワーク負荷を下げるために、利用価値は高い– WebSocketで社内LAN→クラウドの接続が確認できた• ブラウザに対するPush通知が実現– 最初は、ブラウザを開いておいて眺めていたけど– 通知機能が欲しい• 関連する地域名が含まれていたら…
• 緊急度の高いXMLが届いたら…

Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

注意事項• 防災情報XML試用のために利用してください– 本番システムには組み込まないでください– 突然、サービス停止することもありえます– 提供期間• AITCクラウド・テクノロジー研究部会が存続する間を予定– メンテナンス• 不定期に行います• 蓄積サーバの検索ページ– AITC会員以外も利用OK• http://cloud.projectla.jp/jmaxmldb/• 蓄積サーバのクエリページ、配信サーバ– AITC会員限定• URLは staff@aitc.jp にお問い合わせください
Copyright © 2013 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.