Active MQを触ってみる

## はじめに
業務でActive MQを扱ったのですが、情報量の少ないシンプルなコンソールで、なかなか全体像が見えにくいと感じました。今回はActive MQや、そのようなMQサービスと連携できるAmazon MQについて概要をまとめてみようと思います。



## Amazon MQとは
Amazon MQはAWSのサービスの一つです。マネージドメッセージブローカーサービスと呼ばれるものです。Active MQとRabbitMQなど、既存のMQサービスと連携して移行することができます。
メッセージブローカーサービスとは、２システムが直接メッセージデータのやりとりをするのではなく、その間に入って中継（ブローカー）するサービスのことを指します。

このようなサービスを使うことによって、２システム間でメッセージ送受信のタイミングを図らずとも、よしなにデータのやりとりをしてくれます。
また各コンポーネントを疎結合化し、相互の依存性を小さくすることで保守性も高めることができます。

AWSMQを使うメリットは以下のようなものがあります。

- プロトコルはAWS独自のものではなく、業界標準のMQTTなどが使われているため、既存MQサービスからの移行が容易。
- AWSのフルマネージドサービスであるため、自分でサーバなどを用意する必要がない。EC2のインスタンスが使われているようで、スケールはEC2と同じような選択肢の中から選ぶことができる。
- AWSの一つであることからデータの耐久性や堅牢なセキュリティに長けている。
[MQTTとは：非同期で軽量なメッセージのやりとりをする通信プロトコルのこと。HTTPに比べて送受信の効率がよく、媒体の消費電力も抑えられます。]

AWSには他にAmazon SNSやAmazon SQSというサービスがあります。
Amazon MQはその移行のしやすさから、既存で使っているメッセージングサービスから移行するときに選択することが多そうです。一方Amazon SNSやAmazon SQSは新規にメッセージングサービスを構築して運用していく場合に選択することが多いようです。



## ActiveMQとは
ActiveMQはオープンソースのJavaベースのメッセージブローカーです。Apache License 2.0によるミドルウェアです。
[Apache License 2.0とは：オープンソースソフトウェアの開発や配布を行っているApacheの持つライセンスのこと。Swiftなどもこのライセンスのもとディストリビュートされている]

MQのサービスにはPublisher、Subscriber、Brokerの３つの考え方があります。
Publisherは直訳すると出版者、つまりメッセージを送る元になるシステムを指します。Subscriberは購読者、つまりメッセージの受け手です。Brokerは仲介者のことですので、MQのサービスを指します。

ActiveMQではさらに、QueueとTopic２つの概念があります。
Queueはメッセージの送信者と受信者が一対一で対応しているモデルを指します。一方のTopicは送信者一人に対して受信者が複数いるモデルとなります。

それでは次節から実際にローカルでAcriveMQを動かしてみて、コンソールの様子を眺めてみましょう。



## ActiveMQのインストール
WindowsやLinux用のダウンロードは[公式サイト](https://activemq.apache.org/activemq-5014004-release)からできますが、Macを使っている私はターミナルにて、以下のコマンドでインストールしました。

```
$ brew install apache-activemq
$ brew services start activemq
```
 
/usr/local/Cellar/activemq/x.x.x/　に最新バージョンのものがインストールされます。
 
コマンドにてActiveMQのインストール・起動が完了したら「http://localhost:8161/admin/ 」に接続します。ユーザ名とパスワードが要求された場合はいずれも初期値の「admin」を入力します。

MacOS版のインストールや起動方法についてはこちらの内容を参考にしました。
[How to Install ActiveMQ server in MAC OS system?](https://stackoverflow.com/questions/43323727/how-to-install-activemq-server-in-mac-os-system)

このようなコンソールが表示されたかと思います。それではこちらの各ページの内容について見ていきます。

![スクリーンショット 2022-02-25 18.54.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1676583/9bc370bb-394f-c837-71fa-1a65e630dccb.png)

## 試しにQueuesを動かしてみる
Queuesのタブをクリックします。前述の通りここに、送信者と受信者が一対一対応するQueueを設定することができます。
まずCreateの小窓にTestQueueと入力し、Queueを作成します。

![スクリーンショット 2022-02-25 18.54.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1676583/f0b79875-df11-3823-c2d3-9092ffc2f174.png)

うまく作成されました。まだメッセージも何も送っていないため、それぞれの値は0になっています。

![スクリーンショット 2022-02-25 18.55.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1676583/28e3fb3a-8a3d-2c3c-f818-7c2607cc2b65.png)

続いて受信者であるConsumer側の反応を確認するため、ターミナルで以下のコマンドを入力します。

```
$ activemq consumer --destination queue://TestQueue
```

すると以下のようにリスニングを始めます。

```
 INFO | Connecting to URL: failover://tcp://localhost:61616 as user: null
 INFO | Consuming queue://TestQueue
 INFO | Sleeping between receives 0 ms
 INFO | Running 1 parallel threads
 INFO | Successfully connected to tcp://localhost:61616
 INFO | consumer-1 wait until 1000 messages are consumed
```

コンソールに戻ると、「Number of Consumers」が１になっているのがわかります。これでConsumer側がうまく認識されたことになります。

![スクリーンショット 2022-02-25 18.56.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1676583/a443abb6-64da-4ff5-3cd3-3df4202631d0.png)

それではOperationsのSend Toをクリックしてみましょう。
メッセージをsendするための設定画面が出てきました。message bodyの部分にテストメッセージを入力して「send」ボタンをクリックします。

![スクリーンショット 2022-02-25 18.56.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1676583/a92f3cd9-a8d8-820d-df29-08fef36796d2.png)

Consumer側のターミナルを確認すると、以下のメッセージが現れました。メッセージがうまく受信されたようです。

```
 INFO | consumer-1 Received Test message
```

メッセージを送った直後は「Number of Pending Messages」の値が増えて受信待ち状態になりますが、やがて「Messages Dequeued」の値が増えて送信完了状態となります。

![スクリーンショット 2022-02-25 18.57.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1676583/c4f8f3bf-ff57-c4a3-1717-5bbaaca30c64.png)

先ほど「consumer-1 wait until 1000 messages are consumed」というメッセージが表示されていたので、試しに1000件単位でメッセージを送ってみます。

![スクリーンショット 2022-02-25 18.58.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1676583/ff365f09-cb70-50d4-1fb6-7ee3c336fa98.png)

```
 INFO | consumer-1 Received many messages
 INFO | consumer-1 Received many messages
 INFO | consumer-1 Received many messages
 INFO | consumer-1 Received many messages
 INFO | consumer-1 Received many messages
 INFO | consumer-1 Received many messages
 INFO | consumer-1 Received many messages
 INFO | consumer-1 Received many messages
 INFO | consumer-1 Consumed: 1000 messages
 INFO | consumer-1 Consumer thread finished
```

このようにたくさんメッセージが受信された後、1000件に達した時点でConsumerのスレッドが一度閉じました。
何度か1000件単位で送ってみましたが、1000件送信されたのち、余剰の3件が受信待ち状態になる結果になりました。

![スクリーンショット 2022-02-25 18.59.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1676583/01b85e5f-c6a7-21c9-64e9-f4d4c674cf87.png)

## Topicsも触ってみる
Topicsの方を動かすには、まずSubscriberを設定してみます。Subscribersのタブから以下の設定で受信者を追加します。Client IDというのが必要になるようです。
先ほどから作成してあった「TestQueue」をそのまま指定してみます。

![スクリーンショット 2022-02-25 19.00.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1676583/ccb1b65e-2eaa-5cf1-fd27-0fc90f661614.png)

色々試したので既にいくつか項目が存在していますが、Topicのタブを開いて「TestQueue」というTopicが追加されています。「Test」のSend Toからメッセージを送ってみます。

![スクリーンショット 2022-02-25 19.01.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1676583/5b62f7f8-5fab-a77b-7718-a9e2b543e9ce.png)

以下の設定で送信します。Correction IDのところには先ほど設定したClient IDを記入しました。

![スクリーンショット 2022-02-25 19.01.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1676583/92007109-7d16-fba6-4a2d-aeaf9b6aab3c.png)

するとConsumer側のターミナルに以下が表示され、無事受信されたことが確認できました。

```
 INFO | consumer-1 Received これはトピックのテストメッセージです
```

## 終わりに
今回はAmazon MQやActive MQについて概要をまとめ、試しにQueuesとTopicsでメッセージを送信してみました。Queuesの方ではうまく送信できたようですが、TopicsをみるとJMS Selectorの設定値を入力する欄が存在するなど、未だはっきりしない部分が残っています。適切な設定の理解については今後の課題になってくるなと感じています。


### 参考にした記事：
**Amazon MQ**
[Amazon MQ とは(AWS公式)](https://docs.aws.amazon.com/ja_jp/amazon-mq/latest/developer-guide/welcome.html)
[Amazon MQ とは？](https://qiita.com/miyuki_samitani/items/5c59bf4270181699395f)
[Amazon MQってなんだろ？](https://zenn.dev/mn87/articles/4b9722ae46397b)
[【速報】新サービスAmazon MQを早速使ってみた！ #reinvent](https://dev.classmethod.jp/articles/re-invent-2017-amazon-mq-first-impression/)
[[AWS Black Belt Online Seminar]Amazon MQ](https://d1.awsstatic.com/webinars/jp/pdf/services/20210317_AWS-BlackBelt_AmazonMQ%20210317a.pdf)
[【徹底解説】AWSのメッセージングサービス](https://www.sunnycloud.jp/column/20210525-01/)
[Amazon MQサービスについて](https://www.acrovision.jp/service/aws/?p=1040)
[AmazonMQとは?メッセージブローカーサービス](https://www.skyarch.net/column/amazonmq/)

**Active MQ**
[Flexible & Powerful Open Source Multi-Protocol Messaging(公式)](https://activemq.apache.org/)
[ActiveMQ とは？](https://openstandia.jp/oss_info/activemq/)
[ActiveMQのインストールと使い方とQueueとTopicの違いについて](https://www.task-notes.com/entry/20150705/1436065200)
[Active MQをUbuntuにインストールして動かしてみる](https://qiita.com/yuna611d/items/861c9cf3f4264a9b0e78)
[1.JMSの基礎](https://www.techscore.com/tech/Java/JavaEE/JMS/1/)
[ActiveMQメッセージ管理(仕組み)](https://jpdebug.com/p/752102)

**その他**
[MQTTとは](https://kfep.jp/solution/iot-mqtt/mqtt)
[MQTT入門ガイド](https://www.advanet.co.jp/2020/10/14/mqtt-introduction/)
[Apache License 2.0とは？ライセンス内容をやさしく解説](https://reikawatanabe.com/whats-apache-license-v2/)