2013-03-26 3 views
2

Мне было интересно, могу ли я получить некоторые идеи о том, как справиться с проблемой дизайна, с которой я столкнулся. Для простоты предположим, что у меня есть 3 конечных точки, работающих на 3 разных машинах/jvms на Tomcat. Концы имеют следующие обязанности:Распределенные транзакции Java JMS

конечной точка 1 - принимают в данном спросе и преобразует эти данные в порядок запрашивает

Endpoint 2 - принимает в запросах заказа, сохраняет порядок и возвращает приказ

Endpoint 3 - принимает заказ, форматирует в конкретный xml поставщика и отправляет его в очередь.

Редактировать: Эти конечные точки существуют как текущие службы для других клиентов через REST. У меня есть возможность использовать Atomikos для JTA Transaction Manager, и мы используем ActiveMQ.

С учетом этого у меня есть настройка очереди, которая получает сообщения данных о требованиях. Для каждого принятого сообщения данных запроса я, по сути, хочу погрузить их через каждую из трех конечных точек в одну единицу работы через XA. Я полностью контролирую каждую из трех конечных точек, поэтому у меня есть определенная гибкость в отношении того, какие протоколы связи они могут использовать. Кроме того, в конечном итоге на ежедневной основе поступит около 500 тыс. До 1 млн. Сообщений. Какой протокол связи вы бы использовали, чтобы связать эти конечные точки вместе в распределенной транзакции?

У меня есть опыт работы с Camel, но я получаю то, как связать их вместе в одной единице работы. Будет ли RMI более уместным, чем JMS, поскольку это кажется синхронным по своей природе? Спасибо заранее за любую помощь, которая предоставляется.

+0

Как долго длится эти транзакции? И как часто их нужно будет отбросить назад? – flup

+0

С моей точки зрения, нет смысла говорить, с одной стороны, я хочу разделить вещи и принять асинхронный подход по причине разладов, а с другой стороны, я хочу связать их высоко, заявив, что шаг 1 является успешным только в том случае, если шаг 3 успешный. И вы должны знать, что длительные транзакции повреждают пропускную способность такой системы. Итак, к вашему последнему вопросу: ДА, синхронный протокол, такой как RMI или WebServices с одним контроллером, облегчит вашу работу и поможет сохранить короткие трансляции, поскольку они синхронизированы хорошо. –

+0

@Sir RotN, Спасибо за ответ и идеи. Несмотря на то, что я пытаюсь объединить эти конечные точки вместе в одну транзакцию, эти конечные точки в настоящее время существуют как службы для других клиентов. У них есть интерфейсы служб REST, которые могут использовать пользовательские интерфейсы. – kdye43

ответ

2

От the Apache Camel documentation в fusesource:

Распределенные транзакции Распределенная транзакция относится к транзакции в распределенной системе, в которой объем транзакций охватывает несколько узлов сети. Основным предварительным условием для поддержки распределенных транзакций является сетевой протокол, который поддерживает передачу контекстов транзакций в каноническом формате (см. Также «Распределенные менеджеры транзакций»). Распределенная транзакция выходит за рамки транзакций Apache Camel.

Распределенные менеджеры транзакций Обычно сервер подключается непосредственно к ресурсам, участвующих в сделке. Однако в распределенной системе иногда необходимо подключаться к ресурсам, которые отображаются только косвенно, через веб-службу или через интерфейс CORBA IDL. В этом случае вам нужен монитор TP, способный поддерживать распределенные транзакции. Существует несколько стандартов, которые описывают, как поддерживать транзакции для различных распределенных протоколов - например, спецификацию WS-AtomicTransactions для веб-служб и спецификацию службы транзакций объектов CORBA (OTS) для приложений CORBA.

Так что неудивительно, что вы попадаете. Apache Camel не распространяется на ваш прецедент.

Я думаю, вы можете пойти двумя путями:

  1. большой распределенной транзакции
  2. скоординированные мелкие сделки с компенсирующими действиями

JTA в котом JTA является глобальным менеджером транзакций. Вероятно, вам это нужно в обоих решениях. (Хотя с некоторой умной игрой вы можете просто обойтись без, если вы идете на вариант номер два.) Tomcat не может запускать транзакции JTA, но с помощью оператора транзакций он может это сделать. См. Atomikos vs JOTM vs Bitronix vs?. Добавление Spring JtaTransactionManager поможет упростить настройку. Не все реализации JMS поддерживают JTA/являются ресурсами XA. Вам нужно будет проверить, действительно ли это.

Распределенная транзакция Продолжительность ваших сделок не очень долго, но вы тем не менее, будете держать ресурсы запертых на некоторое время, и у вас есть много сделок. Производительность будет повреждена.

JTA построен на JTS и OTS. Сервер JTA должен иметь возможность координировать транзакции с другими серверами JTA через OTS. Это не так просто, чтобы начать с того, что вам нужно найти реализацию, которая ее поддерживает. И тогда вам нужно выяснить, как его запустить и запустить.

На более высоком уровне у вас есть WS-транзакции и WS-координация. См. the metro guide.

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

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

Если вы можете пойти сюда вообще, я возьму его.

+0

Я не уверен, смею ли я называть это ответом, но, по крайней мере, это больше, чем комментарий, так вот. Я понимаю, что ваш реальный вопрос заключается в том, как настроить распределенный диспетчер транзакций, который не отвечает на это. Я надеюсь, что это уточнит вопрос и предложит альтернативный путь. – flup

+0

Спасибо за очень подробный ответ. Я забыл упомянуть, что я пытался использовать Atomikos в качестве менеджера транзакций JTA с Camel. Пожалуйста, кроме моих извинений. Я обновил вопрос, чтобы отразить это. Что касается компенсации транзакций, то проблема, которую я имею с этим подходом, - это то, что кто-то действует на изменение, которое вы делаете на данные, и сразу после его возврата. Или что, если вы отправили сообщение jms, а следующий шаг процесса вызывает ошибку? Как бы вы отменили сообщение jms. С учетом сказанного мне, вероятно, придется правильно использовать WS или CORBA? – kdye43

+0

Ну, возьмите конечную точку два. Вы создаете заказ в базе данных. Вы двигаетесь дальше. Позже в процессе вы узнаете, что заказ не должен обрабатываться, потому что у клиента недостаточно кредитов. Вы не можете отменить заказ, так как транзакция не открыта. Но вы можете отменить его. Если другие уже действуют, они тоже отменяют свои действия. Если это нехорошо, происходит слишком часто и слишком дорого, создайте заказ в качестве заказа. Когда вы будете готовы совершить совершение, сделайте еще один вызов для конечной точки два. На этот раз подтвердить бронирование. – flup

Смежные вопросы