Можно ли выполнять вызовы EWS параллельно без замедления?

Я хочу получить информацию с сервера Excachange (2010 через EWS API). Подробно я хочу создать службу Windows, чтобы перебирать всех пользователей excachange и индексировать их личные почтовые ящики с использованием имперсонализации. Это работает хорошо, но очень медленно, когда я делаю это для одного пользователя за другим (в зависимости от объема почтового ящика и количества пользователей). Скорость индексации сейчас около 500 элементов в минуту.

В моей тестовой системе следующие вызовы занимают около 250 миллисекунд:

PropertySet myPropertySet = new PropertySet(BasePropertySet.FirstClassProperties,    ItemSchema.ParentFolderId);
myPropertySet.RequestedBodyType = BodyType.Text;
myPropertySet.Add(entryIdExtendedProperty);
Item item = Item.Bind(es, itemKey, myPropertySet); 

Итак, моя идея состояла в том, чтобы сделать распараллеливание. Пока пробовал 3 способа:

  1. Фоновый рабочий поток: один рабочий поток на пользователя. Результат: никакого эффекта. Кажется, что это замедлит сам вызов. В итоге общая скорость осталась прежней.

  2. Отдельные EXE-процессы: один EXE-файл на пользователя. Я создал «Worker»-Exe и вызвал их с пользователем в качестве аргумента: IndexWorker.exe -user1
    Результат: тот же результат! Вызовы каждого exe замедляются!

  3. Отдельные службы Windows: одна служба на пользователя. Результат: Внезапно запрос не тормозил, а значит я смог довести общую скорость до кратной 500 итемов в минуту (я триал до 3-х процессов, то есть 1500 итемов в минуту). Неплохо, но я оставляю меня наедине с вопросом:

Почему вызовы EWS замедляются в 1) и 2), но не в 3)? Потоки были бы для меня самым элегантным способом, есть ли какие-либо настройки или настройки, которые я могу использовать?

Я читал пару вещей о политиках регулирования и EWSFindCountLimit. Это правильное направление?


person MartinHappyCoding    schedule 04.06.2012    source источник


Ответы (2)


Вы докопались, почему отдельный сервис дал вам такой прирост производительности? Регулирование применяется на уровне учетной записи службы, поэтому не имеет значения, откуда вы совершаете вызовы.

person Kevin    schedule 05.08.2012
comment
Спасибо! Какие варианты дросселирования вы думаете? Все мои изменения не имели никакого эффекта.. - person MartinHappyCoding; 07.04.2013

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

person Brian Desmond    schedule 14.06.2012