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


メッセヌゞキュヌの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日あたり数兆件のメッセヌゞを凊理しおいるよ。芏暡が桁違いだよね。