Kafka引入了应用程序设计原则

KIC*_*KIC 6 streaming apache-kafka

我想深入了解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)
Run Code Online (Sandbox Code Playgroud)

我甚至不确定使用今天的流处理是否可以使用这么复杂的用例.

A. *_*xxx 1

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

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

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

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

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

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