2017-04-05 68 views
1

我知道卡夫卡不是K/V店,但忍受着我。假设它大致使用下面的k/v API实现。每个键是一个主题,并且键的当前“值”被写入到该主题的最后一条消息:使用Apache Kafka作为关键/值存储的副作用是什么?

put(key, value) --> publish(topic=key, message=value) 
get(key) --> consume(topic=key, offset = last_offset - 1) 

此外,假设状态不同卡夫卡簇(使用MirrorMaker双向)之间进行复制,如允许用户读取/写入更近的数据中心以减少延迟。

我已经知道了一些这样的明显的副作用,例如:

  • 由于“键”映射到一个话题,你只能有1分,以保证订购(因为你想要最后一个值始终放在日志的末尾)。
  • 保留策略需要考虑,因为如果你认沽(键,值)离您最近的簇,尽管这在技术上是最近日志中的最后一条消息可以删除
  • 该键,MirrorMaker(由于等待时间)可以从另一组发布了过时的关键,覆盖最近的认沽值

这里的主要问题是延迟,尤其是不同集群之间。与传统的k/v解决方案(如Redis,memcached或etcd)相比,您认为这种解决方案在压力大的工作负载下(比如,对于给定的关键/主题,每秒写入数千次)以及网络条件压力大?

想法?

谢谢。

回答

1

卡夫卡可以作为KV事件存储的作品,实际上已经有实现的改进:https://cwiki.apache.org/confluence/display/KAFKA/KIP-67%3A+Queryable+state+for+Kafka+Streams

这里有一对夫妇提供如何使用卡夫卡流查询存储在卡夫卡的状态更多的例子链接: https://blog.codecentric.de/en/2017/03/interactive-queries-in-apache-kafka-streams/https://www.confluent.io/blog/unifying-stream-processing-and-interactive-queries-in-apache-kafka/

它使用RocksDB默认,但可插拔:https://www.confluent.io/blog/introducing-kafka-streams-stream-processing-made-simple/

你将不得不考虑如何管理在应用程序级别的存储,但本质上,您的问题是由卡夫卡流管理API。

希望这会有所帮助。