Примеры использования LRA
Я пытаюсь сделать что-то в этом роде с Quarkus и Naryana:
- клиент вызывает службу, чтобы запустить процесс, который занимает некоторое время:
/lra/start
- Этот вызов запускает LRA и возвращает идентификатор LRA, используемый для отслеживания статуса действия.
- клиент может продолжать опрашивать некоторые конечные точки, чтобы определить статус
- служба в конечном итоге завершается и отмечает действие, выполненное через координатора
- клиент видит, что действие завершено, получает результат или делает другой запрос, чтобы получить этот результат
Является ли это допустимым вариантом использования? Я правильно представляю себе, как этот инструмент может работать? Судя по тому, как читается связанное руководство, кажется, что конечные точки — это скорее переход к координатору, уведомляющий его о том, что мы начинаем и заканчиваем LRA. Есть ли более программный способ взаимодействия с координатором?
1 ответ
Да, это может быть правильным вариантом использования, но в любом случае прочитайте спецификацию MicroProfile LRA — https://github.com/eclipse/microprofile-lra.
Идея, которую вы описываете, заключается в том, что более или менее один участник LRA выполняет новую LRA и опрашивает статус этого выполнения. Это не совсем то, для чего предназначен LRA, но, безусловно, его можно использовать таким образом.
Основная идея LRA заключается в составлении распределенных транзакций на основе шаблона саги. По сути, суть в том, чтобы координировать несколько сервисов для достижения согласованных результатов с возможной гарантией согласованности. Таким образом, вы видите, что основное преимущество возникает, когда вы можете распространять LRA через различные службы, которые либо все завершают свои действия, либо все их компенсационные обратные вызовы будут вызываться в случае сбоев (и, конечно, только для служб, которые выполнили свои действия в первое место). Вот также пример с распространением LRA https://github.com/xstefank/quarkus-lra-trip-example.
РЕДАКТИРОВАТЬ: извините, я забыл добавить программный API, который позволяет те же взаимодействия, что и аннотации - https://github.com/jbosstm/narayana/blob/master/rts/lra/client/src/main/java/io/narayana/lra/client/NarayanaLRAClient.java. Однако обратите внимание, что этого нет в спецификации и относится только к Нараяне.