Вопрос по архитектуре сервера. (WCF+NServiceBus)

Прежде всего опишу текущее состояние:
Сервер состоит из нескольких WCF-сервисов, размещенных в одном или нескольких win-сервисах на разных машинах.

  1. Сервис, отвечающий за получение данных с разных устройств. Связь с устройствами реализована с помощью сокетов. Режим экземпляра службы - синглтон.
  2. Служба брокера данных — отвечает за сохранение данных и обмен ими по запросу. Режим экземпляра - синглтон.
  3. Служба конфигурации — отвечает за изменение базы данных конфигурации и работу с консолью администрирования (приложение WPF, например SSMS). Обрабатывает соединения с консоли, управление подписчиками и т. д. Режим экземпляра — singleton.
  4. Служба клиентского доступа - то же самое, что и выше для управления клиентами, но также уведомляет клиентов о новых данных и действует как фасад для служебной шины. И снова синглтон.
  5. Служба управления идентификацией — проверяет разрешения и возвращает результат. Синглтон.

Все эти сервисы связаны с NServiceBus, и мне очень нравится, как это работает на данный момент.

Но:
Слишком много синглетонов. В основном потому, что для использования служебной шины у меня должен быть один ее экземпляр. Я не знаю, может быть, я могу использовать шину nservice в режиме сеанса, но не знаю, как справиться с проблемой, что все эти службы будут использовать одну очередь.

А если у меня будет 300+ клиентов? синглтон может перестать отвечать..

И я хотел попросить некоторых критиков обо всем этом, и, может быть, кто-нибудь мог бы что-то предложить.

Заранее спасибо.
Алексей


person Aleksei Anufriev    schedule 18.12.2009    source источник


Ответы (1)


Алексей,

Хотя у вас должен быть только один экземпляр шины для каждого процесса, вы можете поместить этот экземпляр в глобально доступное место (как показано в примере AsyncPages) и использовать его из неодноэлементных объектов, таких как веб-страницы и службы WCF.

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

Надеюсь, это поможет.

person Udi Dahan    schedule 18.12.2009
comment
у каждого сервиса своя очередь. Рассмотрим пример асинхронных страниц. В идеале я хочу, чтобы службы, которые общаются с внешними клиентами, работали в режиме сеанса. Это было бы прекрасно. - person Aleksei Anufriev; 19.12.2009
comment
Посмотрел пример асинхронных страниц. это интересно. Итак, если я добавляю объект шины в сеансовый экземпляр службы, как я могу определить, что сообщение было предназначено для конкретного экземпляра? Например, у нас есть 2 подключенных клиента. У обоих есть свои сеансы. Затем они отправляют сообщения одного типа каждый. Как определить, какой экземпляр службы будет обрабатывать обратный вызов? - person Aleksei Anufriev; 19.12.2009
comment
› как я могу определить, что сообщение было адресовано конкретному экземпляру? Алексей, не знаю, о чем вы спрашиваете. Вы спрашиваете об обратном вызове WCF или обратном вызове NServiceBus? - person Udi Dahan; 19.12.2009
comment
служебный автобус callabck=) извините за мой плохой английский=) иногда трудно объяснить=) - person Aleksei Anufriev; 19.12.2009
comment
NServiceBus будет выполнять обратный вызов вызываемого экземпляра: Bus.Send(msg).Register(callback); - person Udi Dahan; 20.12.2009
comment
что, если 2 сеанса попытаются зарегистрировать обратные вызовы для одного и того же типа сообщения? - person Aleksei Anufriev; 21.12.2009