Распределенные транзакции с WCF - PullRequest
2 голосов
/ 13 марта 2009

Базовая архитектура: n физических боксов, в каждом из которых размещается один и тот же сервис WCF, который находится в начале балансировщика нагрузки. Каждый блок попадает в одну инфраструктуру базы данных, которая не поддерживает транзакции - не спрашивайте: (

Итак, на уровне доступа к данным моего приложения мне нужен какой-то метод распределенных транзакций. Какие у меня варианты?

Обратите внимание, что клиенты моей системы будут устаревшими приложениями, взаимодействующими с помощью основных веб-служб (BasicHttpBinding) и новыми блестящими клиентами WCF (NetTcpBinding или NetNamedPipeBinding).


Редактировать 1

например. на физическом блоке 1 будет один вызов на уровне WCF, например, EditEntity (...). Этот вызов вызовет 2 записи в базу данных. После первой записи другой клиент вызывает EditEntity (...) для того же объекта во втором экземпляре моей службы WCF во втором физическом блоке. На втором поле, как мне узнать, что транзакция для этого конкретного объекта уже находится в игре?

Спасибо.

1 Ответ

2 голосов
/ 13 марта 2009

Не уверен, что вы дали нам достаточно, чтобы продолжить, но если я правильно читаю, вы пытаетесь убедиться, что можете поддержать транзакцию через службу WCF? Хотя ваша БД не поддерживает транзакции, а конечные точки WCF находятся за балансировщиком нагрузки? Я правильно понял? Если так ....

Поскольку ваша БД не имеет поддержки транзакций, она переходит на ваш уровень WCF. Это говорит о грубом уровне детализации ваших методов, так что вы можете гарантировать, что один вызов вашей службы WCF в достаточной степени охватит вашу транзакцию. Не распределяйте транзакции по нескольким вызовам WCF, вам нужны проблемы.


ОБНОВЛЕНИЕ: Существуют стратегии, которые можно использовать с балансировщиками нагрузки, которые обеспечивают постоянство соединений, но здесь вам это не поможет. Если вы вызываете EditEntity () последовательно, и первая запись должна инициировать транзакцию, а вторая запись должна завершить транзакцию ... тогда ваша служба недостаточно детализирована.

Объедините эти два вызова в один метод, т. Е. EditEntityComplete ().

Есть ли причина, по которой вы не можете создать один метод, а не два?


ОБНОВЛЕНИЕ № 2: Перефразируя проблему - один метод выполняет записи в базе данных, которая не поддерживает транзакции. Рассматриваемый метод выполняет серию шагов, которые должны быть выполнены по порядку. Метод WCF предоставляет возможность конкуренции за параллелизм нарушить завершение шага в правильном порядке.

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


ЗАКЛЮЧИТЕЛЬНОЕ ПЕРЕСМОТРЕНИЕ:

Пересмотреть требование не менять хранилище данных.

Учитывая требования к нескольким клиентам, необходимость масштабирования, балансировки нагрузки и поддержки транзакций в хранилище данных, последнее предложение - подтолкнуть к изменению базы данных. Понимание этого является статическим требованием, но вы потратите немало усилий, пытаясь реализовать поддержку транзакций, когда множество простых платформ баз данных предоставят ее вам. Попытка воссоздать эту функциональность имеет небольшой плюс, но много недостатков.

...