2017-08-08 71 views
6

我想与卡夫卡一起深入处理流处理,我需要一些帮助,让我的头部围绕一些目前不太清楚的设计原则。卡夫卡流应用程序设计负责人

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

2.)现在有不同的实时价格,我需要加入一个任意数量的一个大的记录。在例子中将所有sp500符号连接成一条记录。因为我在同一时间没有所有sp500符号的价格,但可能非常接近。如果在这个确切的时间里失踪,我怎样才能使用最新的价格加入他们?

3.)说我已经解决了加入用例,我将所有sp500股票的加入记录抽回卡夫卡。如果我犯了一个错误,并且我忘记了一个符号,我该怎么做?显然,我想将它添加到流中。现在我需要鞭挞“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) 

我甚至不知道,如果这样的使用今天的流处理可能会出现复杂的用例。

回答

1

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

1)你如何组织你的主题取决于你。你基本上都可以做,并且取决于你想要如何使用这些数据,以后两者都可能会有所帮助。在你的用例中,我会将价格写入一个主题。关键字应该像关系数据库中的主键一样选中。它保证了每个键发送的值的顺序,也可能用于保留。顺便说一句:你可以在一个应用程序中使用多个流/主题。

2)你想在这里使用的是所谓的“表/流二元性”。 (注意:我认为流式数据是无状态的,表格是statefull。)因此,从技术上讲,您可以从键构建映射(例如在内存中)到值(流中此键的最新值)。 Kafka Streams将为您提供KTable。卡夫卡本身也可以为您使用一个附加主题,其中保留配置为仅保留密钥的最新值。 一些不错的链接:

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

4)我不确定你在问什么,因为你的流量接缝对你的目标来说很好。卡夫卡和流处理是您的使用案例的完美搭配。

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