所需功能:对于给定的密钥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用户,这是否有意义?我接近有人以前做过的解决方案吗?
答案 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.