Хорошее решение С#.NET для управления частым опросом базы данных

В настоящее время я работаю над настольным приложением С#.NET, которое будет связываться с базой данных через Интернет через службы WCF и WCF. В приложении будет много точек, которые могут потребоваться обновить с некоторым интервалом. Самое простое решение - просто поместить эти области в таймер и запросить базу данных. Однако, когда тысячи клиентов подключаются к уровню обслуживания и, следовательно, к базе данных, эти операции будут очень дорогими для сервера.

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

Я также рассмотрел возможность создания прямого и непрерывного соединения от клиента к серверу, но я не уверен, какие исходящие порты брандмауэра будут открыты от клиента. Вероятно, я мог рассчитывать только на порт 80/443.

Итак, мой вопрос в том, какие решения у людей были успешными, чтобы решить эту проблему? Есть ли у людей RSS? Службы Microsoft Sync? Двусторонняя связь между клиентом и сервером через некоторый порт сохранения через WCF?

Любые идеи приветствуются.

Ответ 1

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

Новая технология, которая хорошо справляется с вышеуказанным предложением в ASP.NET, SignalR. Это обрабатывает большую часть деталей длинного опроса (или использует WebSockets, когда это возможно), поэтому вам не нужно беспокоиться об этом.

Во-вторых, на основе тегов в этом вопросе похоже, что вы используете SQL Server. Вы можете использовать уведомления о базе данных в интересующих вас таблицах, чтобы БД уведомила вашу службу о произошедших изменениях. Это может привести к тому, что служба сообщит клиенту об изменениях через длинные сеансы опроса. Вы можете сделать это, используя класс SqlDependency.

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

Ответ 2

вы можете определить интерфейс обратного вызова в соединении WCF следующим образом:

[ServiceContract(CallbackContract = typeof(IFooClient))]

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

IFooClient client = OperationContext.Current.GetCallbackChannel<IFooClient>();

и обратный вызов всех клиентов, зарегистрированных при изменении данных.

Ответ 3

Если дорогостоящая операция - это сервер для объединения базы данных, вы должны реализовать какое-то кэширование. Он может быть базовым как кэширование ASP.NET или расширенным с использованием memcached.

Но если дорогостоящей операцией является клиентский пул сервера, вы можете использовать Atom или RSS-канал с PubSubHubbub для минимизации количества запросов на сервер. Это будет дешевле, так как есть некоторые бесплатные издатели PubSubHubbub, которые будут обрабатывать нагрузку.

Ответ 4

Вы можете посмотреть Service Broker, так что вам не нужно будет опроса для обновлений

Ответ 5

Я не знаю, почему RSS будет проще, чем информация о кеше веб-сервисов из базы данных.

Чтобы сравнить 2 варианта, скажем, вам нужно знать, кто редактировал объект в последнем отчете (или последний раз он был обновлен и т.д.). С помощью RSS-канала вам нужно будет подать заявку на канал, получить его, проанализировать и принять меры на основе соответствующих значений. С вызовом веб-службы, который memoizes и кэширует его вызов базы данных, вы просто вызываете службу и принимаете меры в отношении результата. Единственный раз, когда я мог видеть, что RSS лучше: 1) Вы поддерживаете несколько клиентов, которые вы либо не контролируете, либо не используете .Net-клиенты и 2) Вы принимаете меры на основе множества опрошенных значений одновременно.