cellbang / malagu

Malagu is a Serverless First, componentized, platform-independent progressive application framework based on TypeScript. Malagu 是基于 TypeScript 的 Serverless First、组件化、平台无关的渐进式应用框架。
https://malagu.naily.cc
MIT License
694 stars 60 forks source link

Eventbus需求 #158

Open zhangfisher opened 1 year ago

zhangfisher commented 1 year ago

malagu应该内置一个Eventbus作为基础能力,用来为模块与模块之间的提供一种高效、易用的通讯机制,帮助模块与模块之间实现松耦合。

@malgu@eventbus应该具备以下能力:

主要特性应该包括:

在总线内部,每一个模块均需要具备一个地址标识,可以是模块id之类,只需要全局唯一即可。 模块地址应作为模块通讯的

interface Message{
   id:number;                    // 可以是自增值,由框架产生
   from:string;                  // 消息发送者
   to?:string;                     // 消息接收者,仅在点对点时有用
  sid?:number
   meta:{              
        forwards:number
        [key:string]: string | number | booean
    }
    payload:any             // 消息负载
}

meta供应用层扩展提供一些额外的数据,特别有用。比如MQTT模块可以在meta中提供一些topic数据;TCP模块可以提供ip地址之类的。

forwards用来记录消息在总线内部流转的次数,当经总线转发一次就+1,总线可以设定一个最大forwards值,用来用来防止消息回路时使用。

sid用来供模块之间进行会话时标识消息使用,当模块与模块之间需要进行多次通讯时有用

总线发布的消息主题应支持层次结构,例a/b/c之类的,最好支持通配符。

前端也可以向后端订阅?

muxiangqiu commented 1 year ago

这里有个 nestjs 的实现,我们可以参考:https://github.com/nestjs/cqrs/blob/master/src/event-bus.ts