Най-добра практика за създаване на GCP Pub/Sub Topics, ако може вече да съществуват

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

Опитваме се да намерим най-добрата практика за шаблона в GCP pub/sub теми, като използваме предоставения Java клиент, където можем да CreateIfNotExists или GetAndCreateIfNotExists.

Текущата реализация, която използваме, е да се опитаме да създадем тема и основно да погълнем изключението, ако то е 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/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
Не мисля, че това е използването на изключения като контролен поток по начините, които са толкова обезкуражени. Ако трябваше да направите тази логика в рамките на цикъл или като някакво средство за контрол в кода, изпълняван на съобщение, тогава да, няма да е добре. Ще искате да направите тази проверка/създаване на тази тема възможно най-рано във вашето приложение. Ако клиентската библиотека предложи autoCreate, тя ще направи точно това, което показвате. Този метод има свои собствени опасности, например, ако някой неправилно напише темата, тя просто ще създаде темата и вашите публикувани съобщения ще бъдат загубени, защото няма да има абонамент, свързан с тази тема. - person Kamal Aboul-Hosn; 15.07.2021