Python+tweepy+web.py+Azureストレージで作るTwitter連携アプリケーション 6ページ

FIFO型ストレージ「Queueストレージ」

 最後に紹介する「Queueストレージ」は前述のBlobやTableとは異なり、データを永続的に保存するのではなく、ロール間やサービス間でメッセージを受け渡すために利用されるストレージだ。各キューには任意のメタデータを含むXMLメッセージを格納できる。Queueストレージでサポートされている操作は次のとおりで、「データをキューの末尾に挿入する」、「キューの先頭からデータを取り出す」、「キュー内のデータを削除する」といったシンプルな操作のみが可能だ。

  • ストレージアカウント内のキュー一覧を取得
  • キューの末尾にメッセージを追加
  • 指定したキュー内の先頭にあるメッセージを取得
  • 指定したキュー内の先頭にあるメッセージを取得し、キューから取得したメッセージを削除する
  • キューのプロパティを取得
  • キューの新規作成
  • キューの削除
  • キューのメタデータやプロパティの削除
  • キュー内のすべてのメッセージの削除
  • キュー内の指定したメッセージの削除

 なお、キューに格納できるデータの最大サイズは8KBとなっている。

Queueストレージの利用例:Image Aggregatorでの非同期プロセス間通信

 Queueストレージはロール間やサービス間でのメッセージの受け渡しといった目的で利用する。そこで今回は、先に解説したImage Aggregatorアプリケーションでタイムラインの取得制御に利用するサンプルを紹介しよう。

取得したいユーザーのIDをQueueに投入する

 gettimeline.pyスクリプトはfollowerテーブルに格納されているユーザー情報を参照し、そのタイムラインを順に取得している。しかし取得対象のユーザーが増えた場合、すべてのユーザーのタイムラインを取得し終わるまでに時間がかかってしまう。いっぽう、ユーザーが新たに取得対象とするユーザーを追加した場合など、優先的に特定ユーザーのタイムラインを取得したいことがある。これに対応するため、「QuereストレージにユーザーIDを投入すると、それに対応するユーザーのタイムラインを優先的に取得する」という処理を実装している。

 Queueストレージに対する操作は、winazurestorage.pyのQueueStorageクラスで行える。QueueにユーザーIDを投入する処理はリスト16のようになる。

リスト16 QueueにユーザーIDを投入する(updaterequest.py)

def update_request(user_id):
    st = QueueStorage(CLOUD_QUEUE_HOST,
                      config["storage_account"],
                      config["storage_key"])
    st.put_message(config["get_request_queue"],
                   user_id)

 ここで呼ばれているput_message関数がQueueストレージへのメッセージ投入を行う関数だ。この関数の引数は次のとおりだ。

put_message(<投入するキュー名>,<投入したいメッセージ>)

 また、キューからメッセージを受け取るにはget_message関数を利用する(リスト17)。この関数は対象とするキューを引数として取り、戻り値としてキューに投入されたメッセージを返す。

リスト17 QueueからユーザーIDを取得する(updaterequest.py)

def receive_request():
    st = QueueStorage(CLOUD_QUEUE_HOST,
                      config["storage_account"],
                      config["storage_key"])
    req = st.get_message(config["get_request_queue"])
    if req:
        st.delete_message(config["get_request_queue"], req)
        return req.text
    else:
        return ""

 Image Aggregatorアプリケーションでは、監視するアカウントを追加するたびに上記のupate_request関数を使ってキューにそのユーザーIDを投入するようになっている。このキューを監視するのが、requestreceiver.pyスクリプトだ(リスト17)。

リスト17 QueueからユーザーIDを取得する(requestreceiver.py)

def main():
    f_db = FollowerDB()
    f_db.load_from_db()
    t_db = TweetDB()
    t_db.load_from_db()

    uid = receive_request()
    while len(uid) > 0:
        last_id = f_db.get_last_id(uid)
        read_id = get_timeline(t_db, uid, last_id)
        t_db.create_cache()
        f_db.update(uid, read_id)
        uid = receive_request()

 requestreceiver.pyは起動されるたびにreceive_request関数を実行してキューをチェックし、キューにメッセージがあればそこからユーザーIDを取り出して対応するタイムラインを取得するようになっている。

Windows Azureストレージを活用しスケーラブルなアプリケーションを作成しよう

 以上、駆け足ではあったがWindows Azureストレージに含まれる3種類のストレージサービスについて紹介した。Windows Azureストレージは一般的なSQLデータベースやファイルシステムとは大きく異なるが、その概念さえ把握してしまえば比較的容易に利用できる。実行しているホストを問わずにデータにアクセスでき、Azure Storage Explorerといったツールを使えばデバッグも難しくない。

 Windows Azureストレージの利用は、特に複数のWebロールを実行する際に威力を発揮する。先のgettimeline.pyスクリプトは、Windows Azure内ではWebロール内で動作させることを想定しているが、Webロールと異なるロール(Workerロール)でも問題無く動作する。たとえば取得対象のユーザーが増えた場合や、Webロールへのアクセスが増えて負荷がかかってきた場合などは、gettimeline.pyスクリプトをWebロールとは異なるロール(Workerロール)に分離して負荷を分散させることができる。既存のソフトウェアをWindows Azureストレージ対応にするにはその工数がネックとなるだろうが、新規にWindows Azureアプリケーションを開発する場合はWindows Azureストレージの利用をぜひおすすめしたい。

 さて、次回はやや趣向を変えて、最近注目されているWebアプリケーション開発/実行環境「Node.js」のWindows Azure上での利用について紹介する。すでにWindows Azureに向けたNode.js環境は整備されており、Microsoftも公式にNode.jsの利用をプッシュしている。Node.js向けの開発ツールであるCloud9 IDEとの連携も可能で、Node.jsを簡単に使うための環境としても注目したいところだ。Node.jsをWindows Azureで利用するための手順から簡単なアプリケーションの作成まで、Windows Azure上でNode.jsを利用するための方法を解説する。