Massaging Queueとはの話

今回はMessaging Queue(MQ)を簡単にまとめてみたいと思います。

非同期とか、超疎結合とかいろいろありますが… 別にします

非同期システムとは… : 非同期システムとはの話

ポイントとしては、投げる・受けるが完全に独立した処理です。
投げられたメッセージは必要なプロセスが処理する。
と言ったふうです

Massaging Queueとは

Messaging Queue(MQ)とはを送信側と受取側が存在するメッセージアーキテクチャです。

送信側は行いたい処理をMQサーバに送信します。
受信側はQueue Channelを監視(購読)しておりQueueが入ると決められた処理を行います。
送信側はメッセージの処理を管理せず終了させる非同期型のプロセスが実現できます。
メッセージ自体はテキストとプロパティの単純な内容のメッセージです。

メッセージには本文の他に以下の様な発行情報を設定することができます。
 「購読チャネル名」
 「購読種別」
 「必ず処理しろ(ACK)」
 「優先度」
など

受信側ではその発行情報を元に自信の処理対象のメッセージを購読し処理します。
MQサーバでは発行情報を元にさまざまなQueueに割り振りなども行います

利点

完全な疎結合が可能となる

一番のポイントはMQはサーバにて稼働していることです。
つまりは、クライアントとクライアント間の通信するのではなくサーバが割り振っていることにより
送信側のプログラムと受信側のプログラムを完全に疎結合にできます。
プログラムには制限がなくなり、言語が一致しなくとも、実行環境が別サーバであっても問題なく動作します。

プログラムが単純となる

送信側は依頼書を書いて、ポストに投函で終了なので軽量になります。
MQサーバはポスト投函されると必要なポストに移し替えます。
受信側はポストを監視しており、投函されるとその依頼内容を処理します。

つまり、以下の様に送信側、受信側との関係が完全に分離できます
・送信側はポスト投函したらあとは知らない。提供サービスには影響しない
・受信側は前の処理は知らないがメッセージの処理に専念できる

メッセージの送信、受信共に実装プログラムには依存しないために、
単純にメッセージを投げる(受ける)だけのプログラムを書くだけで動作検証が可能になります

1 vs 多数の動作が可能になる

送信元のプログラムから多数のプロセスを並行で動作させる場合、
通常のプログラムではそれぞれを手動で呼び出さなければなりません。
しかし、MQを利用した場合には送信元のプログラムでは1つのメッセージを送信すれば終了します。
処理したいプログラムの処理はそれぞれの購読方法で行うことが可能になります。
また、購読方法は単純に指定することが可能になりますので開発はプログラムに専念できます。

同時アクセスの処理が楽になる

Webサイトで同時にアクセスされてもメッセージはシリアル順になるので一番早い処理ってのが楽になります

Messageの種別の話

Messageの種別は様々ありますが、今回はQueueとPublish/Subscribe(pub/sub)を紹介します

Queueの話

QueueはシンプルなMessageです。

メッセージを入れると、格納した順にメッセージが取れます。

はい、シンプルですね。ただそれだけです。

もしも、購読プロセスが死んでもMQサーバが生きている場合にはQueueをどんどん積んでくれます。
プロセス復帰した場合は残っているQueueを処理していきますので取りこぼしは発生しません
優先順位(QoS)が指定可能ですので必ずしもLILOが提供されるわけではありません。

Queueでは1つのプロセスが取り出すことを想定しています。
もし、複数のプロセスにて処理を行う場合はそれぞれの購読に対して
異なるメッセージが処理されていきQueueが減っていきます。

Publish/Subscribe(pub/sub)の話

Publish/Subscribeは先のQueueに購読情報を指定したイメージです
それぞれに購読情報を設定することにより必要な購読プロセスが処理します。

解説は…

Publish-Subscribe Channelは、次のような仕組みになっています。1 つの入力チャネルが、各サブスクライバごとに複数の出力チャネルに分割されます。イベントがチャネルにパブリッシュされると、Publish-Subscribe Channel はメッセージのコピーを各出力チャネルに送出します。各出力チャネルは1つのサブスクライバを持ち、そのサブスクライバは1度だけメッセージを消費することを許可されます。このようにして、各サブスクライバーはメッセージを一度だけ取得し、消費されたコピーは彼らのチャネルから消えます。

らしいですw (https://www.enterpriseintegrationpatterns.com/patterns/messaging/PublishSubscribeChannel.html)

今回はイメージです、実際のpub/subではもう少し細かいです

購読プロセスは同じQueueを監視することが可能になっております。

ついでに、topicを指定すれば複数のQueueに投げるなどもできます

RabbitMQ(MQ)サーバ構築

MQサーバはRabbitMQを利用しました。 : QNAP TS-351上にRabbitMQを立ち上げる話

実装イメージ

サーバの分断

サービスサーバ(webサーバ)- MQサーバ – 購読処理サーバと独立した処理が可能になります。
購読プロセスは自身で監視しても良いですが、他の専用(余裕)なサーバで実行してもOKです。

すぐに終えたい場合は、購読プロセスを複数準備しておけば並列処理も可能になります

実装例

昔作ったシステムでは外部サービスからさまざまなメッセージをWDSLにて送信されます。
それを提供するサイトの構築しました。
ポイントは利用者がアクセスするWebサイトはスタティックHTMLファイルを参照しているため超軽量なサイトになることがです。DBなどに入れるなどをしていないためアクセスなどが発生させたりしません

参考

https://www.rabbitmq.com/