2010-03-22 6 views
1

У меня есть небольшой опыт работы с WCF и хотел бы получить Ваше мнение/предложение о том, как следующая проблема может быть решена:WCF для общего доступа к данным

Веб-сервис должен быть доступен для нескольких клиентов одновременно службе необходимо вернуть результат из общего набора данных. Конкретный проект, над которым я работаю, должен хранить список IP-адресов/диапазонов. Этот список будет запрашиваться группой веб-серверов для проверки, и мы говорим о нескольких тысячах или более запросов в минуту.

. Мой первоначальный проект подхода заключался в том, чтобы использовать службу Windows как хост WCF с классом реализации контракта на обслуживание, который украшен ServiceBehavior (экземпляр ContextMode = доступ к ней. Таким образом, в основном у меня есть один сингл WCF с списком = shared data -> multiple clients. То, что мне не нравится в этом, заключается в том, что уровни данных и коммуникации объединены в один, и производительность мудрая, что это не кажется «правильным».

Что я действительно на самом деле (- хочу, чтобы служба Windows запускала экземпляр списка IP-адресов, содержащего объект класса контейнера, вторую службу, выполняющую реализацию контракта WCF-сервиса, и способ, которым последний запрашивал первый в хорошем ключе с минимальной блокировкой. Использование другого канала WCF на самом деле не заставило бы меня подальше от первоначальной реализации проекта или было бы?

Какой подход вы бы взяли? Проект по-прежнему находится на очень ранней стадии, поэтому полное повторное проектирование не вызывает сомнений.

Все идеи оцениваются. Спасибо!

UPDATE: набор данных будет изменен динамически. У веб-службы будет отдельный метод добавления IP или IP-диапазона, а кроме того, запланированная задача будет инициировать очистку данных каждые 10-15 минут в соответствии с некоторыми правилами.

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

+0

Ожидаете ли вы, что список сильно изменится, или он будет довольно статичным? –

+0

Будет динамичным. Появились новые требования, поэтому я обновил вопрос. – Audrius

ответ

1

Это зависит от того, насколько далеко он должен масштабироваться. Если одного сервера хватит, то штраф; сохраните его удобно в памяти (если вы можете воссоздать данные, если сервер перезагружен). Если объем данных низкий, то простая блокировка (lock) должна работать нормально для синхронизации данных или для более высокой пропускной способности ReaderWriterLockSlim. Я бы, вероятно, не сохранил его напрямую в экземпляре класса WCF.

Я бы избегал всего, что связано с сессиями (если/когда это связано с жизненным циклом WCF); это редко полезно для простых сервисов.

Для распределенной нагрузки (на нескольких серверах) я бы рассмотрел отдельный выделенный сервер. База данных или memcached/AppFabric/etc заслуживает рассмотрения.

+0

На данный момент мы (вероятно) будем использовать MySQL с сервисом RESTful WCF. Тем не менее, как бы вы шли «не хранить его непосредственно в экземпляре класса WCF»? Создаете ли вы резервную службу для хранения данных и используете какую-то связь IPC? – Audrius

+0

Нет, я просто хочу сказать, что я не буду держать состояние в классе, который реализует службу WCF (и полагаться на WCF, чтобы поддерживать ее в живом состоянии). Почти в другом месте ... –

+0

И это моя самая большая головная боль - где ее сохранить (-. На мгновение наша команда собирается использовать MySQL именно для этого. Спасибо за ваше понимание Марк. – Audrius

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