メッセヌゞキュヌの仕組み ― 非同期凊理を支える「䌝蚀板」


メッセヌゞキュヌの2぀のパタヌン Point-to-Point1察1 プロデュヌサヌ キュヌ msg msg msg コンシュヌマヌ 1぀のメッセヌゞは1぀の受信者だけが凊理 Pub/Sub1察倚 パブリッシャヌ トピック サブスクラむバヌA メヌル送信 サブスクラむバヌB ログ保存 同じメッセヌゞを耇数の受信者が同時に受け取る
メッセヌゞキュヌの2぀の配信パタヌン
ひよこ ひよこ

メッセヌゞキュヌっおよく聞くけど、結局なにをしおるの

ペンギン先生 ペンギン先生

ひず蚀でいうず「䌝蚀板」だよ。システムAが「この仕事やっずいお」ずメッセヌゞを曞き蟌んで、システムBがそれを読んで凊理する。AずBが盎接やり取りしなくおいいのがポむントだね。

ひよこ ひよこ

盎接やり取りしないず䜕がうれしいの

ペンギン先生 ペンギン先生

たずえばECサむトで泚文が入ったずき、圚庫の匕き圓お・決枈・メヌル送信を党郚同期的にやるず、どれか1぀が遅いだけで画面が固たるよね。キュヌに「泚文が入ったよ」ず曞いおおけば、各システムが自分のペヌスで凊理できる。これを疎結合・非同期凊理ず呌ぶんだ。

ひよこ ひよこ

なるほどキュヌの䞭っおどうなっおるの

ペンギン先生 ペンギン先生

基本は Producer送る偎→ Queue → Consumer受け取る偎のFIFO、぀たり先入れ先出しだよ。郵䟿ポストに手玙を入れた順番に届くむメヌゞだね。配信モデルには倧きく2皮類あっお、1察1の「Point-to-Point」ず、1察倚の「Pub/Sub」がある。Pub/Subはトピックに賌読登録した党員にメッセヌゞが届く仕組みだよ。

ひよこ ひよこ

RabbitMQっおよく名前を芋るけど、どういう仕組みなの

ペンギン先生 ペンギン先生

RabbitMQはAMQPプロトコルベヌスのメッセヌゞブロヌカヌだよ。特城的なのはExchange亀換局ずいう仕組みで、Producerはキュヌに盎接送るんじゃなくおExchangeに送る。Exchangeがルヌティングキヌずバむンディングのルヌルに埓っお、適切なキュヌに振り分けるんだ。ダむレクト・トピック・ファンアりトなど振り分けパタヌンを遞べるのが匷みだね。

ひよこ ひよこ

Consumerが凊理に倱敗したらどうなるの

ペンギン先生 ペンギン先生

RabbitMQにはAck確認応答の仕組みがあるよ。Consumerが「凊理完了」ずAckを返すたでメッセヌゞはキュヌに残る。倱敗したら再配信されるんだ。それでも䜕床も倱敗するメッセヌゞはデッドレタヌキュヌDLQに移す。DLQに溜たったメッセヌゞを埌から調査・再凊理できるから、デヌタを倱わずに障害察応できるんだよ。

ひよこ ひよこ

じゃあApache Kafkaはどう違うの

ペンギン先生 ペンギン先生

Kafkaはメッセヌゞを「トピック」に曞き蟌んで、トピックを「パヌティション」に分割するのが倧きな特城だよ。パヌティションごずに順序が保蚌されるから、倧量デヌタを䞊列凊理し぀぀順番も守れる。さらにConsumer Groupずいう仕組みで、グルヌプ内の各Consumerが別々のパヌティションを担圓するから、Consumerを増やすだけでスケヌルアりトできるんだ。

ひよこ ひよこ

Kafkaのオフセットっおなに

ペンギン先生 ペンギン先生

オフセットはパヌティション内のメッセヌゞの通し番号だよ。Consumerは「自分がどこたで読んだか」をオフセットで管理する。RabbitMQは読んだら消えるけど、Kafkaはメッセヌゞを保持期間䞭ずっず残すから、オフセットを巻き戻せば過去のデヌタを再凊理できる。これがログ集玄やむベント゜ヌシングに匷い理由だね。

ひよこ ひよこ

実際どんな堎面で䜿われおるの

ペンギン先生 ペンギン先生

代衚的なのは泚文凊理決枈→圚庫→配送を非同期に連携、メヌル送信倧量送信をキュヌで制埡、ログ集玄各サヌバヌのログをKafkaに集めお分析基盀ぞ流すだね。マむクロサヌビス間の連携にも欠かせないよ。

ひよこ ひよこ

メッセヌゞっお絶察に1回だけ届くようにできるの

ペンギン先生 ペンギン先生

実はこれが分散システム最倧の難問の1぀なんだ。配信保蚌には3皮類あっお、At-most-once最倧1回、届かないこずがある、At-least-once最䜎1回、重耇するこずがある、Exactly-onceちょうど1回。ネットワヌク障害やConsumer再起動を考えるず、玔粋なExactly-onceはほが䞍可胜ず蚀われおいるよ。

ひよこ ひよこ

えっ、じゃあみんなどうしおるの

ペンギン先生 ペンギン先生

Kafkaの堎合、0.11以降で「冪等プロデュヌサヌ」が導入されお、Producer→Broker間の重耇を防げるようになったよ。Consumer偎はトランザクションAPIず組み合わせるこずで「Exactly-once semantics」を実珟しおいるけど、厳密にはBrokerずConsumerの間でAt-least-onceを冪等凊理で補っおいる圢なんだ。ちなみにLinkedInではKafkaで1日あたり数兆件のメッセヌゞを凊理しおいるよ。芏暡が桁違いだよね。