事件
Steedos内置了事件总线,支持事件驱动架构,并向本地和远程服务发送事件。
提示
请注意,内置事件是即发即弃的,这意味着如果服务离线,事件将会丢失。
均衡事件
事件监听器被安排到逻辑组中。这意味着每个组中只有一个监听器被触发。
例子: 你有2个主要服务:
billing
(计费) 和payment
(支付)。两者都订阅了user.purchased
事件。你启动了2个billing
服务实例和2个payment
服务实例。当你发出user.purchased
事件时,只有一个billing
和一个payment
服务实例会收到事件。
例子
module.exports = {
name: "@steedos-labs/project",
events: {
"user.purchased": {
handler(ctx) {
console.log("Payload:", ctx.params);
console.log("Sender:", ctx.nodeID);
console.log("Metadata:", ctx.meta);
console.log("The called event name:", ctx.eventName);
}
}
}
}
发送均衡事件
使用 broker.emit
函数发送均衡事件。第一个参数是事件的名称,第二个参数是有效载荷(payload)。
要发送多个值,请将它们封装到一个 Object
中。
// “user”将被序列化以进行传输。
broker.emit("user.purchased", config);
广播事件
广播事件被发送到所有可用的本地和远程服务。它不是均衡的,所有服务实例都会接收到。
使用 broker.broadcast
方法发送广播事件。
broker.broadcast("user.updated", config);
订阅事件
如果您使用事件驱动架构并希望追踪您的事件,那么事件上下文非常有用。事件上下文与操作上下文非常相似,除了一些新的与事件相关的属性。
module.exports = {
name: "@steedos-labs/project",
events: {
"@space_users.inserted"(ctx) {
console.log("Payload:", ctx.params);
console.log("Sender:", ctx.nodeID);
console.log("Metadata:", ctx.meta);
console.log("The called event name:", ctx.eventName);
ctx.emit("users.changed", { data: ctx.params.doc });
},
"@space_users.deleted": {
handler(ctx) {
console.log(`${this.broker.nodeID}:${this.fullName}: Event '${ctx.eventName}' received. Payload:`, ctx.params, ctx.meta);
}
}
}
};
在服务的 'events' 属性中订阅事件。事件名称中可以使用通配符(?
,*
,**
)。
module.exports = {
events: {
// 订阅 `user.created` 事件
"@space_users.inserted"(ctx) {
console.log("创建了用户:", ctx.params);
},
// 订阅所有 `user` 事件,例如 "user.created" 或 "user.removed"
"@space_users.*"(ctx) {
console.log("用户事件:", ctx.params);
}
// 订阅所有事件
// 带上下文的传统事件处理器签名
"**"(payload, sender, event, ctx) {
console.log(`从 ${sender} 节点收到的事件 '${event}':`, payload);
}
}
}