收到回调事件只是第一步,把事件和业务动作联动起来才是目的。新好友加了要打标签发欢迎语,订单支付了要推送提醒,群成员变动要通知管理员。事件到业务的联动要解决联动映射、规则引擎、执行保证三个问题。
一、联动映射——哪种事件触发哪条业务链
事件和业务是多对多关系。一个事件可能触发多条业务链(新好友事件既发欢迎语又打标签),一条业务链也可能由多个事件触发(订单的完整通知由支付、发货、签收三个事件共同构成)。所以需要一个映射表把事件和业务链对应起来。
映射表配置化是关键。事件类型有哪些、每种事件触发哪些业务,这属于运营配置而不是代码逻辑。写死在代码里的话,加一条联动规则就要改代码发版,运营没法自己调。
二、规则引擎——联动的条件判断
不是收到事件就无条件执行联动,要过条件判断。条件可能是用户属性(是不是新用户、有没有标签)、可能是事件属性(金额大于多少、事件来源)、也可能是时间条件(工作时间内才通知)。
规则引擎的实现是条件表达式加动作列表。条件用表达式描述,动作是业务链的入口。规则按优先级排序执行,避免多条规则冲突时结果不确定。规则命中后要记录命中日志,方便排查某次事件为什么没触发预期联动。
三、执行保证——联动不能乱序不能重复
事件来得快,业务链执行慢,这里有两个必须处理的问题:顺序和重复。顺序——同一个用户的事件要按发生顺序处理,不能因为并发导致后发生的事件先执行。按用户ID哈希到同一队列,保证同用户串行。
重复——事件可能重复投递,业务链重放会造成重复动作。按事件ID加业务链ID组合做幂等,同一条业务链对同一个事件只执行一次。
事件与业务联动对照
环节 | 核心动作 | 工程要点 | 常见坑 |
|---|---|---|---|
联动映射 | 事件→业务链 | 配置化 | 规则散落代码 |
条件判断 | 规则引擎 | 优先级+日志 | 冲突不确定 |
执行顺序 | 按用户串行 | 哈希分队列 | 并发乱序 |
幂等 | 事件+业务链去重 | 组合键 | 重复执行 |
事件回调业务联动实现
class EventBusinessLinker: def __init__(self): self.mapping = LinkMapping() # 事件→业务链映射 self.rule_engine = RuleEngine() # 条件规则引擎 self.processed = set() # 幂等缓存 def on_event(self, event): # 查映射:该事件关联哪些业务链 chains = self.mapping.get_chains(event.type) if not chains: return for chain_id in chains: self.execute_chain(event, chain_id) def execute_chain(self, event, chain_id): # 幂等:事件+业务链组合去重 key = (event.event_id, chain_id) if key in self.processed: return # 条件判断:规则引擎过滤 rule = self.rule_engine.match(event, chain_id) if not rule: self.log_skip(event, chain_id) # 记录未命中 return self.processed.add(key) # 按用户串行:保证顺序 worker_id = hash(event.wxid) % WORKER_COUNT self.workers[worker_id].submit( self.run_chain, event, chain_id, rule.actions ) def run_chain(self, event, chain_id, actions): # 执行业务链:按动作顺序 for action in actions: try: action.execute(event) except Exception as e: self.record_failure(event, chain_id, action, e) if action.critical: self.rollback(actions) # 关键动作失败回滚 break def log_skip(self, event, chain_id): # 记录未命中日志 self.log_db.insert({ "event_id": event.event_id, "chain_id": chain_id, "reason": "rule_not_match", "ts": time.time() }) def rollback(self, actions): # 回滚:反向撤销已执行动作 for action in reversed(actions): if action.executed: action.undo()落地建议
事件到业务的映射要配置化——哪种事件触发哪条业务链属于运营配置,写死在代码里加规则要发版。条件判断要有优先级——多条规则命中时执行顺序要确定,并记录命中日志方便排查。执行要保证顺序——按用户ID分队列串行,避免并发乱序。幂等必须做——事件重复投递时按事件加业务链去重,防止重复执行。微信侧的事件回调推送由Eyun这类个人微信API平台 提供,联动映射、规则引擎和幂等控制在自建服务实现,接口字段以平台开发文档为准。