在我的设置中,我有一个输入订阅消息将被推送到数据流作业读取。这些消息将转换为一个或多个输出消息,然后根据转换的成功发布到主题和错误主题。两个输出主题都存在于不同的项目中。
我的代码如下:
PCollectionTuple transformationOutput = p
.apply("ReadMessageFromInputTopic", PubsubIO.readMessagesWithAttributes().fromSubscription(options.getInputSubscriptionPath()))
.apply("CreatePubsubMessageWindow", Window.into(FixedWindows.of(Duration.standardMinutes(1))))
.apply("TransformMessageToGazelleInput", new Processor());
transformationOutput.get(PipelineTags.MESSAGE)
.apply("WriteMessageToSalesCategoryTopic", PubsubIO.writeMessages().to(options.getOutputTopicPath()));
transformationOutput.get(PipelineTags.ERROR)
.apply("WriteErrorToErrorTopic", PubsubIO.writeMessages().to(options.getErrorTopicPath()));
p.run();
当我将此代码提交给数据流(--runner = DataflowRunner)时,它将运行一段时间然后停止,而仍然存在根据pubsub stackdriver指标未确认的消息。使用gcloud检查时,似乎会从订阅中读取消息。每当我更新(重新提交--update)作业时,它将再次处理一些消息。
我在gcp ui中注意到的工作是系统滞后很高(多天),在我的理解中,这意味着有旧的消息没有被处理。
我的猜测是我对窗口函数做错了,因为这对我来说是最令人困惑的部分。我想知道如何确定使用哪种窗口函数。此订阅的消息数量在较长的时间段内变为0,在几个小时内变为每秒一小撮消息。
感谢任何帮助:)。