如何将事件驱动在业务系统中巧妙融入并拓展至积分系统的长尾应用?
- 内容介绍
- 文章标签
- 相关推荐
说实话, 积分系统这个东西,早期我们做得特别简单,就是在订单服务里头直接调用个addPoints方法, 要我说... 签到服务里也是直接更新用户余额,这种做法在刚开始确实够快够直接,但慢慢地就暴露出问题来了那个。
痛点来了
杀疯了! 运营的同学说要搞个双倍积分活动, 开发就得改代码;产品经理又说新用户注册前三天积分翻倍,开发又得加判断;甚至财务部门要求积分必须按有效期分批次管理,这时候你会发现积分逻辑已经乱成一团了像意大利面条一样缠绕在各个业务模块里牵一发而动全身。
事件驱动架构登场
为了解决这些痛点,我们引入了事件驱动架构。它的核心思想很简单:业务系统只负责“发生什么”,而积分系统负责“基于发生的事情做什么”。比如说 用户支付完成后订单服务发布一个OrderPaidEvent这个事件包含了订单金额、用户ID、商品类别等信息,积分系统监听到这个事件后再根据内部配置的规则引擎去决定是否发放积分以及发放多少。
这种异步解耦的设计带来了巨大的灵活性:业务系统无感知新增积分规则时完全不需要修改业务代码;规则动态化, 运营人员可以通过后台配置各种复杂的积分规则, 我怀疑... 实时生效,无需发版;可追溯性,每一次积分变动都绑定了一个具体的事件源,天然具备了审计基础。
关键的技术实现
事件字典
虽然事件驱动很美好,但不能失控。我们需要建立一套事件字典, 它本质上是一份“契约”,定义了积分系统认可并处理的那些标准行为,比如USER_SIGNORDER_PAIDTASK_COMPLETED等。这些事件由技术侧维护, 而不是运营侧,主要原因是事件代表着技术实现的边界,只有代码里真实埋点了后台配置才有意义。
规则引擎
接下来就是核心的规则层。
说实话, 积分系统这个东西,早期我们做得特别简单,就是在订单服务里头直接调用个addPoints方法, 要我说... 签到服务里也是直接更新用户余额,这种做法在刚开始确实够快够直接,但慢慢地就暴露出问题来了那个。
痛点来了
杀疯了! 运营的同学说要搞个双倍积分活动, 开发就得改代码;产品经理又说新用户注册前三天积分翻倍,开发又得加判断;甚至财务部门要求积分必须按有效期分批次管理,这时候你会发现积分逻辑已经乱成一团了像意大利面条一样缠绕在各个业务模块里牵一发而动全身。
事件驱动架构登场
为了解决这些痛点,我们引入了事件驱动架构。它的核心思想很简单:业务系统只负责“发生什么”,而积分系统负责“基于发生的事情做什么”。比如说 用户支付完成后订单服务发布一个OrderPaidEvent这个事件包含了订单金额、用户ID、商品类别等信息,积分系统监听到这个事件后再根据内部配置的规则引擎去决定是否发放积分以及发放多少。
这种异步解耦的设计带来了巨大的灵活性:业务系统无感知新增积分规则时完全不需要修改业务代码;规则动态化, 运营人员可以通过后台配置各种复杂的积分规则, 我怀疑... 实时生效,无需发版;可追溯性,每一次积分变动都绑定了一个具体的事件源,天然具备了审计基础。
关键的技术实现
事件字典
虽然事件驱动很美好,但不能失控。我们需要建立一套事件字典, 它本质上是一份“契约”,定义了积分系统认可并处理的那些标准行为,比如USER_SIGNORDER_PAIDTASK_COMPLETED等。这些事件由技术侧维护, 而不是运营侧,主要原因是事件代表着技术实现的边界,只有代码里真实埋点了后台配置才有意义。
规则引擎
接下来就是核心的规则层。

