横断検索アプリのあーきてくちゃっぽいもの

横断検索(メタ検索)な psgiアプリを再制作していて、大分構成が変わったので比較のメモ

現物のコードは https://gist.github.com/2698475 Meta::Doujin::Search - WebSocket(Web::Hippie) + Dancer + Twiggy — Gist にある。まだα版もいいところだけど。

XMLHTTPRequest + LWP + Starman の構成(旧版)
  • クライアントがリクエストを投げる時点で、1つの検索条件に対して複数のリクエストを生成している。そのため、通信量のオーバーヘッドがひどい。
  • "仮に、" リクエストを複数生成するタイミングをアプリケーションサーバーで行うようにすると
    • クライアントとアプリケーションサーバー間の通信コストは減る
    • サービスからアプリケーションへのレスポンスは複数あってもそれをクライアントに返す際は一つにまとめなくてはならない が、仮にレスポンスが非常に遅いサービスがあると、そのレスポンスが返ってくるまで、他のレスポンスと1つにまとめるまで無駄に時間が掛かる
         (        user      )
                   |            * 検索条件リクエスト
       '        browser       '
       '           |          '
       '  ( XMLHttpRequest )  '  *
          |        |       |     * http通信 x3
          |        |       |     *
       '  serever  (Starman)  '  *
       '  |        |       |  '  *
       ' (     psgi.app     ) '  *  *
          |        |       |        *
          |        |       |        * http通信 based LWP x3
    'Service A'    |    'Service C' *
          |   'Service B'  |        *
          |        |       |        *
          |        |       |        *
       ' (     psgi.app     ) '  *  *
       '  |        |       |  '  *
       '  serever  (Starman)  '  * http通信 x3
          |        |       |     *
          |        |       |     *
       '  ( XMLHttpRequest )  '  *
       '  |        |       |  '
       '  |     browser    |  ' * DOM描画
          |        |       |
         (        user      )
  • ユーザーが検索条件をブラウザ(クライアント)へ入力
  • クライアントは検索サービス数のリクエストをXMLHttpRequestアプリケーションサーバーにリクエストを投げる
  • サーバーはクライアントからのリクエストを各サービスに対応したリクエストに直して、LWPで該当サービスにリクエストする
  • 該当サービスからのレスポンスを待つ
  • 該当サービスからレスポンスが来たら、クライアントに対応したレスポンスに加工して、レスポンスを返す
  • クライントはアプリケーションサーバーからのレスポンスを表示する
WebSocket + AnyEvent::HTTP + Twiggy の構成(新規)
         (        user      )
                   |            * 検索条件リクエスト
       '        browser       '
       '           |          '
       '      (webSocket)     ' *
                   |            * ws通信
                   |            *
       ' serever   (Twiggy) ' *
       '           |          ' *
       ' (     psgi.app     ) ' *  *
          |        |       |       * http通信 based AnyEvent::HTTP
          |        |       |       *     x3
     'Service A'   |   'Service C' *
          |   'Service B'  |       *
          |        |       |       *
          |        |       |       *
       ' (     psgi.app     ) ' *  *
       '  |        |       |  ' *
       ' serever   (Twiggy) ' * ws通信 x3
          |        |       |    *
          |        |       |    *
       ' (|   webSocket    |) '
       '  |        |       |  '
       '  |     browser    |  ' * DOM描画
          |        |       |
         (        user      )
  • ユーザーが検索条件をブラウザ(クライアント)
  • クライアントは検索条件を加工したリクエスト(1件)をwebSocket でアプリケーションサーバーにリクエストを投げる
  • サーバーはクライアントからのリクエストを各サービスに対応したリクエストをサービス数分生成して、AnyEvent::HTTPで該当サービスにリクエストする
  • 該当サービスからのレスポンスを待つ
  • 該当サービスからレスポンスが来たら、クライアントに対応したレスポンスに加工して、レスポンスをwebSocketで返す
  • クライントはアプリケーションサーバーからのレスポンスを表示する
現実のところ速くなりましたね。