如何在Kafka中实现时间序列汇总?

时间:2019-04-06 15:33:02

标签: apache-kafka

我想用Kafka在公司内部分配高频金融市场价格。来自不同提供商的数据以每秒2000-3000的速率输入。消费者对最新点感兴趣,因为这是最新价格,但是,他们通常也对获取价格的<历史>历史感兴趣。

现在,高流动性系列(例如美元/欧元汇率(EURUSD))可能会导致每秒最多100条消息。当消费者想要历史数据时,他们想要一个 sampled 系列,而不是整个消息日志,因为那将是巨大的。例如,他们可能只希望每5分钟返回一次价格历史记录,例如10天,即,过去8600万滴答声(10天* 24小时* 3600)中,日志中的每30000条消息(100 * 60 * 5)仅秒* 100 /秒=日志中的8640万条消息)。

仅每30000个日志就解析整个10天的日志,这无疑将是一项非常昂贵的操作。显然,我可以让一个消费者这样做,然后每隔5分钟将其重新发布到另一个主题,但是现在我对同一个代码(EURUSD)有两个不同的主题,这又引入了一种“批处理与实时”架构。而且,我不想这么快用完空间。每秒存储100个滴答声实在太多了。同时,我也希望提供最新的价格,而不必运行两个主题。

如何解决?理想情况下,我希望随时发布实时价格,但是,当返回日志时,每5分钟左右就会收到一次历史消息。如果不进行昂贵的扫描,这是否可行/可行? Kafka是否可以推出未存储在日志中的消息(即丢失不大消息的消息),但是每5分钟存储其中之一?怎么办?

1 个答案:

答案 0 :(得分:2)

您可以使用offsetsForTime来获取所需分区的偏移量图并从中查找。据我所知,这是通过引入基于时间的索引(请参阅https://cwiki.apache.org/confluence/display/KAFKA/KIP-33+-+Add+a+time+based+log+index#KIP-33-Addatimebasedlogindex-Enforcetimebasedlogretention)而实现的,因此,我认为它在可能的范围内是有效的。

尽管如此,您不能告诉Kafka根据时间戳选择性地进行存储。如果要让一个主题只包含那些选定的消息,则应该重现为新主题