日本語版
最新ニュース
科学&テクノロジー

Kelindar/イベント:GOアプリケーション用のシンプルな内部イベントバス

高速で処理中のイベントディスパッチャー このパッケージは高性能を提供します、 インプロセスイベントディスパッチャー Goには、モジュールを切り離し、非同期イベント処理を可能にするのに最適です。同期処理と非同期処理の両方をサポートし、速度とシンプルさに焦点を合わせます。 高性能: 約1秒あたりの数百万のイベントを処理します 4倍から10倍高速 チャネルより。 ジェネリック: 実装する任意のタイプで動作します Event インタフェース。 非同期: 各サブスクライバーは独自のゴルウチンで実行され、非ブロッキングイベント処理が確保されます。 使用する場合: single単一のGOプロセス内のモジュール分離モジュール。 lightWeight Pub/Subまたはイベント駆動型パターンの実装。 high-スループット、低遅延のイベントの派遣が必要です。 simpleシンプルで依存関係のないソリューションを好む。 対象ではありません: process間/サービス通信(Kafka、Natsなどを使用)。 deventイベントの持続性、耐久性、または高度なルーティング/フィルタリング。 cross言語/プラットフォームシナリオ。 ❌イベントリプレイ、デッドレッターキュー、または重複排除。 heavyヘビーサブスクライブ/サブスクライブチャーンまたは大規模な動的サブスクライバーカウント。 ジェネリックインプロセスパブ/サブ このリポジトリにはaが含まれます シンプルで処理中のイベントディスパッチャー 内部モジュールを切り離すために使用されます。イベントを定義し、公開および購読する一般的な方法を提供します。 // Various event types const EventA = 0x01…

Kelindar/イベント:GOアプリケーション用のシンプルな内部イベントバス

1751219119
2025-06-29 15:19:00



GOバージョン
pkggodev
ライセンス
カバレッジ

高速で処理中のイベントディスパッチャー

このパッケージは高性能を提供します、 インプロセスイベントディスパッチャー Goには、モジュールを切り離し、非同期イベント処理を可能にするのに最適です。同期処理と非同期処理の両方をサポートし、速度とシンプルさに焦点を合わせます。

  • 高性能: 約1秒あたりの数百万のイベントを処理します 4倍から10倍高速 チャネルより。
  • ジェネリック: 実装する任意のタイプで動作します Event インタフェース。
  • 非同期: 各サブスクライバーは独自のゴルウチンで実行され、非ブロッキングイベント処理が確保されます。

使用する場合:

  • single単一のGOプロセス内のモジュール分離モジュール。
  • lightWeight Pub/Subまたはイベント駆動型パターンの実装。
  • high-スループット、低遅延のイベントの派遣が必要です。
  • simpleシンプルで依存関係のないソリューションを好む。

対象ではありません:

  • process間/サービス通信(Kafka、Natsなどを使用)。
  • deventイベントの持続性、耐久性、または高度なルーティング/フィルタリング。
  • cross言語/プラットフォームシナリオ。
  • ❌イベントリプレイ、デッドレッターキュー、または重複排除。
  • heavyヘビーサブスクライブ/サブスクライブチャーンまたは大規模な動的サブスクライバーカウント。

ジェネリックインプロセスパブ/サブ

このリポジトリにはaが含まれます シンプルで処理中のイベントディスパッチャー 内部モジュールを切り離すために使用されます。イベントを定義し、公開および購読する一般的な方法を提供します。

// Various event types
const EventA = 0x01

// Event type for testing purposes
type myEvent struct{
    Data string
}

// Type returns the event type
func (ev myEvent) Type() uint32 {
	return EventA
}

便利なため、このパッケージは、使用できるデフォルトのグローバルディスパッチャーを提供します On() そして Emit() パッケージレベルの関数。

// Subcribe to event A, and automatically unsubscribe at the end
defer event.On(func(e Event) {
    println("(consumer)", e.Data)
})()

// Publish few events
event.Emit(newEventA("event 1"))
event.Emit(newEventA("event 2"))
event.Emit(newEventA("event 3"))

特定のディスパッチャーを使用します

イベントを公開するときは、aを作成できます Dispatcher 次に、一般的なターゲットとして使用されます event.Publish[T]() そして event.Subscribe[T]() それぞれさまざまなイベントタイプを公開および購読する機能。

bus := event.NewDispatcher()

// Subcribe to event A, and automatically unsubscribe at the end
defer event.Subscribe(bus, func(e Event) {
    println("(consumer 1)", e.Data)
})()

// Subcribe to event A, and automatically unsubscribe at the end
defer event.Subscribe(bus, func(e Event) {
    println("(consumer 2)", e.Data)
})()

// Publish few events
event.Publish(bus, newEventA("event 1"))
event.Publish(bus, newEventA("event 2"))
event.Publish(bus, newEventA("event 3"))

これらの線に沿って何かを出力する必要があります。両方のサブスクライバーがメッセージを非控えめに処理していることを考えると、順序は保証されません。

(consumer 2) event 1
(consumer 2) event 2
(consumer 2) event 3
(consumer 1) event 1
(consumer 1) event 2
(consumer 1) event 3

ベンチマークは、第13世代のインテル(R)コア(TM)I7-13700K CPUで実行され、結果はマシンと環境によって異なる場合があります。これは、さまざまな数のイベントタイプと購読者で、イベントディスパッチャーの公開スループットを示しています。

name                 time/op      ops/s        allocs/op    vs channels
-------------------- ------------ ------------ ------------ ------------------
1x1                  38.7 ns      25.9M        0             ✅ +4.2x
1x10                 13.0 ns      77.1M        0             ✅ +12x
1x100                12.2 ns      81.7M        0             ✅ +7.7x
10x1                 26.5 ns      37.7M        0             ✅ +6.3x
10x10                12.2 ns      82.3M        0             ✅ +7.8x
10x100               12.2 ns      82.0M        0             ✅ +6.6x

このプロジェクトはMITライセンスの下でライセンスされています – を参照してください ライセンス 詳細については、ファイル。

#KelindarイベントGOアプリケーション用のシンプルな内部イベントバス

執筆者について: nipponese

Nipponese News編集部は、国内外のニュースを日本語で分かりやすくお届けします。