apache-kafka - Kafka Streams 应用程序设计原则

标签 apache-kafka streaming

我想深入研究 Kafka 的流处理,我需要一些帮助来了解一些目前我不太清楚的设计原则。

1.) 假设我有一些实时股价数据。你会让一个主题“价格”以股票代码为键(并因此划分)吗?或者你会为每个符号制作一个主题吗?例如,如果我决定稍后生成(添加)更多股票代码,包括完整历史记录,会发生什么?现在我在“价格”主题中的历史记录(在日志中排序)是一团糟,对吧?另一方面,对于每个价格系列,我想稍后计算返回,如果它们涉及不同的主题,我必须跟踪它们并为每个符号启动新的流应用程序。

2.) 现在有不同的实时价格,我需要将任意数量的价格加入一个大记录。在示例中将所有 sp500 符号连接到一个记录中。因为我没有同时提供所有 sp500 符号的价格,但可能非常接近。如果在这个确切的时间缺少一个,我怎么能总是使用最新的价格加入他们?

3.) 说我已经解决了连接用例,并且我将所有 sp500 股票的连接记录泵回了 Kafka。如果我犯了一个错误并且忘记了一个符号,我该怎么办?显然,我想将它添加到流中。现在我有点需要鞭打“sp500”日志并重建它,对吗?或者是否有某种机制可以将起始偏移量重置为特定偏移量(我已修复连接的偏移量)?也很可能我有其他流应用程序正在使用这个主题。他们还需要进行某种重置/重播。不存储 sp500 主题而是使其成为长流过程的一部分可能是更好的主意吗?但随后我可能会多次进行相同的连接。

4.) 也许这应该是 1. 因为这是我目标的一部分 ^^ - 但是,我怎么能像这样对数据流进行建模:

produce prices -> calculate returns -> join several returns into a row vector -> calculate covariance (window of rowvectors) -> join covariance with returns  
                                                                               ->                                             -> into a tuple (ret, cov)

我什至不确定使用今天的流处理是否可以实现如此复杂的用例。

最佳答案

使用 Kafka 时,我将消息视为键/值对,存储在分布式、持久化和复制的主题中,作为无休止的数据流发送。该主题可以针对不同的保留时间和保留/(清理)方法进行配置。

1) 如何组织主题取决于您。您基本上可以同时执行这两种操作,这取决于您以后想要如何使用数据,两者都可能有意义。在您的用例中,我会将价格写入一个主题。应该像关系数据库中的主键一样选择键。它保证每个键发送的值的顺序,也可能用于保留。
顺便说一句:您可以在一个应用程序中使用多个流/主题。

2)你想在这里使用的是所谓的“表/流二元性”。 (旁注:我认为流数据是无状态的,而表是有状态的。)因此,从技术上讲,您构建了从键到值(流中该键的最新值)的映射(例如在内存中)。 Kafka Streams 将使用 KTable 为您做到这一点。 Kafka 本身也可以使用附加主题为您执行此操作,该主题将保留配置为仅保留 key 的最新值。
一些不错的链接:

  • Confluent: Introducing Kafka Streams: Stream Processing Made Simple
  • Confluent docu: Kafka Stream concepts: duality of streams and tables

  • 3) Kafka 主题中的消息是根据您的保留配置存储的。所以你可以配置它,例如将所有数据存储 7 天。如果您想稍后添加数据但使用其他时间,那么它的生产时间您需要发送一个时间作为消息数据的一部分,并在以后处理它时使用这个时间。对于每个消费者,您可以设置/重置应该开始读取的偏移量。这意味着您可以返回并重新处理仍在您的主题中的所有数据。

    4)我不确定您要什么,因为您的流程接缝适合您的目标。 Kafka 和流处理非常适合您的用例。

    一般来说,我可以推荐阅读 Confluent 博客、Confluent 文档以及 Kafka 网站上的所有内容。您的很多问题取决于您的要求、硬件以及您想在软件中做什么,因此即使有给定的信息,我也需要说“这取决于”。我希望这可以帮助你和其他人从 Kafka 开始,即使它只是快速尝试解释这个概念并提供一些链接作为起点。

    关于apache-kafka - Kafka Streams 应用程序设计原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45562495/

    相关文章:

    Scala 和 Play : stream files to S3 using iteratees

    python - 您可以使用 ffmpeg 流从文件实时插入文本吗?

    docker - 如何创建kafka v0.11的docker镜像

    kotlin - KafkaStreams : Getting Window Final Results

    scala - 如何将 Spark Structured Streaming 与 Kafka Direct Stream 一起使用?

    java - NanoHttpd 服务器无法在 android 上流式传输大型视频

    android - 如何在 android 中的 videoview url 中播放 RTMP 直播

    apache-kafka - 如何在单个 kafka 主题的所有分区中写入相同的消息?

    java - 卡夫卡 : Bounded Batch Processing in Parallel

    google-chrome - Mp4下载导致浏览器播放文件而不是下载