Alibaba Cloud Message Serviceの「Queue」と「Topic」

#Alibaba Cloud Message Serviceの「Queue」と「Topic」
##Alibaba CloudのMessage Serviceとは
 Alibaba Cloudは中国で最も利用されているクラウドコンピューティングサービスプロバイダーで、ビジネスに役立つサービスを数多く提供しています。そして、その中の一つに「Message Service」があります。このMessage Serviceは膨大な量のデータを取り扱うことができ、ユーザーの同時操作にも対応できる、拡張が容易な分散型のMNS（Message and Notification Service）になります。このサービスを使うことで、たとえばソフトウェア開発者はM2M（Machine to Machine）の機能の実装を容易に行うことができるようになります（システムと人との通信ももちろん可能です）。また、Message Serviceは他のAlibaba Cloudの製品と連携させることもできます。ここでは実際にそのAlibaba Cloudのメッセージサービス管理コンソールを使ってMessage Serviceを試してみました。

##Message Serviceの概要
###Message Serviceには2つのモデルがある
　システム間のやり取りを容易にすることができるこのMessage Serviceには「Queue」と「Topic」という二つのモデルがあります。「Queue」と「Topic」はもちろんどちらもメッセージのやり取りを行うことができますが、設計が異なりそれぞれに特徴があります。

###「Queue」モデル
　Queueはメッセージの送信側と受信側が1対1になるモデルで、送信側・受信側のメッセージのやり取りが同時に頻発するような場合でも対応できるように設計されています（一つのメッセージに対して複数のリクエストが同時に来た場合も対応できます）。送信側が送ったメッセージはQueueに送られ、Queueから今度は受信側に送られます。
主に以下のような特徴があります。
1.メッセージにオリジナルの値を持たせることができる
2.同時に複数リクエストがあっても対応できる
　Queueには複数の送信側と受信側が同時にアクセスすることが可能ですが、一つのメッセージを複数の受信側が取りに行くことはできないようになっています（メッセージをあるユーザーが受け取った場合、他のユーザーはそのメッセージを受け取れないようになっています）。
3.Queueに送られたメッセージは少なくとも一度はユーザーに送信される
4.トランザクションをサポートしている
 アプリケーション内でQueueにメッセージを送った後エラーが起こった場合、その処理をロールバックすることができます。
5.ログ機能が付いている
　メッセージの送信、受信、削除の操作を検索することができます。デバックに利用します。

###「Topic」モデル
　Topicモデルにはメッセージ通知の方法が複数用意されています。送信側が送ったメッセージはTopicに送られ、そのあとHTTPサーバー、メールサーバー、Queueなどに送られてから、受信側に届きます。Queueとは異なりメッセージの送信側と受信側を1対多にすることができます。
主に以下のような特徴があります。
1.フィルター機能が付いている
　メッセージにタグをつけることができ、特定のタグが付いているメッセージだけを受信側に送ることが可能です。
2.メッセージのフォーマットを設定できる（XML、JSONなど）
3.メッセージを様々な方法で送ることができる（HTTP、メール、Queue、モバイル端末など）
4.メッセージ通信の確実に行うための設定が用意されている
 以下の二つがあります。
　BACKOFF_RETRY・・・メッセージの送受信を合計3回リトライする。インターバルは10秒～20秒。
　EXPONENTIAL_DECAY_RETRY・・・合計176回リトライする。インターバルは1, 2, 4, 8 , 16, 32, 64, 128, 256, 512, 512, 512（秒）・・・と増えていく。512秒になったらそれ以降のインターバルは512秒になる。
5.ログ管理ができる
　メッセージ関連の操作ログはSLSまたはOSSに保管されている。

##Message Serviceの使い方

###Message Serviceを有効化に設定
1.Alibaba Cloudのホームページで「プロダクト ＞ アプリケーションサービス ＞ Message Service」を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/929c4034-46aa-de0f-d842-f7e2ec2fb471.png)

2.以下のページで「今すぐ利用開始」をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/0a1afdd3-607d-64ff-3113-bc7ee8b562fd.png)

3.以下のページで利用規約の同意にチェックをつけ、「今すぐ有効化」をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/eae7ae15-870f-f20b-2101-642ed0a757d1.png)

4.以下のページが表示され、Message Serviceの有効化完了
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/fb76b85c-643b-f024-a062-8ff152904e47.png)

###Queueの操作
####Queueの作成方法
1.以下の画面右上の「キューの作成」をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/b9541ed3-dfe7-607f-3729-91a24742375a.png)

2.以下の画面でQueueを設定し「OK」をクリックする
 「キュー名」のみ必須です。「キュー名」は、「英字か数字で始まること」、「英字か数字かハイフンであること（それ以外の文字は入力できない）」、「256文字以下であること」が条件になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/41f75f45-87ea-e8e5-8e87-be2ea4136aff.png)

　入力が完了すると以下のように作成したQueueが画面に表示されます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/8544a5c1-2a2a-6e21-65c5-ec201d73bcb8.png)

####Queueへのメッセージの送信方法
1.以下の画面で「メッセージの送信」をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/9b171c32-9df2-685c-9b57-bacac3ad7a45.png)

2.以下のページで「メッセージの内容」を入力し、「メッセージの送信」をクリックする
 以下の画面で入力したメッセージがQueueに送信されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/330bf698-f8e8-3f8c-919b-5ef692724ca3.png)

####Queueからのメッセージの受信方法
1.以下の画面で「メッセージの受信」をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/3357ef0b-76b9-4c29-94b7-414585d3c4eb.png)


2.下記の画面でメッセージを確認できる
　画面下の「メッセージの受信」をクリックすると、現在表示されているものの次のメッセージを受信することができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/d4649f25-1583-3a88-10c4-b6e1ba06f11e.png)

###Topicの操作
####Topicの作成方法
1.「トピック」のタブをクリックし、以下画面が表示されたら右上の「トピックの作成」をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/db971925-379a-7911-87e8-6595f1d6359d.png)

2.以下の画面でTopicを設定し「OK」をクリックする
 「トピック名」のみ必須で、「英字か数字で始まること」、「英字か数字かハイフンであること（それ以外の文字は入力できない）」、「256文字以下であること」が条件になります（キューと同じ）。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/6b894e58-d760-20f4-0a80-852d46fb32cc.png)

入力が完了すると以下のように作成したTopicが画面に表示されます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/41804dd7-2000-c45e-ea38-af8cdbd14962.png)

####Subscriptionの作成方法
1.以下の画面の「サブスクリプションリスト」をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/e333da51-3346-f5c2-f9c5-928ac21cafce.png)

2.以下の画面で画面右上の「サブスクライブ」をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/ba23ce32-f210-5b28-9f68-963ad8bca270.png)

3.以下の画面で「サブスクリプション」のを設定する
　入力するのは「プッシュタイプ」、「サブスクリプション名」、「エンドポイント」、「メッセージフィルター」、「通知方法」、「通知内容の形式」です。プッシュタイプは、「HTTP」、「キュー」、「メール」、「mobile push」から選択できます。今回の例ではキューを選択しています。エンドポイントは選択したプッシュタイプによって入力するものが変わります（例えば、HTTPを選択した場合はURL、キューを選択場合はキュー名など）。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/78f88652-8e98-e807-0aeb-b893f98bc28e.png)

入力が完了すると以下のように作成したSubscriptionが画面に表示されます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/33515580-c64b-97fa-7441-4b4a32418435.png)

####Topicからのメッセージの送信方法
1.以下の画面で「メッセージのパブリッシュ」を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/3613b05a-ab08-0f6c-3094-f1daab8d9e28.png)

2.以下の画面で「メッセージの内容」を入力し「メッセージの送信」をクリックする
　以下でTopicからメッセージが送信されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/d5f07d6f-1230-64ca-7743-b7d89f71ffc1.png)

##Message Serviceを実際に使ってみた（TopicからQueueへメッセージを送ってみた）
　上記の手順で作成したQueueとTopicを使い、実際にTopicからQueueへメッセージを送ってみました。QueueとTopicはすでに作成済みなので、Topic側ではメッセージを送信できること、Queue側ではメッセージを受信できることを確認したいと思います。
　まず以下のように「TopicからQueueへのメッセージです。」というメッセージを入力し、「メッセージの送信」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/291a68ad-8185-d5df-b237-e31c7080d01e.png)

　次にメッセージの受信をQueue側で確認します。以下のように、メッセージ管理コンソールのキューのタブの「メッセージの受信」をクリックすると、以下の画面が表示されます。先ほどTopicで送信した「TopicからQueueへのメッセージです。」というメッセージがQueueで受信できたことを確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/45cd4adb-4f6a-40d7-5245-102e830c1248.png)

##まとめ
　Alibaba CloudのMessage Serviceには「Queue」と「Topic」の二つのモデルがあります。二つともシステム間でメッセージをやり取りする場合などに利用されますが、メッセージの伝達方法など構造に違いがあります。Message Serviceを使用することで、アプリケーション間でメッセージを通して容易に連携することができるようになり、結果複雑な分散システムの構築なども可能になります。