NI+CでSoftLayerエンジニアをしている常田です。

SoftLayerでは以前より好評頂いている「ObjectStorage」がありますが、同様に「Message Queue」についてもAPI含めサービス提供しています。 今回は、数回に分けてCliやAPIを利用して簡単なMessage Queueについての動作を紹介したいと思います。

2回目の今回はslcliを利用して簡単にキューを送受信してみたいと思います。

準備

用意

以下のvesion4.0のコマンドラインツールを利用します。

slcli のオプション

  accounts-list      List SoftLayer Message Queue Accounts.
  endpoints-list     List SoftLayer Message Queue Endpoints.
  ping               Ping the SoftLayer Message Queue service.
  queue-add          Create a queue.
  queue-detail       Detail a queue.
  queue-edit         Modify a queue.
  queue-list         List all queues on an account.
  queue-pop          Pops a message from a queue.
  queue-push         Push a message into a queue.
  queue-remove       Delete a queue or a queued message.
  topic-add          Create a new topic.
  topic-detail       Detail a topic.
  topic-list         List all topics on an account.
  topic-push         Push a message into a topic.
  topic-remove       Delete a topic.
  topic-subscribe    Create a subscription on a topic.
  topic-unsubscribe  Remove a subscription on a topic.

メッセージ・キューについてもslcliから沢山の処理ができるようになりました。機能的にはひと通りの事が出来ます。

アカウントの情報の参照

root@f8abe000137a:/# slcli messaging accounts-list
:.......:..............:........:
:   id  :     name     : status :
:.......:..............:........:
: 5ymxx : SLMQ396820-1 : Active :
: 5ymxx : SLMQ396820-2 : Active :
:.......:..............:........:

このコマンドでは、購入したキュー名がわかります。実際にはIDが付与されているのでこのIDを引数を元に処理を実行していきます。

root@f8abe000137a:/# slcli messaging endpoints-list
:.......:........................:...................................:
:  name :         public         :              private              :
:.......:........................:...................................:
: dal05 : dal05.mq.softlayer.net : dal05.mq.service.networklayer.com :
:.......:........................:...................................:

このコマンドではMQがどこにアクセスればよいかが表示されています。現在はダラスに処理を受ける場所が設置されていることがわかります。これも購入時のロケーションの設定によります。

root@f8abe000137a:/# slcli messaging ping
OK

状態の確認をすることが出来ます。

キューの利用

キューの作成

まず、キューを作成します。ここでは queue01 という名前で作りたいと思います。

root@f8abe000137a:/# slcli messaging queue-add  5ymf7 queue01
:.......................:.........:
:              property : value   :
:.......................:.........:
:                  name : queue01 :
:         message_count : 0       :
: visible_message_count : 0       :
:                  tags :         :
:            expiration : 604800  :
:   visibility_interval : 30      :
:.......................:.........:

これで送信側、受信側でメッセージをいれる「箱」が出来たことになります。

キューの操作

キューの書き込み

次にキューへメッセージを書き込んで見ます。
メッセージ・キューではメッセージはキューに順序をもちストックされていきます。ただしあくまでもメッセージ・キューサーバ側が受け取った順に登録されます。TCPで送信されるため場合によっては送信側の立場からは後から発行したメッセージが先に到達する可能性もありますので注意をしましょう。

以下では3個のメッセージを、キュー”queue01″に対して書き込み(push)しています。

root@f8abe000137a:/# slcli messaging queue-push  5ymf7 queue01 "sample message1"
:.....................:..................................:
:            property : value                            :
:.....................:..................................:
:                  id : e88b508300c68c7ac60a27aead7ee9f7 :
:  initial_entry_time : 1428357443.9                     :
:    visibility_delay : 0                                :
: visibility_interval : 30                               :
:              fields : None                             :
:.....................:..................................:
sample message1
root@f8abe000137a:/# slcli messaging queue-push  5ymf7 queue01 "sample message2"
:.....................:..................................:
:            property : value                            :
:.....................:..................................:
:                  id : eb96061360b9e4e57373fa056266fea6 :
:  initial_entry_time : 1428357447.34                    :
:    visibility_delay : 0                                :
: visibility_interval : 30                               :
:              fields : None                             :
:.....................:..................................:
sample message2
root@f8abe000137a:/# slcli messaging queue-push  5ymf7 queue01 "sample message3"
:.....................:..................................:
:            property : value                            :
:.....................:..................................:
:                  id : eb96061360b9e4e57373fa05626731ac :
:  initial_entry_time : 1428357450.91                    :
:    visibility_delay : 0                                :
: visibility_interval : 30                               :
:              fields : None                             :
:.....................:..................................:
sample message3

SoftLayer MessageQueue

キューから読み込み

受信側ではキューに溜まったメッセージをpopコマンドで読み取ることが出来ます。この際に読み込む順番は登録されている順に取り出します。

SoftLayer MessageQueue

最初に受信側からpopすると「メッセージ1」が読み取ることが出来ます。この際にキュー”queue01″から「メッセージ1」は削除されたわけではなく一時的に非表示になります。この期間を「visiblity_interval」で定義し今回は30病となっています。

SoftLayer MessageQueue

このように連続してpopした場合には「メッセージ2」が次に受信されます。
読み取ったキューを「削除(remove)」することをしない場合には30秒後にはキューの状態は以下のようになります。

SoftLayer MessageQueue

すなわち再度キューを読み取る場合には再度「メッセージ1」を受信することになります。したがって受信側の処理を並列で動かす設計にしている場合にはユーザ側で正しく処理をする必要があります。

root@f8abe000137a:/# slcli messaging queue-pop  5ymf7 queue01
:.....................:..................................:
:            property : value                            :
:.....................:..................................:
:                  id : e88b508300c68c7ac60a27aead7ee9f7 :
:  initial_entry_time : 1428357443.9                     :
:    visibility_delay : 0                                :
: visibility_interval : 30                               :
:              fields : None                             :
:.....................:..................................:
sample message1
root@f8abe000137a:/# slcli messaging queue-pop  5ymf7 queue01
:.....................:..................................:
:            property : value                            :
:.....................:..................................:
:                  id : eb96061360b9e4e57373fa056266fea6 :
:  initial_entry_time : 1428357447.34                    :
:    visibility_delay : 0                                :
: visibility_interval : 30                               :
:              fields : None                             :
:.....................:..................................:
sample message2

この後、30秒後に再度popを実行した場合には「メッセージ1」を受診することになります。

root@f8abe000137a:/# slcli messaging queue-pop  5ymf7 queue01
:.....................:..................................:
:            property : value                            :
:.....................:..................................:
:                  id : e88b508300c68c7ac60a27aead7ee9f7 :
:  initial_entry_time : 1428357443.9                     :
:    visibility_delay : 0                                :
: visibility_interval : 30                               :
:              fields : None                             :
:.....................:..................................:
sample message1
root@f8abe000137a:/# slcli messaging queue-detail  5ymf7 queue01
:.......................:.........:
:              property : value   :
:.......................:.........:
:                  name : queue01 :
:         message_count : 3       :
: visible_message_count : 1       :
:                  tags :         :
:            expiration : 604800  :
:   visibility_interval : 30      :
:.......................:.........:

ここでvisible_messsage_countが1になっており実際には「メッセージ3」が格納されていることになります。

メッセージの削除

メッセージを削除(remove)するとキューから完全に削除する事が可能です。

SoftLayer MessageQueue

この場合には「メッセージ1」を削除しました。そうすることでメッセージ・キューの先頭は「メッセージ2」となりキューの全体のカウントが1つ減ることになりました。

root@f8abe000137a:/# slcli messaging queue-remove  5ymf7 queue01 e88b508300c68c7ac60a27aead7ee9f7
root@f8abe000137a:/# slcli messaging queue-detail  5ymf7 queue01:.......................:.........:
:              property : value   :
:.......................:.........:
:                  name : queue01 :
:         message_count : 2       :
: visible_message_count : 2       :
:                  tags :         :
:            expiration : 604800  :
:   visibility_interval : 30      :
:.......................:.........:

まとめ

今回はslcliを利用して簡単にキューを操作してみまいた。実際には、JavaやPythonなどから操作が可能ですので適切な処理系に組み込んで利用することになるとおもいます。キューを利用することで非同期の並列処理を作る土台が出来ますので是非活用してみてください。

次回はメッセージ・キューのもう一つの機能である「トピック」について見て行きたいと思います。