Kafka Streams作为表补丁日志未满发布

时间:2019-07-11 21:00:12

标签: apache-kafka apache-kafka-streams ksql

所需功能:对于给定的密钥key123,许多服务并行运行并将其结果报告到一个位置,一旦收集了key123的所有结果,便将其传递给新的下游使用者。

原始思想:使用AWS DynamoDB保存给定条目的所有结果。每当结果准备就绪时,微服务都会对key123上的数据库执行PATCH操作。输出流检查每个UPDATE以查看条目是否完整,如果完成,则将其转发到下游。

新思路:使用Kafka Streams和KSQL可以达到相同的目标。所有服务将其输出写入结果主题,该主题形成更改日志Kstream,我们用KSQL查询已完成的条目。像这样:

CREATE STREAM competed_results FROM results_stream SELECT * WHERE (all results != NULL). 

我不确定该怎么做的部分是流上的PATCH操作。要使输出流显示key123的所有消息的累积,而不只是最近的消息?

KSQL用户,这是否有意义?我接近有人以前做过的解决方案吗?

1 个答案:

答案 0 :(得分:0)

如果您可以通过设置密钥来产生同一主题的所有事件,则可以使用ksqlDB中的聚合来收集特定密钥的所有事件,例如:

CREATE STREAM source (
    KEY INT KEY,  -- example key to group by
    EVENT STRING  -- example event to collect
  ) WITH (
   kafka_topic='source', -- or whatever your source topic is called.
   value_format='json' -- or whatever value format you need.
);

CREATE TABLE agg AS
  SELECT 
    key, 
    COLLECT_LIST(event) as events
  FROM source
  GROUP BY key;

这将默认创建一个名为AGG的变更日志主题。当收到有关源主题上特定键的新事件时,ksqlDB将产生到AGG主题的消息,该键设置为key,并且该值包含所有{{1}的列表}找到该键。

然后您可以将此更改日志作为流导入:

events

然后您可以应用一些条件来过滤流,使其仅包含最终结果:

CREATE STREAM agg_stream (
   KEY INT KEY,
   EVENTS ARRAY<STRING> 
) WITH (
   kafka_topic='AGG',
   value_format='json'
);

您甚至可能想要使用user-defined function来定义完整的条件:

STREAM competed_results AS 
  SELECT 
    * 
  FROM agg_stream 
  WHERE ARRAY_LEN(EVENTS) = 5; -- example 'complete' criteria.