Kafka流程应用程序设计原则

时间:2017-08-08 07:56:32

标签: 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)

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

1 个答案:

答案 0 :(得分:1)

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

1)您如何组织主题取决于您自己。您可以基本上完​​成这两项工作,具体取决于您以后如何使用这些数据,两者都可能有所帮助。在您的用例中,我会将价格写入一个主题。密钥应该像关系数据库中的主键一样被选中。它保证每个密钥发送的值的顺序,也可以用于保留。 顺便说一句:您可以在一个应用程序中使用多个流/主题。

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

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

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

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