创建GCP发布/子主题的最佳实践(如果已经存在)



我们的应用程序有一个常见的用例,其中我们有长期存在的主题,这些主题可能跨越应用程序部署,但也可能不存在。

我们正试图使用提供的Java客户端在GCP pub/sub主题中找到该模式的最佳实践,在该客户端中我们可以创建IfNotExists或GetAndCreateIfNotExtists。

我们目前使用的实现是尝试创建一个Topic,如果它是AlreadyExistsException,则基本上会吞下异常。

@Override
public void createTopicIfNotExists(TopicName topicName) {
try {
this.topicAdminClient.createTopic(topicName);
} catch (AlreadyExistsException e) {
// topic already exists
} catch (Exception e) {
throw e;
}
}

我不认为这是理想的,因为他们基本上使用异常作为逻辑,这本质上是一种糟糕的做法。如果我们试图在主题不存在的情况下获取该主题,则客户端会抛出DoesNot exist异常,因此我们不能以其他方式执行。

我在github上看到过JS客户端能够在Get命令上自动创建的事情,有人知道这在java客户端中是否可用吗。

请参见此处:https://stackoverflow.com/a/38878368/5385625Java客户端中是否存在等效程序。

遗憾的是,此功能在java客户端库中不可用。您可以提交功能请求,因为这是一个潜在的有用功能!

我的建议是,在创建主题之前,可以执行getTopic((来检查主题是否存在,以防止出现异常。

getTopic()Java文档中的示例代码:

try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
TopicName topic = TopicName.ofProjectTopicName("[PROJECT]", "[TOPIC]");
Topic response = topicAdminClient.getTopic(topic.toString());
}

建议的方法是在getTopic上捕获NotFoundEception,以便知道何时已经存在主题。以这种方式处理异常是否有特别的问题?

相关内容

  • 没有找到相关文章

最新更新