Рекомендации по созданию тем GCP Pub/Sub, если они уже существуют

у нас есть общий вариант использования для наших приложений, где мы давно живем. Темы, которые могут охватывать развертывание приложений, но могут и не существовать.

Мы пытаемся найти наилучшую практику для шаблона в темах публикации/подписки GCP, используя предоставленный клиент Java, где мы можем CreateIfNotExists или GetAndCreateIfNotExists.

Текущая реализация, которую мы используем, заключается в попытке создать тему и, по сути, проглотить исключение, если это уже ExistsException.

@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/5385625 Есть ли эквивалент в клиенте Java.


person Sam Orozco    schedule 13.07.2021    source источник


Ответы (2)


К сожалению, эта функция недоступна в клиентской библиотеке Java. Вы можете отправить запрос функции, так как это потенциально полезно особенность!

Что я мог бы предложить, так это то, что перед созданием темы вы можете выполнить getTopic(), чтобы проверить, существует ли тема, чтобы избежать исключений.

Пример кода из getTopic() документации по Java:

 try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
   TopicName topic = TopicName.ofProjectTopicName("[PROJECT]", "[TOPIC]");
   Topic response = topicAdminClient.getTopic(topic.toString());
 }
person Ricco D    schedule 14.07.2021
comment
Если тема не существует, то getTopic выдаст исключение, верно? - person Sam Orozco; 14.07.2021
comment
Клиент выдаст исключение, если тема не будет найдена. Caused by: io.grpc.StatusRuntimeException: NOT_FOUND: Resource not found - person Sam Orozco; 14.07.2021

Рекомендуемый подход состоит в том, чтобы поймать NotFoundEception на getTopic, чтобы узнать, когда тема уже существует. Есть ли у вас особая проблема с обработкой исключения таким образом?

person Samarth Singal    schedule 14.07.2021
comment
Где вы берете это руководство? Я предполагаю, что использование исключений таким образом кажется мне неправильным из-за старой поговорки: не используйте исключения в качестве потока управления. Но, в конце концов, это не имеет большого значения, и пока меня это устраивает. - person Sam Orozco; 14.07.2021
comment
Я не думаю, что это использование исключений в качестве потока управления способами, которые так обескураживают. Если бы вы выполняли эту логику в цикле или как средство управления кодом, выполняемым для каждого сообщения, то да, это было бы нехорошо. Вы захотите сделать эту проверку/создание этой темы как можно раньше в своем приложении. Если бы клиентская библиотека предлагала автоматическое создание, она делала бы именно то, что вы показываете. У этого метода есть свои опасности, например, если кто-то неправильно напишет тему, он просто создаст тему, и ваши опубликованные сообщения будут потеряны, потому что к этой теме не будет привязана подписка. - person Kamal Aboul-Hosn; 15.07.2021