手写一个基础消息代理:发布、订阅、重试与失败契约

用一个可运行的 Go 版本基础消息代理,讲透发布订阅、重试语义、失败契约、吞吐与积压估算,以及从朴素实现到工程可用实现的关键取舍。

2026年2月28日 · 8 分钟 · map[name:Jeanphilo]

请求/响应 vs 发布/订阅:什么时候用哪种通信模式

副标题 / 摘要 请求/响应强调确定性与即时性,发布/订阅强调解耦与扩展。本文给出工程取舍与选型依据。 目标读者 设计系统通信方式的工程师 需要落地消息队列的团队 关注系统扩展性的架构师 背景 / 动机 不同业务对实时性、耦合度与可靠性要求不同。 选错通信模式会导致复杂度或性能问题。 核心概念 请求/响应:点对点、强同步 发布/订阅:多对多、异步解耦 背压与重试:决定系统稳定性 实践指南 / 步骤 确定是否必须实时同步返回结果 评估消费者数量与扩展需求 设计失败重试与死信队列 为消息定义幂等与去重策略 可运行示例 # 极简发布/订阅示例 subscribers = [] def subscribe(fn): subscribers.append(fn) def publish(event): for fn in subscribers: fn(event) if __name__ == "__main__": subscribe(lambda e: print("A got", e)) subscribe(lambda e: print("B got", e)) publish({"type": "order.created", "id": 1}) 解释与原理 请求/响应适合“需要立即结果”的业务流程。 发布/订阅适合“事件驱动、解耦扩展”的场景,但需要处理一致性与幂等。 常见问题与注意事项 发布/订阅会丢消息吗? 可能,需配置持久化与重试机制。 请求/响应能扩展吗? 可以,但耦合更高、弹性更差。 混用可以吗? 可以,常见是“同步写 + 异步通知”。 ...

2026年1月24日 · 1 分钟 · map[name:Jeanphilo]

什么时候使用异步通信:场景、收益与代价

副标题 / 摘要 异步通信提升解耦与吞吐,但引入一致性与可观测性成本。本文给出适用场景与落地指南。 目标读者 负责系统架构与通信模式选型的工程师 设计消息队列与事件流的开发者 希望提升系统稳定性的团队 背景 / 动机 同步调用容易形成链路耦合与级联失败。 异步通信通过消息缓冲解耦,提高系统韧性,但代价是复杂度提升。 核心概念 同步通信:请求-响应,强一致 异步通信:事件驱动,最终一致 消息队列:解耦、削峰、缓冲 实践指南 / 步骤 判断是否必须强一致 评估下游稳定性与峰值压力 明确消息语义(至少一次/至多一次) 引入可观测性(重试、死信) 设计幂等与补偿机制 可运行示例 import queue import threading import time q = queue.Queue() def producer(): for i in range(5): q.put(i) time.sleep(0.1) def consumer(): while True: item = q.get() print("consume", item) q.task_done() if item == 4: break if __name__ == "__main__": threading.Thread(target=consumer).start() producer() 解释与原理 异步通信把“耦合”从时间维度中移除。 上游不必等待下游响应,减少链路阻塞与级联失败。 ...

2026年1月24日 · 1 分钟 · map[name:Jeanphilo]