我们的应用程序需要非常高的写入吞吐量(在高峰时期每秒数千次写入),并且数据需要进入多个数据存储,如Elastic-Search、HDFS、Cassandra和Cache。(没有关系型数据库,谢天谢地)
如何处理这个问题是最好的方式?
将Kafka作为真相来源,让所有其他数据存储可以通过Spark/Storm流式传输读取,这是一个好主意吗?
Kafka会有数据丢失的风险吗? 与直接写入Cassandra相比,数据丢失的潜在风险是否更大?
编辑:我看到的一个问题是,Cassandra强加的约束条件与Kafka强加的不同。由于Kafka不强制执行任何限制并且将接受任何数据,因此它可能会通过向Kafka写入数据给应用程序提供错误的成功事务感觉。由于某些约束条件在Cassandra中被违反,相同的数据可能无法成功写入Cassandra。来自Cassandra的约束失败示例:
如何处理这个问题是最好的方式?
将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等阶段进行更改是另一回事)。因此,使用Kafka作为真相来源的风险在于它会提供错误的成功感觉。