我有以下应用程序运行数据管道并侦听Google pubsub:
配置:
<dependency>
<groupId>org.apache.beam</groupId>
<artifactId>beam-sdks-java-core</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.beam</groupId>
<artifactId>beam-runners-google-cloud-dataflow-java</artifactId>
<version>2.0.0</version>
</dependency>
代码:
Pipeline p = //Initialise pipeline
p.apply("read messages", readMessage())
.apply("log message", logMessage())
private static PubsubIO.Read<String> readMessage() {
return PubsubIO.readStrings()
.fromSubscription("my_subscription");
}
//Log message just logs the message
我遇到了一个问题,即消息被间歇性地丢弃(即它们没有从pubsub进入数据流管道)。为了调试,我写了另一个应用程序并使它听同一个pubsub。以下是配置:
配置:
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-pubsub</artifactId>
<version>0.22.0-beta</version>
</dependency>
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-pubsub</artifactId>
<version>v1-rev358-1.22.0</version>
</dependency>
代码:
@Component
public class PubsubMessageReceiver implements MessageReceiver{
private static Logger logger = LoggerFactory.getLogger(PubsubMessageReceiver.class);
@Override
public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
logger.info(message.getData().toStringUtf8());
consumer.ack();
}
}
我让它运行了几个小时(通过创建一个新的订阅来监听与原始应用程序相同的主题),检查日志文件并找到一些没有进入数据流管道的消息。
现在,这是间歇性的,我无法重现它(即使进行负载测试)。这与谷歌的光束库(看起来像竞争条件或类似情况)有什么关系吗?如果是,有人知道是否可以通过更改配置/更新版本来解决这个问题吗?