IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  Architecture | Web development  >

Amazon Web サービスを利用したクラウド・コンピューティング: 第 4 回 SQS による信頼性の高いメッセージング

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

原文はこちら

原文はこちら


レベル: 初級

Prabhakar Chaganti, CTO, Ylastic, LLC

2008年 12月 02日

Amazon Web サービス™を利用したクラウド・コンピューティングについて学ぶ連載「Amazon Web サービスを利用したクラウド・コンピューティング」では、スケーラブルで信頼性の高いアプリケーションを設計し、構築する上で Amazon Web サービスがどのように強力な代替手段を提供するかを探っていきます。今回の記事で学ぶのは、Amazon SQS (Simple Queue Service) が実現する信頼性の高いスケーラブルなメッセージング・サービスです。

Amazon SQS

Amazon SQS (Simple Queue Service) は、テキスト・メッセージの作成、保存、取得を簡易化するスケーラブルで信頼性に優れたメッセージング・フレームワークです。SQS は、Amazon Web サービス・ベースのアプリケーションを結び付ける際の基盤として利用することができます。真の意味で分離した Web スケールのアプリケーションを構築するには、この SQS が理想的な手段となります。課金の対象となるのは、使用したメッセージの分のみです。しかもこのキューイング・フレームワークの全体が、Amazon が所有するデータセンターというセキュアな環境内で稼働します。

SQS には、以下の特徴があります。

信頼性
常にメッセージを利用できるように、SQS は冗長構成になっており、メッセージを複数のデータセンターに保存するように設計されています。
単純さ
SQS にアクセスして使用するためのプログラミング・モデルは単純なため、さまざまなプログラミング言語で使用することができます。
セキュリティー
SQS は高度なセキュリティーを提供するように設計されています。メッセージへのアクセスは、許可されたユーザーだけに制限されます。
スケーラビリティー
SQS を利用することで、読み書きできるメッセージに制限がないキュー・ベースのアプリケーションを、何の制約や制限もなく作成できるようになります。
低コスト
SQS はその料金設定によって、メッセージングのニーズに対応するための極めて経済的で強力な手段となります。

このセクションの残りでは、SQS フレームワークを支える概念について説明します。

メッセージ

メッセージに含められるテキスト・データの最大サイズは 8 KB です。各メッセージは、受信側アプリケーションが取得するまで保存されます。受信側アプリケーションがキューからメッセージを読み取る際には、可視性タイムアウト値 (秒単位) が指定されます。この値はいわばロックのような役割を果たし、指定の期間中、以下のことを確実にします。

  • 取得したメッセージは、キューの他のコンシューマーからはアクセスできないこと。
  • タイムアウト期間が満了すると、読み取りプロセスによってメッセージが削除されていない場合にのみ、メッセージがキューに再表示されること。

メッセージがキュー内に保持されるのは 4 日間です。

Amazon の CTO、Werner Vogels が彼のブログで結果整合性に関する論理的根拠について議論しています (「参考文献」を参照)。
4 日間を経過したキュー内のメッセージは、SQS によって自動的に削除されます。SQS は「結果整合性」のモデルに従います。このモデルが意味するのは、ユーザーがキューにメッセージを送信できても、そのキューのコンシューマーはかなりの期間、そのメッセージを見られない可能性があるということです。最終的にメッセージは配信されますが、メッセージの順序に意味があるアプリケーションの場合には、この点が重要な考慮事項となります。

表 1 に、メッセージの構成要素を記載します。


表 1. メッセージの構成要素
構成要素内容
MessageIdメッセージを参照する一意の ID
ReceiptHandleキューからのメッセージを受信するときに返される一意のハンドル。このハンドルは、キューからメッセージを受信するたびに変わります。メッセージを削除するには、このハンドルが必要です。
MD5OfBodyURL エンコードされていないメッセージ本体のストリングの MD5 ダイジェスト
本体実際のメッセージ・データ

キュー

キューとは、メッセージのコンテナーのことです。メッセージには、そのメッセージを保持するキューが指定されていなければなりません。キューに送信されたメッセージは、ユーザーが明示的に削除するまではキューに残ります。キューではファーストイン・ファーストアウトでメッセージに順序を付けますが、この順序は保証されていません。各キューは可視性タイムアウト (visibility timeout) をデフォルトで 30 秒に設定します。この値はキュー全体で変更することも、メッセージの取得時に各メッセージに対して個別に設定することもできます。キューまたはメッセージの可視性タイムアウトの最大値は 2 時間 (7,200 秒) です。SQS は、キュー内でのアクティビティーが 30 日間連続して行われない場合、そのキューを自動的に削除する権限を持ちます。

設計についての考慮事項

SQS は一般的なキュー・フレームワークとは少し異なります。SQS ベースのアプリケーションを設計する前には、以下の 3 つの点を考慮しなければなりません。

  • SQS はキュー内でのメッセージの順序を保証しません。

    メッセージは、キュー内で大まかに順序付けられます。これはつまり、メッセージはキューに追加された順序で保存されるわけではないということです。SQS はメッセージの順序を維持しようとしますが、ユーザーがメッセージを送信した順序でメッセージを受信する保証はありません。メッセージの順序がアプリケーションにとって重要な場合は、各メッセージに順序付け用のデータを追加してください。

  • SQS はキューからのメッセージ削除を保証しません。

    同じメッセージが何度か処理されたとしても影響がないようにアプリケーションを設計する必要があります。SQS は冗長性と高可用性を提供するために、各メッセージを複数のサーバーに保存します。これらのサーバーのいずれかがメッセージを削除している間に使用不可能になった場合、まれなことですが、メッセージの取得中に削除したはずのメッセージを再度受け取る可能性があります。

  • SQS は、クエリーに対してキュー内のすべてのメッセージを返すとは保証しません。

    重み付きランダム分散に基づくメッセージ・サンプリングを使用する SQS は、メッセージに対するクエリーを実行すると、サンプリングされたサーバーのサブセットのみからメッセージを返します。特定のリクエストでキュー内のすべてのメッセージが返されないとしても、キューからメッセージを取得し続けると、最終的にはサーバーのすべてがサンプリングされてメッセージすべてを取得することになります。

API バージョン

SQS のバージョンには、オリジナル・バージョン (2007-05-01) と 2008-01-01 バージョンの 2 つがあります。API のそれぞれのバージョンには共通して、リリース日が名前に付けられています。2007-05-01 API は 2009年5月6日付で終了する予定です。それ以降は、最新バージョンの API のみがサポートされることになります。そのためユーザーには以下の事項が強く提言されています。

  • 以前の API バージョンで構築したアプリケーションについては、できるだけ早く最新バージョンへの移行を始めること。
  • 混乱を最小限にするため、SQS で新規アプリケーションを作成するときには最新バージョンの API を使用すること。

2008-01-01 バージョンの料金は更新されました。この更新により、ほとんどのユーザーにとっては SQS の使用料が安くなるはずです。また、このバージョンでは機能の追加と API の変更が行われています。ただし、以前の API とは互換性のない大幅な変更がされているため、ライブラリーとツールが以前のバージョンをベースとしている場合には変更が必要になります。バージョン間での変更についての詳細は、SQS Web サイトを参照してください (「参考文献」を参照)。




上に戻る


料金

以下の料金明細は、2008-01-01 バージョンにのみ適用されます。以前のバージョンについては、SQS サイトに詳しい料金体系が記載されています (「参考文献」を参照)。料金は以下の内容に基づきます。

  • SQS に対して行ったリクエスト数。リクエストには、以下の操作が含まれます。
    • CreateQueue
    • ListQueues
    • DeleteQueue
    • SendMessage
    • ReceiveMessage
    • DeleteMessage
    • SetQueueAttributes
    • GetQueueAttributes

    表 2. リクエストの料金

    タイプ 料金
    SQS に対するリクエストリクエストごとに $0.000001


  • SQS とのデータ転送量。SQS と EC2 インスタンス間のデータ転送は無料です。

    表 3. データ転送料金

    転送タイプ 料金
    すべてのデータ転送1 GB ごとに $0.100 — すべてのデータ・アップロード

    1 GB ごとに $0.170 — データ・ダウンロード: 1 ヶ月あたり最初の 10 TB まで
    1 GB ごとに $0.130 — データ・ダウンロード: 1 ヶ月あたり次の 40 TB まで
    1 GB ごとに $0.110 — データ・ダウンロード: 1 ヶ月あたり次の 100 TB まで
    1 GB ごとに $0.100 — データ・ダウンロード: 1 ヶ月あたり 150 TB を超える分


最新の料金については、Amazon SQS を調べてください。また、Amazon Web Services Simple Monthly Calculator を使用して、SQS やその他の Amazon Web サービスの月々の使用料を計算することもできます (「参考文献」を参照)。




上に戻る


Amazon Web サービスおよび SQS の開始手順

SQS を使い始めるには、まず Amazon Web サービスのアカウントにサインアップする必要があります (「参考文献」を参照)。Amazon Web サービスのサインアップ手順についての詳細は、連載第 2 回を参照してください。

Amazon Web サービスのアカウントを入手した後は、以下のステップに従ってアカウントの Amazon SQS サービスを有効にする必要があります。

  1. Amazon Web サービスのアカウントにログインします。
  2. SQS ホーム・ページまでナビゲートします。
  3. ページ右側の Sign Up For Amazon SQS をクリックします。
  4. 必要な情報を入力し、サインアップ・プロセスを完了します。

Amazon Web サービスのどのサービスと通信するにも、その手段としては SOAP インターフェースまたはクエリー・インターフェースのいずれかが使用されます。この記事ではクエリー・インターフェースを使用して、サード・パーティーのライブラリーを介して SQS と通信します。

この後、アクセス・キーを取得する必要が出てきたら、Web Services Account 情報ページAWT Access Identifiers を選択してアクセス・キーを入手してください。これで、Amazon Web サービスを使用するための準備が完了し、アカウントに対して SQS サービスも有効になっています。




上に戻る


SQS の操作

この例ではサード・パーティーのオープンソース Python ライブラリー、boto を使用して、Python シェルで小さなコード・スニペットを実行しながら SQS の使い方を学びます。

boto をインストールして環境をセットアップする

boto をダウンロードします。この記事を執筆している時点での最新バージョンは 1.4c です。アーカイブは任意のディレクトリーに解凍して構いません。アーカイブを解凍したディレクトリーに移動して setup.py を実行すると、boto がローカル Python 環境にインストールされます (リスト 1 を参照)。


リスト 1. boto のインストール
$ cd directory_where_you_unzipped_boto

$ python setup.py install

Amazon Web サービスのアクセス・キーを指すように環境変数を設定します。アクセス・キーは、Web Services Account 情報ページから入手することができます。


リスト 2. 環境変数の設定
# Export variables with your AWS access keys
$ export AWS_ACCESS_KEY_ID=Your_AWS_Access_Key_ID 
$ export AWS_SECRET_ACCESS_KEY=Your_AWS_Secret_Access_Key

すべてが正しく設定されていることを確認するため、Python シェルを起動し、boto ライブラリーをインポートします (リスト 3 を参照)。


リスト 3. 設定の確認
$ python
Python 2.4.5 (#1, Apr 12 2008, 02:18:19) 
[GCC 4.0.1 (Apple Computer, Inc. build 5367)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto
>>>

boto で SQS を使用してみる

ここで使用するのは SQSConnection クラスです。このクラスが、SQS を操作するための主なインターフェースを提供します。boto を使用する手段としては、Python コンソールを使用します。この例では SQSConnection オブジェクトで数種類のメソッドを呼び出し、SQS が返すレスポンスを調べます。SQS の概念を探るこの手順を通して、SQS の API についての理解も深まるはずです。

最初のステップは、前の手順で環境に対して export を実行した Amazon Web サービスのアクセス・キーを使用して、SQS との接続オブジェクトを作成することです。boto ライブラリーは必ず最初に環境をチェックして、アクセス・キーを指す変数が設定されているかどうかを確認します。変数が設定されていれば、boto は接続を作成する際に自動的にこれらの変数を使用します。


リスト 4. SQS との接続の作成
>>> import boto
>>> sqs_conn = boto.connect_sqs()
>>>

この記事の残りでは、上記で作成した sqs_conn オブジェクトを使って SQS を操作することができます。キューを作成するには、そのキューの名前、そしてオプションで可視性タイムアウト値を指定します。タイムアウトの値を指定しない場合、boto は SQS が指定するデフォルト値として 30 秒の可視性タイムアウトを設定したキューを作成します。


リスト 5. キューの作成
>>> q1 = sqs_conn.create_queue('devworks-sqs-1')
>>> 
>>> q1.get_timeout()
30
>>> q2 = sqs_conn.create_queue('devworks-sqs-2', 60)
>>> 
>>> q2.get_timeout()
60
>>>

すべてのキューのリストを取得します。これによって返される結果セット・オブジェクトは基本的に、Python リストです (リスト 6 を参照)。このリストを繰り返し処理することで、各キューに関するすべての関連情報にアクセスすることができます。


リスト 6. すべてのキューのリスト
>>> all_queues = sqs_conn.get_all_queues()
>>> 
>>> len(all_queues)
2
>>> 
>>> for q in all_queues:
...     print q.id
...     print q.count()
...     print q.get_timeout()
...     print q.url
... 
/devworks-sqs-1
0
30
http://queue.amazonaws.com/devworks-sqs-1

/devworks-sqs-2
0
60
http://queue.amazonaws.com/devworks-sqs-2
            

キューを削除するには、あらかじめそのキュー内に含まれるすべてのメッセージを削除しておかなければなりません。boto には、キュー内のすべてのメッセージを削除するための clear() メソッドがあります。


リスト 7. キューのクリアと削除
>>> q2.clear()
0
>>> sqs_conn.delete_queue(q2)
True
>>>

キューに送信できるテキスト・メッセージの最大サイズは 8 KB です。新規メッセージは、boto の Message クラスを使用して作成してください (リスト 8 を参照)。


リスト 8. メッセージの送信
>>> from boto.sqs.message import Message
>>> 
>>> m1 = Message()
>>> 
>>> m1.set_body('Hi there devworks!')
>>> 
>>> status = q1.write(m1)
>>> 
>>> print status
True
>>>

キューのメッセージを検索すると、結果セット・オブジェクトが返されます。この結果セット・オブジェクトは、メッセージ・オブジェクトが含まれる Python リストです。各メッセージ・オブジェクトには一意に決まる ID があり、受信ハンドルが関連付けられます。メッセージをキューから読み取る時点から、そのキューに設定された可視性タイムアウト期間が満了するまで、そのメッセージは自動的にキューの他のすべてのコンシューマーには見えなくなります。タイムアウト期間が満了するとメッセージは再びキューの中に見つかるようになり、他のコンシューマーがそのメッセージを取得して処理できるようになります。ただし、可視性タイムアウト期間が満了する前にメッセージがキューから削除された場合には、メッセージは永久に消え、再びキューの中に見つかることはありません。


リスト 9. メッセージの取得
>>> msgs = q1.get_messages()
>>> 
>>> len(msgs)
1
>>>
>>> for msg in msgs:
...     print "Message ID: ",msg.id
...     print "Message Handle: ",msg.receipt_handle
...     print "Queue ID: ", msg.queue.id
...     print "Message Body: ", msg.get_body()
... 
Message ID:  9a930aaf-87de-48ad-894d-b22dd0b1cd1b

Message Handle:  Prl0vft3nRjgDDT33svtLnzyPQGWFpRusXdn2v3Lwq+TDtD3hk3aBKbSH1mGc4hzO/VZO
IC0RFyAd7MhbJKPGHn3x35CTz9dAQeNoKYAHiwERXc/xrYXBLGngyuJI+kGmbjvIKqA/wpfQpqzPk2bVA==

Queue ID:  /devworks-sqs-1

Message Body:  Hi there devworks!
>>>

メッセージの数を指定することで、複数のメッセージを取得することができます。boto のデフォルト・オプションによって返されるメッセージは 1 つだけです。ここで、別のメッセージをキューに追加して、すべてのメッセージを取得してみましょう (リスト 10 を参照)。新しく追加したメッセージがキュー内に現れるまでに 1 分程度かかる場合もあることに注意してください。


リスト 10. 複数のメッセージの取得
>>> m2 = Message()
>>> 
>>> m2.set_body('Still there?')
>>> 
>>> status = q1.write(m2)
>>> 
>>> print status
True
>>>
>>> msgs = q1.get_messages(10)
>>> 
>>> len(msgs)
2
>>>
>>> for msg in msgs:
...     print "Message ID: ",msg.id
...     print "Message Handle: ",msg.receipt_handle
...     print "Queue ID: ", msg.queue.id
...     print "Message Body: ", msg.get_body()
...     print "*"*80
... 
Message ID:  9a930aaf-87de-48ad-894d-b22dd0b1cd1b

Message Handle:  Prl0vft3nRjgDDT33svtLnzyPQGWFpRusXdn2v3Lwq+TDtD3hk3aBKbSH1mGc4hzO/VZOIC0R
FyAd7MhbJKPGHn3x35CTz9dAQeNoKYAHiwERXc/xrYXBLGngyuJI+kGmbjvIKqA/wpfQpqzPk2bVA==

Queue ID:  /devworks-sqs-1

Message Body:  Hi there devworks!


Message ID:  ce1632b3-0a6e-4ee2-a5b0-b2e9821d150f

Message Handle:  Prl0vft3nRiRunVNVvjOQEc7Tm+uSBQpW4bZcpFMbzWTDtD3hk3aBKbSH1mGc4hzO/VZOIC0R
FxbhtlykUxvNbRQNWJqrMXrxj5m6GwhA7iX0Nu9mqjo+9/hnda8Ou0df+LQ3dOMfXSybzbhed128w==

Queue ID:  /devworks-sqs-1

Message Body:  Still there?
>>>

メッセージをキューから削除するには、delete_message() を呼び出します。注意する点として、キューを削除する前には必ず、そのキュー内に含まれるすべてのメッセージを削除してください。


リスト 11. メッセージの削除
>>> msgs = q1.get_messages()
>>> 
>>> len(msgs)
1
>>> print msgs[0].get_body()
Hi there devworks!
>>> 
>>> q1.delete_message(msgs[0])
True
>>>




上に戻る


まとめ

この記事では、Amazon の SQS サービスを紹介しました。基本概念を説明した後、SQS を操作するためのオープンソースの Python ライブラリー boto が提供するいくつかの関数を使用してみました。さらに詳細な情報については、是非とも Amazon SQS Developer Guide をお読みになることをお薦めします (「参考文献」を参照)。

連載「Amazon Web サービスを利用したクラウド・コンピューティング」の第 5 回では、Amazon SimpleDB によるクラウド内でのデータセットの処理について説明します。



参考文献

学ぶために

製品や技術を入手するために
  • IBM 製品の評価版をダウンロードして、DB2®、Lotus®、Rational、Tivoli®、および WebSphere のアプリケーション開発ツールとミドルウェア製品を使ってみてください。


議論するために


著者について

Prabhakar Chaganti photo

Prabhakar Chaganti が CTO を務める Ylastic は、EC2、S3、SQS、SimpleDB を含めたユーザーの AWS クラウド・コンピューティング環境全体を設計、管理、モニターするための統一インターフェースを構築している新興企業です。彼は最近、『Xen Virtualization』および『GWT Java AJAX Programming』という 2 冊の本を書いています。VMware Global Virtual Appliance Challenge では、最も革新的な仮想アプライアンスに贈られるコミュニティー特別賞も受賞しています。




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



 


 


不充分・不完全である大変素晴らしい
 


この記事を共有する

del.icio.us del.icio.us newsing newsing FC2ブックマーク FC2ブックマーク
Choix! Choix! ニフティクリップ ニフティクリップ Yahoo!ブックマーク Yahoo!ブックマーク
MM/memo MM/memo CZブックマーク CZブックマーク livedoorクリップ livedoorクリップ
はてなブックマーク はてなブックマーク Buzzurl(バザール) Buzzurl(バザール)




上に戻る


IBM、IBM ロゴ、ibm.com、DB2、developerWorks、Lotus、Rational、Tivoli、および WebSphere は、International Business Machines Corporation の米国およびその他の国における商標または登録商標です。これらおよび他の IBM 商標に、この情報の最初に現れる個所で商標表示 (® または ™) が付されている場合、これらの表示は、この情報が公開された時点で、米国において、IBM が所有する登録商標またはコモン・ロー上の商標であることを示しています。このような商標は、その他の国においても登録商標またはコモン・ロー上の商標である可能性があります。現時点での IBM の商標リストについては、www.ibm.com/legal/copytrade.shtml の「Copyright and trademark information」をご覧ください。 他の会社名、製品名およびサービス名等はそれぞれ各社の商標です。 他の会社名、製品名およびサービス名等はそれぞれ各社の商標です。

    日本IBMについて プライバシー お問い合わせ