1751219119
2025-06-29 15:19:00
このパッケージは高性能を提供します、 インプロセスイベントディスパッチャー 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アプリケーション用のシンプルな内部イベントバス