总觉得这两种方式非常相似,流式计算 和 消息队列都可以看作是针对单个消息的处理,不是吗?在需要实际计算的场景中,消息队列好像也能满足条件,但这又是两种技术。如何区别他们以选择更加合适的场景?
总觉得这两种方式非常相似,流式计算 和 消息队列都可以看作是针对单个消息的处理,不是吗?在需要实际计算的场景中,消息队列好像也能满足条件,但这又是两种技术。如何区别他们以选择更加合适的场景?
8 回答6.4k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
2 回答3.2k 阅读
2 回答3.9k 阅读
1 回答2.2k 阅读✓ 已解决
3 回答1.6k 阅读✓ 已解决
两者不是一个层面上的东西,没啥可比性。
非要比较的话,既然已经说“流”(Streaming)了,那一定是有序的;而消息队列则不关心顺序,虽然消费者从队列里拉取消息是有顺序的,但你怎么保证多个消费者消费消息是有序的呢?
所以在流处理中,“时间”或者“窗口”是个很重要的概念(有股子时序数据库的味道了)。
再一个是流处理从拓扑结构上看只能是线状的,即 A→B→C→D(指单个处理器,多个处理器当然也可能会有网状结构);而消息队列则可以是网状的,A→B 的同时可能也有 A→C,甚至再反过来 C→A(可以是,不代表一定是,你当然也可以在业务上设计出线性的结构)。
所以你看流处理中会强调“状态”,即一个数据当前正处于哪个处理器,而消息队列系统中并不强调(注意不强调不等于不可以,你业务上当然也可以区分状态,只是消息队列本身不关心罢了)。
P.S. 其实广义上的消息队列分两种:一种是生产消费模式,这种模式下一条消息只能被消费一次,然后就被删除了;另一种是发布订阅模式,这种模式下往往会多出一个叫 Topic 或类似概念的东西,一条消息可以被多个消费者都消费到。所以如果一个消息队列是生产消费模式的、并且拓扑结构是线性的、并且你在业务层能保证消费有序,跟流就几乎一样了。
P.S. 有些工具会分别提供流和队列两种 API,比如 Kafka;有些则抽象出一个统一的 API,比如 Pulsar。所以从这个角度上看,二者也不是非此即彼的关系,而是不同维度上描述一个系统的两个概念,可以统一也可以不统一。