ksqlDB Push query聚合查询未输出所有变更如何解决
问题根因
ksqlDB默认开启了输出缓存与批量提交策略,用于减少下游系统的更新压力,默认会攒1-2秒的变更批量输出,因此不会每收到一条上游消息就立刻输出物化表的更新。你看到的消费lag为0只是说明上游数据已经被处理完成,不代表处理结果已经立刻输出到物化表对应的Kafka topic。
解决方法
要获取每一次变更的实时输出,调整两个核心配置即可:
- 禁用输出缓存
- 取消变更输出的最小间隔限制
操作步骤
如果是新建物化表,先在ksqlDB会话中执行以下配置语句,再执行建表语句:
-- 禁用输出缓存,不攒批量 SET 'cache.max.bytes.buffering' = '0'; -- 取消输出间隔限制,有变更立刻发出 SET 'ksql.query.emit.interval.ms' = '0';
之后再执行你原来的建表语句即可:
create table balance_table as select user, sum(balance_change) balance from balance_stream group by user emit changes;
如果是已经创建好的物化表,查询时需要获取实时全量更新,也只需在执行查询语句前,先在当前会话执行上面两个SET配置,再运行查询即可:
select * from balance_table emit changes;
如果需要全局永久生效,可将上述两个配置项添加到ksqlDB的服务启动配置文件中,重启后对所有查询生效。
验证
配置生效后,每收到一条上游topic的消息,物化表都会立刻输出对应键的更新记录,不再有1-2秒的延迟。
内容的提问来源于stack exchange,提问作者emte
相关产品推荐
相关产品推荐

