为啥在实时处理中使用 apache kafka

Posted

技术标签:

【中文标题】为啥在实时处理中使用 apache kafka【英文标题】:Why using apache kafka in real-time processing为什么在实时处理中使用 apache kafka 【发布时间】:2017-09-10 03:52:26 【问题描述】:

最近我一直在研究使用storm、flink等进行实时数据处理...... 我遇到的所有架构都使用 kafka 作为数据源和流处理器之间的一层,为什么要存在这个层?

【问题讨论】:

【参考方案1】:

我认为使用 Apache Kafka 进行实时处理的主要原因有三个:

分布 性能 可靠性

在实时处理中,需要将数据从数据源快速可靠地传递到流处理器。如果你做得不好,它很容易成为你实时处理系统的瓶颈。这就是 Kafka 可以提供帮助的地方。

以前,传统的消息传递 ApacheMQ 和 RabbitMQ 对于实时处理大量数据并不是特别好。出于这个原因,Linkedin 工程师开发了他们自己的消息系统 Apache Kafka 来应对这个问题。

分布: Kafka 是原生分布的,适合流处理的分布性质。 Kafka 将传入的数据划分为按偏移量排序的分区,这些分区物理分布在集群中。然后这些分区可以以分布式方式馈送到流处理器。

性能: Kafka 被设计为简单,为了性能而牺牲了高级功能。 Kafka 的性能优于传统的消息传递系统,这在paper 中也可以看出。主要原因如下:

Kafka 生产者不等待代理的确认 并以代理可以处理的最快速度发送数据

Kafka 的存储格式更高效,元数据更少。

Kafka broker 是无状态的,不需要关心消费者的状态。

Kafka 利用 UNIX sendfile API 有效地从 通过减少数据副本的数量和 系统调用。

可靠性:Kafka 充当数据源和流处理器之间的缓冲区,以处理大量数据。 Kafka 只是简单地存储所有传入的数据,消费者负责决定他们想要处理数据的数量和速度。这确保了可靠的负载平衡,流处理器不会被太多数据淹没。

Kafka 保留策略还允许从处理过程中的故障中轻松恢复(Kafka 默认将所有数据保留 7 天)。每个消费者跟踪最后处理的消息的偏移量。出于这个原因,如果某些消费者失败,很容易回滚到失败之前的点并重新开始处理,而不会丢失信息或需要从头重新处理所有流。

【讨论】:

我只想强调一点,Kafka 代理允许您分离生产者和消费者系统。 (这是上面“可靠性”点的一部分,但我想强调它,因为它没有明确提及。)——此外,我想指出,Kafka 不仅仅是一个发布/订阅或消息传递系统。它是一个流平台,具有消息代理、客户端、与其他系统的连接器以及流处理功能——因此,如果您已经拥有 Kafka,您现在甚至可能需要一个流处理框架。

以上是关于为啥在实时处理中使用 apache kafka的主要内容,如果未能解决你的问题,请参考以下文章

[译] 流式处理:使用 Apache Kafka 的 Streams API 实现 Rabobank 的实时财务告警

专为实时而构建:使用Apache Kafka进行大数据消息传递 第2部分

实时构建:Apache Kafka的大数据消息传递,Part 1

实时构建:Apache Kafka的大数据消息传递,Part 2

六问 Kafka 为啥那么牛!

使用 apache spark 流式处理实时日志