流处理和消息处理的区别

Difference between stream processing and message processing

流处理和传统消息处理的基本区别是什么?正如人们所说,kafka 是流处理的不错选择,但本质上 kafka 是一个类似于 ActivMQ、RabbitMQ 等的消息传递框架

为什么一般不说ActiveMQ做流处理也好

是不是消息被消费者消费的速度决定了是不是流?

基本上,Kafka 是类似于 ActiveMQ 或 RabbitMQ 的消息传递框架。 Confluent 为使 Kafka 走向流式传输做出了一些努力。

https://www.confluent.io/blog/introducing-kafka-streams-stream-processing-made-simple/

那为什么说到流处理就提到 Kafka?

流处理框架不同于data.In批处理的输入,你有一些文件存储在文件系统中,你想连续处理这些文件并存储在一些数据库中。虽然在 Spark、Storm 等流处理框架中将从某些传感器设备获得连续输入,但 api feed 和 kafka 用于为流引擎提供数据。

在传统的消息处理中,您对消息应用简单的计算——在大多数情况下,每条消息单独计算。

在流处理中,您同时对多个输入流和多个记录(即消息)应用复杂的操作(如聚合和连接)。

此外,传统的消息传递系统无法“回到过去”——也就是说,它们会在消息传递给所有订阅的消费者后自动删除消息。相比之下,Kafka 使用 pull-based 模型(即消费者从 Kafka 中提取数据)将消息保留一段可配置的时间。这允许消费者“倒回”并多次消费消息——或者如果您添加一个新的消费者,它可以读取完整的历史记录。这使得流处理成为可能,因为它允许更复杂的应用程序。此外,流处理不一定是关于 real-time 处理——它是关于处理无限输入流(与应用于有限输入的批处理相反)。

Kafka 提供 Kafka Connect 和 Streams API——所以它是一个 stream-processing 平台,而不仅仅是一个 messaging/pub-sub 系统(即使它在其核心中使用它)。

如果你喜欢分叉: 消息传递是两个或多个进程或组件之间的通信,而流式传输是事件日志发生时的传递。消息携带原始数据,而事件包含有关订单发生和 activity 的信息。 所以 Kafka 两者兼顾,消息传递和流媒体。 Kafka 中的主题可以是原始消息或通常保留数小时或数天的事件日志。事件可以进一步聚合为更复杂的事件。

消息处理意味着使用 个人 消息对 and/or 进行操作。流处理包括使用单个消息对 and/or 的操作,以及在消息流入系统时对消息集合的操作。例如,假设交易正在进入支付工具 - 流处理可用于连续计算每小时平均支出。在这种情况下 - 可以对流施加滑动 window ,它在一小时内拾取消息并计算数量的平均值。然后可以将这些数字用作欺诈检测系统的输入

尽管 Rabbit 支持流式传输,但它实际上并不是为此而构建的(请参阅 Rabbit 的网站) Rabbit 是一个消息代理,Kafka 是一个事件流平台。

Kafka 可以处理大量 'messages' 的 Rabbit。 Kafka 是一个日志,而 Rabbit 是一个队列,这意味着如果一旦被消费,Rabbit 的消息就不再存在,以备不时之需。

但是 Rabbit 可以指定消息优先级,而 Kafka 不能。

这取决于您的需求。

最近看到一篇很好的文档,描述了“流处理”和“消息处理”的用法

https://developer.ibm.com/technologies/messaging/articles/difference-between-events-and-messages/

在上下文中进行异步处理-

流处理: 当有“处理请求”时考虑它,即客户端请求服务器处理。

消息处理: 在“访问企业数据”时考虑它,即企业内的组件可以发出描述其当前状态的数据。此数据通常不包含其他系统完成操作的直接指令。相反,组件允许其他系统深入了解它们的数据和状态。

为促进此评估,在为您的解决方案选择合适的技术时,请考虑以下关键选择标准:

事件历史 - Kafka 细粒度订阅 - Kafka 可扩展消费——Kafka 事务行为 - MQ