記事を書くに至った経緯
若手にMQを使って非同期処理をするって話をしたら、そもそもMQって何?非同期だと何が嬉しいの?という反応があったので、自分なりにMQとはなんぞや非同期処理だとなにが嬉しいのかってところをまとめてみようという感じです!
注意
MQと非同期処理のざっくりしたイメージを掴むための内容なので、細かいところまでは言及しません。
そのため既にMQや非同期について理解している人にはあまり参考になる内容ではありません。
ただし、SEである以上、非エンジニアに説明する機会もあると思うのでその点では参考になるかもしれません。
MQとは
メッセージキュー(英: Message queue)は、プロセス間通信や同一プロセス内のスレッド間通信に使われるソフトウェアコンポーネントである。制御やデータを伝達するメッセージのキューである。(wikipediaより)
はい、これではなんのことかさっぱりですよね。(笑)
キューとは先入れ先出し型のリストのことですね。つまり一方通行で出し入れできる箱です。
メッセージキューとはメッセージを一方通行で出し入れできる箱のことです。
現実のもので例えると郵便ポストのようなものです(先入れ後出しになる可能性がある点については目を瞑ってください)
MQを使って非同期処理をするとは
WEBアプリケーション(WEBとは限りませんが)がMQにメッセージを詰め、リスナーがMQからメッセージを受け取ることでアプリケーションとリスナーの処理を別プロセスで行うことができることを非同期処理と言います。
と言われてもよくわからないかなと思います(急にリスナーとかいう言葉が出てきたし)
リスナーとはMQからメッセージを受け取って仕事をする人のことです。
これも現実のものに例えてみます。
WEBアプリケーションが手紙を出したい人、MQが郵便ポスト、リスナーが郵便屋さんとしてみます。
手紙を出したい人が郵便ポストに手紙を入れてあげて、郵便屋さんが手紙があれば宛先に届けてあげます。
このように手紙を宛先に送るという動作の間に郵便ポストを挟むことによって、手紙をポストに投函する、手紙を宛先に届けると行動(プロセス)を分けることができるということです。
非同期だとなにが嬉しいの
手紙を誰かに出したいという時、近くにいれば自分で直接届ければOKですが、これがもし、とても遠くにいるとかいう場合、私たちが直接渡しに行っては時間もお金も掛かりますよね。
手紙を出して家に帰ってくるまでとても時間が掛かってしまいます。
これが非同期だと手紙を出したい人は郵便ポストに手紙を入れるだけで済みます。
手紙を出すために掛かる時間とお金が節約できますよね。
これがWEBアプリケーションの場合だと、リクエストを飛ばしてレスポンスが返ってくるまでの時間が手紙を出すための時間に相当します。
非同期でない場合、リクエストを投げてからレスポンスが返ってくるまでにとても時間が掛かってしまいます。
WEBアプリケーションにとってレスポンスが遅いということは致命的なことです。
またプロセスが分かれることにより、障害発生時の原因の切り分けにもなります。
たとえばリスナーになにか問題があって、処理が進まないという事態が発生したとします。その場合も、リスナーを停止するだけでよいので、WEBアプリケーション側に障害を感じさせることなく障害対応ができます。
障害解消後はMQに溜まったメッセージをまた順番に処理していくだけなので、何事もなかったかのようにできます。