дизайн интерфейса веб-сервисов, который возвращает большое количество данных - PullRequest
0 голосов
/ 19 июня 2009

Я разрабатываю интерфейс WCF, который возвращает статус всех заказов (структура данных заказа включает в себя два члена, идентификатор типа строки и перечисление orderstatus и разработана как DataContract), общее количество заказов очень большое, около 10M. Я обеспокоен трафиком и влиянием на сторону сервера, если клиент вызывает этот интерфейсный API, чтобы получить весь статус заказа, и часто вызывает этот API.

Любой совет?

Я использую VSTS 2008 + C # + .Net 3.5 + WCF.

Ответы [ 2 ]

3 голосов
/ 19 июня 2009

Я бы поддержал ozczecho - зачем вам возвращать 10M записей? Ваши клиенты ДЕЙСТВИТЕЛЬНО захотят просеять 10 миллионов заказов? Я очень сомневаюсь в этом ....

Ограничить количество - например, диапазоны дат (все заказы с 1Q / 09) или по любым другим критериям. Тот факт, что вы можете вернуть 10M строк, не означает, что это будет хорошая идея.

Кроме того, вместе с SQL Server вы можете легко реализовать пейджинг, например, вы можете сделать так, чтобы ваш сервис WCF отправлял обратно первым, например, 100 строк, и отправьте обратно флаг, указывающий, что есть больше, и затем запросите у вашего клиента строки с 101 по 200 и т. Д. Это займет немного логики, но это сделало бы общение намного проще (и быстрее)!

Кроме того, в WCF вы должны определить максимальные размеры сообщений - обычно они составляют 64 КБ. Причиной этого является тот факт, что сообщение должно быть полностью собрано в памяти, прежде чем его можно будет передать. Представьте, что на вашем сервере работает 50 клиентов - сколько памяти вы действительно можете выделить на «сборку сообщений» на вашем сервере?

Марк

UPDATE:
Один из способов добиться пейджинга в службе - это сделать вызов, похожий на этот:

[OperationContract]
public List<Orders> GetOrders(string searchCriteria, string sortExpression, 
                              int skipFirstRows, int takeRows)

Это основано на методах расширения .Skip () и .Take (), представленных LINQ.

В этом случае вы можете вызвать GetOrders и определить некоторые критерии поиска (которые также могут быть классом, а не просто строкой) для соответствия вашим заказам, вы можете определить, как сортировать заказы, указав sortExpression, а затем вы сообщаете службе, что хотите пропустить первые n строк, а затем взять x строк.

Итак, звонок

List<Orders> result = GetOrders(criteria, sort, 0, 50)

извлечет первые 50 строк. Как только вы закончите, вы можете позвонить снова:

List<Orders> result = GetOrders(criteria, sort, 50, 50)

и теперь вы пропустите первые 50 строк (которые вы уже отобразили / сообщили о них), а затем возьмете следующие 50 (строки 51-100).

Конечно, если ваша служба WCF в бэкэнде использует LINQ, вы можете преобразовать это непосредственно в вызовы .Skip () и .Take () в ваших запросах LINQ! : -)

ОБНОВЛЕНИЕ 2:
Вы работаете с SQL Server 2005 или выше? Ознакомьтесь с общими выражениями таблиц (CTE), которые являются основой для работы LINQ. Это позволяет вам определять «виртуальный» вид ваших данных и выбирать только определенный раздел набора данных.

Подробнее смотрите здесь:

2 голосов
/ 19 июня 2009
  • Не возвращать все записи 10 м.
  • Использование технологии пейджинга ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...