eggjs / egg

🥚 Born to build better enterprise frameworks and apps with Node.js & Koa
https://eggjs.org
MIT License
18.9k stars 1.82k forks source link

[Question] 关于用事件机制解偶的问题 #3043

Closed iwege closed 6 years ago

iwege commented 6 years ago

之前用的是php的laravel,由于php的同步机制,使得Laravel的事件机制也是同步的。但是nodejs的数据库处理和http请求都是异步的,使用这种方式处理的话非常繁琐。

简单的搜索了一下nodejs 的hook-emitter可以做类似的事情。但是我看了eggjs的大部分示例,都没有涉及到这块的内容,想问问eggjs的最佳实践是不是并非如此?

假设需求场景如下:

单体应用,模块之间想通过事件来进行解偶,不考虑异常的情况:

  1. 所有模块都监听用户删除事件。
  2. 用户被系统删除之后,用户模块发出事件,通知其他模块对该用户的相关信息进行处理
  3. 如果信息处理失败,删除操作回滚。
  4. 所有其他模块处理完毕之后删除该用户。
  5. 成功之后记录log,发消息(邮件,短信等)给相关人员

伪代码如下:

// a module
app.event.on('user:delete', function(){
    // do something
})

// b module
app.event.on('user:delete',function(){  
      // do something
})

// sms  module
app.event.on('user:deleted', function(){ // send sms});

// use module

await app.event.emit('user:delete',{transaction})
user.delete({transaction})
await app.event.emit('user:deleted', {someInfo});
popomore commented 6 years ago

请不要用事件,事件最大的问题是不好找,提高了维护成本。

iwege commented 6 years ago

明白了,感谢。