关于流式计算 和 消息队列的本质区别
总觉得这两种方式非常相似,流式计算 和 消息队列都可以看作是针对单个消息的处理,不是吗?在需要实际计算的场景中,消息队列好像也能满足条件,但这又是两种技术。如何区别他们以选择更加合适的场景?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
总觉得这两种方式非常相似,流式计算 和 消息队列都可以看作是针对单个消息的处理,不是吗?在需要实际计算的场景中,消息队列好像也能满足条件,但这又是两种技术。如何区别他们以选择更加合适的场景?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(1)
两者不是一个层面上的东西,没啥可比性。
非要比较的话,既然已经说“流”(Streaming)了,那一定是有序的;而消息队列则不关心顺序,虽然消费者从队列里拉取消息是有顺序的,但你怎么保证多个消费者消费消息是有序的呢?
所以在流处理中,“时间”或者“窗口”是个很重要的概念(有股子时序数据库的味道了)。
再一个是流处理从拓扑结构上看只能是线状的,即 A→B→C→D(指单个处理器,多个处理器当然也可能会有网状结构);而消息队列则可以是网状的,A→B 的同时可能也有 A→C,甚至再反过来 C→A(可以是,不代表一定是,你当然也可以在业务上设计出线性的结构)。
所以你看流处理中会强调“状态”,即一个数据当前正处于哪个处理器,而消息队列系统中并不强调(注意不强调不等于不可以,你业务上当然也可以区分状态,只是消息队列本身不关心罢了)。
P.S. 其实广义上的消息队列分两种:一种是生产消费模式,这种模式下一条消息只能被消费一次,然后就被删除了;另一种是发布订阅模式,这种模式下往往会多出一个叫 Topic 或类似概念的东西,一条消息可以被多个消费者都消费到。所以如果一个消息队列是生产消费模式的、并且拓扑结构是线性的、并且你在业务层能保证消费有序,跟流就几乎一样了。
P.S. 有些工具会分别提供流和队列两种 API,比如 Kafka;有些则抽象出一个统一的 API,比如 Pulsar。所以从这个角度上看,二者也不是非此即彼的关系,而是不同维度上描述一个系统的两个概念,可以统一也可以不统一。