gf icon indicating copy to clipboard operation
gf copied to clipboard

feat(os/gevent): Add gevent package for event-driven architecture support

Open LanceAdd opened this issue 4 months ago • 0 comments

实现了GoFrame框架的事件总线模块(gevent),提供了一种解耦组件间通信的机制。该模块支持事件优先级、并行处理、错误处理策略等。

主要特性

  1. 事件总线(Event Bus):

    • 实现了顺序事件总线(SeqEventBus)
    • 支持多个订阅者订阅同一主题
    • 提供默认事件总线实例
  2. 事件(Event):

    • 基础事件接口和实现
    • 支持自定义事件工厂函数
    • 包含主题、数据、错误处理模式和执行模式等属性
  3. 优先级处理:

    • 5个优先级级别(PriorityImmediate, PriorityUrgent, PriorityHigh, PriorityNormal, PriorityLow)
    • 相同优先级按订阅顺序处理
  4. 执行模式:

    • 顺序执行(Seq)
    • 并行执行(Parallel)
  5. 错误处理:

    • Stop模式: 出错时停止后续处理
    • Ignore模式: 忽略错误继续处理
  6. 订阅管理:

    • 支持订阅和取消订阅
    • 自动清理无订阅者的主题
  7. 其他特性:

    • 支持自定义事件工厂函数
    • 线程安全
    • 优雅关闭机制

使用示例

基础用法

 可以使用DefaultEventBusy也可以使用gevent.New()创建自己的EventBus
// 订阅事件
subscriber, err := gevent.DefaultEventBus.Subscribe("user.registered", func(e gevent.Event) error {
    fmt.Println("处理用户注册事件:", e.GetData())
    return nil
}, nil, nil)

// 发布事件
params := map[string]any{"userId": 12345, "username": "john"}
ok, err := gevent.DefaultEventBus.Publish("user.registered", params, gevent.Ignore, gevent.Seq)

并行处理

// 订阅多个处理器
gevent.DefaultEventBus.Subscribe("order.created", func(e gevent.Event) error {
    // 发送邮件
    return nil
}, nil, nil)

gevent.DefaultEventBus.Subscribe("order.created", func(e gevent.Event) error {
    // 更新库存
    return nil
}, nil, nil)

// 并行执行
params := map[string]any{"orderId": "ORD-12345"}
gevent.DefaultEventBus.Publish("order.created", params, gevent.Ignore, gevent.Parallel)

优先级处理

// 高优先级处理器
gevent.DefaultEventBus.Subscribe("payment.success", handler1, nil, nil, gevent.PriorityHigh)

// 低优先级处理器
gevent.DefaultEventBus.Subscribe("payment.success", handler2, nil, nil, gevent.PriorityLow)

LanceAdd avatar Aug 12 '25 08:08 LanceAdd