Momento Topics を調べた

Momento Advent Calendar 2023の18日目の記事です。

さて、皆さんは pub/sub って聞いたことがありますか。pub/sub とは Enterprise Integration Patterns の Messaging Patterns の1つとして挙げられていて、Publish-Subscribe Channel というのが正式な名前のようです。

複数のパブリッシャー (Publisher) が Topic を指定してメッセージやイベントを書き込みます。複数のサブスクライバー (Subscriber) は関心のある Topic を購読していて、書き込まれたメッセージやイベントを読み取り処理します。pub/sub ではパブリッシュする側とサブスクライブする側のどちらも複数にすることが可能です。この点が1対1を前提とする Point-to-Point Channel 等との大きな違いになります。

pub/sub に使用できる OSSやサービスはいくつかありますが、それぞれ異なる特徴もあります。この記事では Momento 社以外の OSS やサービスの具体名は使わずに説明します。

メッセージ配信の信頼性

メッセージ配信は通常リモート間をインターネット等のネットワークを使って配信します。これには有名な「二将軍の問題 (Two Generals'Problem)」があります。

At-most-once

At-most-once (最大1回) はパブリッシャーが書き込んだメッセージがサブスクライバーで最大1回読み取れることを保証します。ネットワークに問題がありサブスクライバーで読み取れない可能性もあります。つまり、配信は0回または1回を意味し「配信を保証しない」ということもできるかもしれません1

At-least-once

At-least-once (最低1回) はサブスクライバーは最低でも1回は読み取れることを保証します。ただし場合によっては同じメッセージが複数回配信される可能性もあります。多くのメッセージ配信メカニズムでこの at-least-once が保証されているため、同じメッセージを受信しても問題が発生しないように冪等に設計しましょうと言われるのはこういったところにあります。

Exactly-once

Exactly-once (確実に1回) はサーブスクライバーは確実に1回読み取れることを保証します。

メッセージの永続性

パブリッシャーが書き込んだメッセージやイベントを一定期間保持する OSS やサービスがあります。これらを使用すると、任意の時点でサブスクライブを開始しても、過去の保存されている時点からのメッセージやイベントから読み取ることが可能です。保存される部分をイベントストアと呼ぶ場合もあります。最後の1つのメッセージやイベントのみを保存するものもあります。さらに、パブリッシュされると即座にサブスクライバーに送るだけの「fire-and-forget messaging model」を採用しているものもあります。

Momento Topics はどう機能するか

Momento 社の pub/sub である Momento Topics には次のように書かれています。

Momento Topics operates on a fire-and-forget messaging model, which means that once an item is published, it is immediately sent to all current subscribers of the topic and then discarded. There is no built-in item persistence or delivery guarantees. Consequently, Momento Topics is most suitable for applications where low latency is crucial and occasional item loss can be tolerated.

つまり、Momento Topics 自体ではメッセージの永続化は行わず、配信保証も組み込まれていないため、もしそれが必要であれば、パブリッシャーやサブスクライバーで永続化や配信保証メカニズムを実装する必要があるということになります。これはネガティブな意味ではなく、別途実装が可能な要素を除いて最大限のパフォーマンスを提供していることを意味しています。

紹介したドキュメントには、Momento Cache を使った解決案が記述されていて、必要な永続化、配信保証を性能要件とをみながら実装が可能です。

個人的には IoT デバイスでは MQTT を使って pub/sub を実現することが多いですが、次はぜひ Momento Topics を使って試したいと思います。


  1. 例えば Akka のドキュメント「Message Delivery Reliability」に "at-most-once delivery, i.e. no guaranteed delivery" と書かれている。