【发布时间】:2021-02-20 21:57:12
【问题描述】:
我正在尝试使用同步 PULL API 来使用 Google PubSub 消息。这在 Apache Beam Google PubSub IO 连接器库中可用。 我想使用 KafkaIO 将消费的消息写入 Kafka。我想使用 FlinkRunner 来执行作业,因为我们在 GCP 之外运行这个应用程序。
我面临的问题是消费的消息没有在 GCP PubSub 中得到确认。我已经确认本地 Kafka 实例具有从 GCP PubSub 消耗的消息。 GCP DataFlow 中的文档表明,当管道使用数据接收器(在我的例子中是 Kafka)终止时,数据包得到最终确定。
但由于代码是在 Apache Flink 而不是 GCP DataFlow 中运行的,我认为某种回调不会被触发与确认提交的消息相关。
我在这里做错了什么?
pipeline
.apply("Read GCP PubSub Messages", PubsubIO.readStrings()
.fromSubscription(subscription)
)
.apply(ParseJsons.of(User.class))
.setCoder(SerializableCoder.of(User.class))
.apply("Filter-1", ParDo.of(new FilterTextFn()))
.apply(AsJsons.of(User.class).withMapper(new ObjectMapper()))
.apply("Write to Local Kafka",
KafkaIO.<Void,String>write()
.withBootstrapServers("127.0.0.1:9092,127.0.0.1:9093,127.0.0.1:9094")
.withTopic("test-topic")
.withValueSerializer((StringSerializer.class))
.values()
);
【问题讨论】:
-
你是如何验证消息没有被确认的?
-
在 google pubsub 控制台中,它显示了该订阅的未确认消息的图表。
-
您是否以流模式处理消息?
-
是的。我们使用 Google GCP pubsub Java 客户端使用同步 Pull API 来消费数据,该 API 具有内置的轮询机制,每个请求以 1000 条消息为单位批量消费数据,然后通过构建器管道顺序处理这些消息。
-
如果某处有显式标志来区分批处理/拉取 API。我不知道。
标签: google-cloud-platform apache-flink apache-beam google-cloud-pubsub apache-beam-kafkaio