关于流式计算 和 消息队列的本质区别

总觉得这两种方式非常相似,流式计算 和 消息队列都可以看作是针对单个消息的处理,不是吗?在需要实际计算的场景中,消息队列好像也能满足条件,但这又是两种技术。如何区别他们以选择更加合适的场景?

阅读 5.5k
1 个回答

两者不是一个层面上的东西,没啥可比性。

非要比较的话,既然已经说“流”(Streaming)了,那一定是有序的;而消息队列则不关心顺序,虽然消费者从队列里拉取消息是有顺序的,但你怎么保证多个消费者消费消息是有序的呢?

所以在流处理中,“时间”或者“窗口”是个很重要的概念(有股子时序数据库的味道了)。

再一个是流处理从拓扑结构上看只能是线状的,即 A→B→C→D(指单个处理器,多个处理器当然也可能会有网状结构);而消息队列则可以是网状的,A→B 的同时可能也有 A→C,甚至再反过来 C→A(可以是,不代表一定是,你当然也可以在业务上设计出线性的结构)。

所以你看流处理中会强调“状态”,即一个数据当前正处于哪个处理器,而消息队列系统中并不强调(注意不强调不等于不可以,你业务上当然也可以区分状态,只是消息队列本身不关心罢了)。

P.S. 其实广义上的消息队列分两种:一种是生产消费模式,这种模式下一条消息只能被消费一次,然后就被删除了;另一种是发布订阅模式,这种模式下往往会多出一个叫 Topic 或类似概念的东西,一条消息可以被多个消费者都消费到。所以如果一个消息队列是生产消费模式的、并且拓扑结构是线性的、并且你在业务层能保证消费有序,跟流就几乎一样了。

P.S. 有些工具会分别提供流和队列两种 API,比如 Kafka;有些则抽象出一个统一的 API,比如 Pulsar。所以从这个角度上看,二者也不是非此即彼的关系,而是不同维度上描述一个系统的两个概念,可以统一也可以不统一。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题