Нужна помощь с дизайном WCF - PullRequest
0 голосов
/ 20 мая 2010

Мне было поручено создать набор веб-сервисов.Мы магазин Microsoft, поэтому я буду использовать WCF для этого проекта.Есть интересное дизайнерское соображение, для которого я пока не смог найти решение.Я попытаюсь объяснить это на примере:

Мой сервис WCF предоставляет метод с именем Foo ().

10 разных пользователей вызывают Foo () примерно в одно и то же время.

У меня есть 5 специальных ресурсов, которые называются R1, R2, R3, R4 и R5.Нам не нужно знать, что это за ресурс, кроме того факта, что конкретный ресурс может использоваться только одним вызывающим абонентом за раз.

Foo () отвечает за выполнение действия с использованием одногоиз этих специальных ресурсов.Таким образом, в циклическом порядке Foo () необходимо найти ресурс, который не используется.Если нет доступных ресурсов, он должен ждать освобождения одного.

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

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

Будем весьма благодарны за любые идеи архитекторов!

Ответы [ 3 ]

3 голосов
/ 20 мая 2010

Создайте еще один центральный сервис, о котором знают только веб-сервисы. Эта служба берет на себя роль менеджера ресурсов.

Все веб-службы в ферме будут связываться с этой центральной службой для запроса доступности ресурсов и для «извлечения» и «проверки» ресурсов.

0 голосов
/ 21 мая 2010

Существует множество подходов к решению этой проблемы, каждый из которых имеет свои издержки и выгоды. Например:

  • Используя MSMQ для постановки всех запросов в очередь, рабочие процессы извлекают сообщения из очереди, передают в Rn и отправляют ответы обратно в очередь ответов для Foo для отправки обратно соответствующему вызывающему.
  • Использование диспетчера сообщений в оперативной памяти или локально сохраняемого сообщения для отправки следующего запроса в службу on-box (например, через Named Pipes для perf) на основе некоторого алгоритма распределения по вашему выбору.

и т.д.

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

Какое бы решение вы ни выбрали, я настоятельно рекомендую вам разделить ваш вызов Foo () на пару RequestFoo () и GetFooResponse () или реализовать обратный вызов WCF, размещаемый вызывающим абонентом, для получения результатов асинхронно.

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

0 голосов
/ 20 мая 2010

Вы можете отслеживать использование ресурсов в таблице базы данных, к которой могут получить доступ все серверы в ферме.

Каждый ресурс будет иметь запись в базе данных, с полями, указывающими, используется ли он (или с какого времени). Вы также можете использовать функцию тайм-аута.

В целях устранения неполадок вы также можете записать, кто использует ресурс.

Если вы записываете, когда каждый ресурс используется (в другой таблице), вы сможете проверить, работает ли ваш циклический перебор, как вы ожидаете, решить, следует ли вам добавить больше копий ресурса и т. Д. *

...