package eventmgr import ( "admin/lib/xlog" "encoding/json" "runtime" ) type Msg struct { Event string Payload []byte } type subscriber struct { name string topic string handler func(*Msg) } type Mgr struct { subscribers []*subscriber broker chan *Msg } func NewMgr() *Mgr { mgr := &Mgr{ subscribers: make([]*subscriber, 0), broker: make(chan *Msg, 1024), } mgr.start() return mgr } func (m *Mgr) start() { for i := 0; i < runtime.NumCPU(); i++ { go func() { for { select { case msg := <-m.broker: for _, sub := range m.subscribers { if sub.topic == msg.Event { sub.handler(msg) } } } } }() } } func (m *Mgr) Subscribe(name string, topic string, handler func(*Msg)) { m.subscribers = append(m.subscribers, &subscriber{name: name, topic: topic, handler: handler}) } func (m *Mgr) Publish(event string, payload any) { payloadBin, err := json.Marshal(payload) if err != nil { panic(err) } msg := &Msg{Event: event, Payload: payloadBin} select { case m.broker <- msg: default: xlog.Errorf("publish event:%v broker is full", event) } }