Driplang:当事件发生(或不发生)时触发

主要观点:介绍过去项目处理事件触发的多种方式,提出能极大受益于非平凡事件触发需求项目的小调整,即分离事件跟踪和反应代码,避免不必要依赖。通过简单触发和更高级触发的例子,阐述不同方式的优缺点,引入事件滴灌器(Eventdripper)来解决问题,它利用领域特定语言(Driplang)定义事件触发表达式,可优化性能,最后强调当事件触发需求变得不平凡时,分离代码是值得的。
关键信息

  • 常见需求是特定事件发生时触发功能,如注册一周内未使用某功能的用户发送邮件。
  • 简单触发在项目初期可直接在用户创建代码路径中发送邮件,但随功能增加会导致邮件发送代码分散。
  • 更高级触发需创建全知的定时任务,能明确触发事件所需信息及来源,但会增加系统依赖和复杂性。
  • 事件滴灌器通过记录事件而非立即反应,将发送邮件责任转移,避免不必要的数据模型修改,其接口简单,可通过发送 POST 请求将事件存入数据库,利用 Driplang 定义事件触发表达式。
  • Driplang 基于布尔和时序逻辑,有ANDORNOTTHEN等操作符,THEN可考虑时间顺序,WITHIN可设置时间约束。
  • 性能优化方面,对于不含THEN WITHIN的表达式,新事件到达时才评估,只评估包含新事件的表达式。
    重要细节
  • 简单触发示例代码class UserController: def add_user(self, user): self.user_repository.create(user); self.email_service.send_intro_email(user)
  • 更高级触发示例代码class OmniscientCronJobThingy: def x_not_used_in_first_week(self): for user in self.user_repository.list(created_within='1 week'): if not self.feature_x_repository.used_by(user): self.email_service.send_feature_x_intro_email(user)
  • 事件滴灌器接口代码POST /event { "event": "user_created", "entity_id": "user-id", "data": { /* data relevant when reacting to the event */ } }
  • Driplang 示例表达式及对应输出表格。
阅读 37
0 条评论