Вопросы разработки SOA и WCF: это необычный дизайн системы? - PullRequest
6 голосов
/ 17 февраля 2010

Я взял на себя ответственность за разработку системы, которую я изначально не проектировал, и не могу спросить оригинальных дизайнеров, почему были приняты определенные дизайнерские решения, поскольку их больше нет. Я - младший разработчик по вопросам дизайна, поэтому не знал, о чем спрашивать, когда начинал проект, который был моим первым проектом SOA / WCF.

В системе имеется 7 служб WCF, число которых возрастет до 9, каждая из которых будет размещаться в отдельной консольной службе app / windows. Все они единичные и однопоточные. Все сервисы имеют одинаковый OperationContract: они предоставляют методы Register () и Send (). Когда клиентские службы хотят подключиться к другой службе, они сначала вызывают Register (), а затем, в случае успеха, all оставшуюся часть своей связи с Send (). У нас есть DataContract, который имеет перечисление MessageType и свойство Content, которое может содержать другие «полезные нагрузки» DataContract. То, что служба делает с сообщением, определяется перечислением MessageType ... все происходит через метод Send (), а затем перенаправляется на оператор switch ... Я подозреваю, что это необычно

Register () и Send () на самом деле являются OneWay и Async ... ВСЕ результаты сервисов возвращаются клиентским сервисам посредством CallbackContract WCF. Я считаю, что резонанс использования CallbackContracts заключается в том, чтобы облегчить используемую нами модель публикации-подписки. Проблема не в том, что все наше общение подходит для публикации-подписки, и использование CallbackContracts означает, что мы должны включить сведения об источнике в возвращаемые сообщения о результатах, чтобы клиенты могли выяснить, для чего были возвращены результаты ... опять же, у клиентов есть операторы switch для работы что делать с сообщениями, поступающими от служб на основе MessageType (и других встроенных данных).

С точки зрения топологии: сервисы образуют «узлы» в графе. Каждая служба жестко закодировала список других служб, к которым она должна подключиться при запуске, и не позволит клиентским службам «регистрироваться» с ней до тех пор, пока она не выполнит все необходимые ей подключения. Например, у нас есть LoggingService и DataAccessService. DataAccessSevice является клиентом LoggingService, поэтому служба DataAccess будет пытаться зарегистрироваться в LoggingService при запуске. До тех пор, пока он не сможет успешно зарегистрироваться, служба DataAccess не позволит ни одному клиенту зарегистрироваться на нем. В результате, когда система запускается в целом, службы запускаются каскадно. Я не вижу в этом проблемы, но разве это необычно?

Чтобы сделать вопросы более сложными, одно из системных требований заключается в том, что службы или «узлы» не должны быть непосредственно зарегистрированы друг для друга, чтобы отправлять сообщения друг другу, но могут общаться через косвенные ссылки. Например, скажем, у нас есть 3 службы A, B и C, соединенные в цепочку, A может отправить сообщение C через B ..., используя 2 прыжка.

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

До этого проекта я только 3 года работал над настольными приложениями winforms, лучше не знал. У меня есть подозрения, что этот проект слишком усложнен: подведу итог, мои вопросы:

1) Является ли эта идея топологии графа с сообщениями, пересекающими косвенные ссылки, необычной? Почему бы просто не подключить сервисы напрямую к сервисам, к которым им нужен доступ (что на самом деле и есть то, что мы делаем в любом случае ... Я не думаю, что у нас есть какие-либо сообщения)) *

2) Необычно ли выставить в OperationContract только 2 метода и использовать перечисление MessageType, чтобы определить, для чего предназначено сообщение / что с ним делать? Разве служба WCF не должна предоставлять множество методов с конкретными целями, а клиент выбирает, какие методы он хочет вызвать?

3) Осуществляет все общение с клиентом через CallbackContracts. Конечно, синхронизация или асинхронный запрос-ответ проще.

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

У меня так много вопросов о WCF, что они будут обсуждаться позже. Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 17 февраля 2010

Ну, все кажется немного странным, согласился.

Все они единичные и однопоточный.

Это определенно вернется и вызовет огромные головные боли производительности - гарантировано. Я не понимаю, почему кто-то хотел бы сначала написать одноэлементную службу WCF (за исключением нескольких крайних случаев, где это имеет смысл), и если у вас есть одноэлементная служба WCF, чтобы получить приличную производительность, должно быть многопоточным (что является сложным программированием, и поэтому я почти всегда советую против этого).

Все сервисы одинаковы OperationContract: они выставляют Метод Register () и Send ().

Это тоже довольно странно. Поэтому любой вызывающий сначала будет .Register (), а затем несколько раз вызовет .Send () с разными параметрами ?? Действительно забавный дизайн ... Предположение SOA состоит в том, что вы проектируете свои сервисы как модель набора функций, которые вы хотите показать внешнему миру, например, ваш CustomerService может иметь такие методы, как GetCustomerByID, GetAllCustomersByCountry и т. д. - в зависимости от того, что вам нужно.

Наличие только одного метода Send () с параметрами, которые определяют, что делается, кажется немного… необычным и не очень интуитивным / понятным.

Является ли эта идея топологии графа сообщения, перепрыгивающие через косвенные ссылки необычно?

Не обязательно. Может иметь смысл выставить только один интерфейс для внешнего мира, а затем использовать некоторые внутренние внутренние службы для выполнения реальной работы. .NET 4 на самом деле представляет RoutingService в WCF , который упрощает подобные сценарии. Я не думаю, что это большое нет-нет.

выполняет все коммуникации обратно к необычный клиент через CallbackContracts.

Да, необычный, хрупкий, грязный - если вы когда-либо можете обойтись без него - пойти на это. Если у вас есть в основном простые вызовы, такие как GetCustomerByID - сделайте их стандартным вызовом Запрос / Ответ - клиент запрашивает что-то (предоставив идентификатор клиента) и возвращает объект Customer в качестве возвращаемого значения. Гораздо проще!

Если у вас есть длительные вызовы службы, выполнение которых может занять несколько минут или больше - тогда вы можете рассмотреть возможность односторонних вызовов, которые просто помещают запрос в очередь, и этот запрос обрабатывается позже. Как правило, здесь вы можете либо поместить ответ в очередь ответов, которую затем проверяет клиент, либо у вас может быть два дополнительных сервисных метода, которые сообщают вам статус запроса (это уже сделано?), И второй метод для получения запроса. результат (ы) этого запроса.

Надеюсь, это поможет вам начать!

5 голосов
/ 17 февраля 2010

Все службы имеют один и тот же OperationContract: они предоставляют методы Register () и Send ().

Ваш дизайн кажется необычным в некоторых частях, специально выставляя только две операции. Я не работал с WCF, мы используем Java. Но, исходя из моего понимания, вся цель веб-сервисов состоит в том, чтобы показать операции, которые могут использовать ваши партнеры.
Наличие только двух операций выглядит для меня странным дизайном. Вы обычно выставляете свой API, используя WSDL. В этом случае WSDL не добавит партнерам ничего ценного, если у вас нет много документации. Как правило, название операции должно быть самоочевидным. Прямо сейчас ваша система не может использоваться партнерами без внутренних знаний.

Осуществляет ли все обратное общение с клиентом через CallbackContracts необычно. Конечно, синхронизация или асинхронный запрос-ответ проще.

Согласен с вами. Асинхронизация должна использоваться только для длительных процессов. Async добавляет издержки корреляции.

...