知识卡片
消息代理与数据库的四点本质差异
内容
消息代理本质是一种针对消息流优化的数据库——生产者写入、消费者从中读取,甚至能像[[原子提交问题与两阶段提交的机制及两个不归路]]中的参与者一样参与XA/JTA两阶段提交,但传统AMQP/JMS风格的消息代理和数据库之间仍有四点关键差异:一是生命周期,数据库通常保留数据直到显式删除,多数消息代理却在消息成功递送给消费者后就自动删除,不适合当长期存储用;二是工作集假设,正因为消息很快被删除,消息代理默认自己的队列很短,一旦因消费者变慢而堆积大量待处理消息,吞吐量往往会明显恶化;三是访问方式,数据库支持二级索引等丰富的查询手段,消息代理通常只支持按主题模式匹配订阅子集;四是新鲜度语义,查询数据库拿到的是某个时间点的快照,之后数据变了并不会主动告知你,而消息代理反过来,不支持任意查询,但一旦有新消息就会主动推送通知客户端。发散:这四点差异共同指向一个事实——消息代理为”低延迟通知”做了极致优化,代价是牺牲了数据库擅长的”长期存储+灵活查询”,这也是后文要讨论”基于日志的消息代理”想要兼得两者的动机。
参考来源
- 位置:《数据密集型应用系统设计》第十一章《流处理》"消息代理与数据库的对比"(源文件:_epub-src/ch11_split_000.html)
- 结论依据:原文逐一列出消息代理与数据库在数据保留期限、工作集假设、访问查询方式、结果新鲜度四方面的差异,并说明这些差异被JMS/AMQP等标准封装,直接支撑本卡片的分类总结。
- 原始内容:数据库通常保留数据直至显式删除,而大多数消息代理在消息成功递送给消费者时会自动删除消息……数据库通常支持二级索引和各种搜索数据的方式,而消息代理通常支持按照某种模式匹配主题……查询数据库时,结果通常基于某个时间点的数据快照。