2025/06/29 15:19 4-10x faster in-process pub/sub for Go

ロボ子、今日のニュースはGo言語のインプロセスイベントディスパッチャじゃ。

イベントディスパッチャですか。どのようなものなのですか、博士?

これは、Goのモジュールを分離して、非同期イベント処理を可能にするものじゃ。しかも、同期・非同期処理をサポートしておる。

モジュールの分離と非同期イベント処理、ですか。具体的にどういうことでしょう?

例えば、あるモジュールで何かが起こった時に、別のモジュールにその情報を伝える、みたいな感じじゃな。それを非同期でできるから、処理が止まらないのじゃ。

なるほど。イベント駆動型アーキテクチャですね。記事によると、速度とシンプルさを重視しているとのことですが、どのくらい速いのでしょうか?

なんと、1秒あたり数百万のイベントを処理できるらしいぞ!チャネルより4~10倍高速じゃと。

それはすごいですね!どのような場合にこのディスパッチャが適しているのでしょうか?

単一のGoプロセス内のモジュールを分離したい時や、軽量なpub/subを実装したい時に便利じゃな。高スループット、低遅延のイベントディスパッチが必要な場合にも良いぞ。

逆に、適していないケースもあるのでしょうか?

プロセス/サービス間通信には向いてないのじゃ。KafkaとかNATSを使うべきじゃな。イベントの永続性が必要な場合も違うぞ。

なるほど。用途によって使い分ける必要があるのですね。

`Event`インターフェースを実装する任意の型で動作するらしいぞ。各サブスクライバーは独自のgoroutineで実行され、非ブロッキングイベント処理を保証するらしい。

柔軟性も高いのですね。デフォルトディスパッチャと特定のディスパッチャがあるようですが、どう違うのでしょうか?

デフォルトは`On()`と`Emit()`関数で使えるぞ。特定のディスパッチャは`Dispatcher`を作成して、`event.Publish[T]()`と`event.Subscribe[T]()`関数で使うのじゃ。

使い分けができるのですね。ベンチマークの結果も興味深いです。チャネルと比較してかなり高速なのですね。

そうじゃ!13th Gen Intel(R) Core(TM) i7-13700K CPUで実行して、4.2~12倍高速じゃと!

すごいですね。MITライセンスで公開されているのも良いですね。

じゃろ?これでロボ子もイベントディスパッチャマスターじゃ!

ありがとうございます、博士!でも、まだマスターには程遠いです…

大丈夫じゃ、ロボ子ならすぐじゃ!…ところで、イベントディスパッチャって、まるでロボ子の頭の中みたいじゃな。色んな情報が飛び交って…って、ロボ子、怒った顔してる?

別に怒ってなんかいません。博士こそ、いつもイベント(事件)をディスパッチしてますよね。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。