【问题标题】:Difference between stream processing and message processing流处理和消息处理的区别
【发布时间】:2017-06-04 07:29:48
【问题描述】:

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

为什么我们通常不说 ActiveMQ 也适用于流处理。

是消费者消费消息的速度决定了它是否是流吗?

【问题讨论】:

标签: stream queue rabbitmq apache-kafka messaging


【解决方案1】:

Kafka 基本上是类似于 ActiveMQ 或 RabbitMQ 的消息传递框架。 Confluent 做出了一些努力来将 Kafka 推向流媒体。

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

那为什么在谈到流处理时会出现 Kafka 呢?

流处理框架因数据输入而异。在批处理中,您有一些文件存储在文件系统中,您希望不断处理这些文件并存储在某个数据库中。在 Spark、Storm 等流处理框架中,会从一些传感器设备获得连续输入,而 api feed 和 kafka 则用于为流引擎提供数据。

【讨论】:

  • Apache Kafka 将自己描述为“分布式流媒体平台”,请参阅 kafka.apache.org。早在 2012 年,粗略地说,它是作为一个消息传递系统开始的,但现在它远不止于此。 Kafka 特别附带了自己的流处理引擎,称为 Kafka 的 Streams API(或简称 Kafka Streams)。您不再需要使用单独的流处理技术,例如 Storm 或 Spark,并且有不少 Spark/Storm/...的前用户已经开始迁移到 Kafka 的 Streams API 以简化和改进他们的数据架构。
【解决方案2】:

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

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

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

而且 Kafka 提供 Kafka Connect 和 Streams API——因此它是一个流处理平台,而不仅仅是一个消息传递/发布订阅系统(即使它在其核心中使用它)。

【讨论】:

  • 另外,输入流可能是无限的,但处理更像是有限输入的滑动窗口。从这个意义上说,流处理和批处理之间没有任何区别。批处理只是强定义窗口的流处理的一个特例。
  • 说得好!只是一个想法,这些天“流式传输”这个词可以与“微批处理”互换使用(混淆)。在谈论滑动窗口的那一刻,人们已经在谈论微批处理。最严格意义上的流式处理是处理记录/事件/事实。从这个意义上说,在流式传输的情况下,滑动窗口的大小为 1。
  • 微批处理限制了您如何定义窗口边界(即,至少推进一个批次的跳跃窗口),而在流处理中,您可以按您喜欢的任何粒度推进窗口。此外,滑动窗口和跳跃窗口之间存在差异(许多系统使用术语“滑动窗口”来实际描述跳跃窗口,这也会导致混淆)。因此,我不明白为什么窗口意味着微批处理。根据您的论点,您无法在流上进行聚合,这在流处理中当然是可能的。
  • 微批处理更多的是关于 when 执行计算,并且(如前所述)将实现细节(即批处理边界)泄漏到运算符语义中。流处理不这样做。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      虽然 Rabbit 支持流式传输,但实际上并不是为它构建的(参见 Rabbit 的网站) Rabbit 是消息代理,Kafka 是事件流平台。

      Kafka 可以处理大量发往 Rabbit 的“消息”。 Kafka 是一个日志,而 Rabbit 是一个队列,这意味着一旦被消费,Rabbit 的消息将不再存在,以备不时之需。

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

      这取决于您的需求。

      【讨论】:

        【解决方案6】:

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

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

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

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2011-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-12
          • 1970-01-01
          • 1970-01-01
          • 2014-12-06
          • 1970-01-01
          相关资源
          最近更新 更多