知识卡片

消息代理用缓冲重试和解耦换取比直接RPC更强的可靠性

普通读书笔记卡

内容

异步消息传递系统介于[[RPC试图让远程调用貌似本地调用是根本性缺陷]]描述的直接RPC和 数据库之间:它像RPC一样以低延迟把请求(这里称为消息)传给另一个进程,但不是通过 直接的网络连接,而是经过一个称为消息代理(消息队列/面向消息的中间件)的中介来 临时存储消息,这一点又像数据库。相比直接RPC,引入消息代理带来几个具体收益:如果 接收方不可用或过载,代理能充当缓冲区,提升系统整体可靠性,不会因为下游一时处理不过来 就直接失败;代理能自动把消息重发给已经崩溃后又恢复的进程,防止消息在中途丢失;发送方 不需要知道接收方的IP地址和端口号,这在虚拟机频繁创建销毁的云环境下尤其有用;一条 消息可以被发给多个接收方;发送方和接收方在逻辑上被彻底解耦——发送方只管发布消息, 完全不关心谁会消费它。但消息传递和RPC有一个本质区别:通信通常是单向的,发送者一般 不期待收到消息的直接回复(如果确实需要响应,通常是通过一个独立的通道完成),这种 “发出去就不再等待、直接忘记”的模式是异步的,和RPC那种”发请求、等响应”的同步期待 完全不同。消息代理通常不强制任何特定的数据模型,消息只是带一些元数据的字节序列, 只要编码方式向前向后兼容,发布者和消费者的编码就可以独立修改、以任意顺序部署。

参考来源

- 位置:《数据密集型应用系统设计》第四章《编码与演化》"消息传递中的数据流""消息 代理"(源文件:_epub-src/ch4_split_004.html) - 结论依据:原文说明消息代理相比直接RPC能提供缓冲、自动重发、避免直接寻址接收方、 一对多分发、发送接收方解耦等优势,并指出消息传递通常是单向异步的、与RPC的 同步期待响应不同,消息代理通常不强制特定数据模型,直接支撑本卡片结论。 - 原始内容:与直接RPC相比,使用消息代理有几个优点:如果收件人不可用或过载,可以 充当缓冲区……它可以自动将消息重新发送到已经崩溃的进程……差异在于消息传递通信 通常是单向的:发送者通常不期望收到其消息的回复……这种通信模式是异步的:发送者 不会等待消息被传递,而只是发送它,然后忘记它。