是否建议使用卡夫卡作为真相来源?

时间:2017-02-27 20:26:43

标签: apache-spark cassandra apache-kafka apache-storm

我们的应用程序需要一个非常高的写入(在峰值突发期间每秒写入数千次),并且数据需要进入多个数据存储,如Elastic-Search,HDFS,Cassandra和Cache。 (幸好没有关系数据库)。

处理此问题的最佳方法是什么?

将Kafka作为所有其他数据存储可以读取的真实来源(通过Spark / Storm流媒体)是不是一个好主意?

Kafka是否存在数据丢失的可能性? 数据丢失的可能性是否比直接写入Cassandra更重要?

编辑:我看到的一个问题是Cassandra施加的限制与Kafka施加的约束不同。由于Kafka没有施加约束并且会接受任何数据,因此通过写信给Kafka可能会给应用程序错误的成功交易感。由于Cassandra中存在一些约束违规,相同的数据可能无法在Cassandra中成功。 Cassandra的示例约束失败:InvalidRequest: Error from server: code=2200 [Invalid query] message="Invalid INTEGER constant (500) for "name" of type text"。应用程序可能会在某些数据类型中发生变化,而Kafka很乐意在下游Cassandra消费者失败时接受它。 (这种变化将如何通过升级,qa阶段等是一个不同的故事)。因此,使用卡夫卡作为事实来源的风险在于它给人一种错误的成功感。

1 个答案:

答案 0 :(得分:4)

  

将Kafka作为所有其他数据存储可以阅读的真相来源是个好主意

绝对。卡夫卡首先设计了这种模式。即使在Kafka中,更多的只是消息代理/ pub-sub系统,同时还在Kafka 0.10中添加了流处理功能。

  

Kafka是否有可能导致数据丢失?

不是在你的数据被激活之后。在Kafka中,您可以同步或异步写入,并且可以在收到" ack"之前配置应该复制数据的代理数量。在制片人。比较http://docs.confluent.io/current/clients/producer.html

  

数据丢失的可能性是否大于直接写入Cassandra?

我对Casandra的细节并不熟悉,但我不认为Casandra能够提供更强的容错能力Kafka - 这一切都归结为你配置的复制品数量(你可以为两者做到这一点) Casandra和Kafka)。

关于Kafka中潜在的损坏数据: Kafka不会检查任何书面数据,只会在代理方面处理byte[]。所以,是的,您应该在生产者上应用策略,以确保没有将损坏的数据写入主题。但是,您可以使用AVRO作为您的数据类型,它将帮助您再次保护损坏的数据。