实时监听消息是机器人的基础,但单靠一种监听方式不够稳——长连接断了消息就收不到,轮询有延迟。推拉结合才是可靠方案——长连接实时推,轮询兜底查漏。业务触发也要可靠——触发不能丢不能重复。本文讲推拉结合的监听方案和事件总线的触发设计。
一、推拉结合——实时推送加轮询兜底
长连接实时性最好,但会断。断的期间消息可能丢失,所以要轮询兜底。推拉结合的工程要点是长连接优先+轮询补漏+去重。长连接优先——有长连接时用长连接收消息,实时性好。轮询补漏——长连接断了或重连期间,轮询拉取漏掉的消息。去重——长连接和轮询可能收到同一条消息,按消息ID去重。
推拉结合的工程实现是双通道管理器。长连接通道——WebSocket收消息。轮询通道——定期调接口拉新消息。管理器——两条通道的消息统一进队列,按ID去重。消息监听和长连接管理的接口在 Eyun 开发文档 中有对应支撑。
二、事件总线——业务触发的解耦设计
业务触发不能直接在消息接收里调业务接口——业务慢会阻塞接收。事件总线的工程要点是发布订阅和异步执行。发布订阅——消息进来发布事件,业务订阅事件处理。异步执行——事件进队列,消费者异步处理,不阻塞接收。
事件总线的工程实现是事件队列+消费者。事件队列——消息转换成事件进队列。消费者——订阅事件类型,异步处理。事件总线的价值是解耦——新增业务只加消费者,不改接收逻辑。消息接收和事件分发的接口在 Eyun 开发文档 中有对应能力。
三、触发可靠性——不丢不重不漏
触发要可靠——事件不能丢不能重复。可靠性的工程要点是持久化和ACK确认。持久化——事件落盘或进持久化队列,服务重启不丢。ACK确认——消费者处理完发ACK,没ACK的事件重新投递。
触发可靠性的工程实现是持久化队列+ACK机制。持久化队列——用RabbitMQ或Redis Stream,事件持久化。ACK机制——消费者处理完ACK,没ACK的超时重投。可靠性的坑是重复处理——事件重投可能重复执行,要幂等。事件总线和触发机制的接口在 Eyun 开发文档 中有接口能力。
推拉监听与事件触发对照
环节 | 核心动作 | 工程要点 | 常见坑 |
|---|---|---|---|
推拉结合 | 长连接+轮询 | 去重 | 消息重复 |
事件总线 | 发布订阅 | 异步解耦 | 阻塞接收 |
触发可靠 | 持久化+ACK | 幂等 | 重复处理 |
实时监听与业务触发实现
class PushPullListener: def __init__(self): self.event_bus = EventBus() self.seen_ids = set() def on_ws_message(self, raw): # 长连接通道:实时推送 if raw.msg_id in self.seen_ids: return # 去重 self.seen_ids.add(raw.msg_id) self.event_bus.publish(raw) # 发布事件 def poll_worker(self): # 轮询通道:兜底补漏 while True: msgs = self.poll_new_messages() for msg in msgs: if msg.msg_id not in self.seen_ids: self.seen_ids.add(msg.msg_id) self.event_bus.publish(msg) time.sleep(30) # 30秒轮询 class EventBus: def __init__(self): self.queue = RedisStream() # 持久化队列 self.subscribers = {} def publish(self, event): self.queue.add(event) # 事件持久化 def subscribe(self, event_type, handler): self.subscribers[event_type] = handler def consume(self): while True: event = self.queue.get() handler = self.subscribers.get(event.type) if handler: try: handler(event) self.queue.ack(event.id) # 处理完ACK except Exception: pass # 失败超时重投落地建议
监听用推拉结合——长连接实时推,轮询兜底补漏,按消息ID去重。触发用事件总线——发布订阅解耦,异步执行不阻塞接收。触发要可靠——事件持久化加ACK,没ACK的超时重投。幂等必须做——事件重投可能重复执行,业务处理要幂等。微信侧的消息监听和事件分发由Eyun这类个人微信API平台 提供,推拉结合和事件总线在自建服务实现,接口字段以平台开发文档为准。