Сценарий:
Создавайте или обновляйте записи в CRM из внешней базы данных в зависимости от того, существует ли ключ записи в CRM или нет.
Платформа: CRM 2015 Online.
Метод SSIS с компонентом .Net 4 Script
Проблема: что бы я ни делал, я не могу получить более 1 записи в секунду. Я очень надеюсь, что я делаю что-то не так
Что я делаю:
- Получить список всех записей из CRM с полем Guid и Key.
- Разделите записи на несколько задач.
- Создайте ExecuteMultipleRequest в каждой задаче с помощью Create или Update в зависимости от того, существует ли запись в предыдущем списке из (1).
- Создайте один OrganizationService для каждого потока (повторно используемый между последовательными потоками в стиле циклического перебора (см. код ниже)).
- Запустите выполнение нескольких.
- Плакать из-за скорости.
Результат не зависит от количества параллельных задач или размера партии. Это в основном ВСЕГДА около 0,9-1,5 записей в секунду.
Я пробовал все от 1 темы с 1000 штук до 16 потоков по 1 штуке в каждой.
Этот пост, утверждающий, что 200-300 записей в секунду возможны, насмехается над чем-то жестоким: зло дразнящий пост в блоге с 300 записями в секунду для CRM онлайн
Фрагменты кода из проекта (пытался скопировать только то, что может быть актуально):
Создание контекста.
foreach (int i in Enumerable.Range(1, _MaxThreads * 2))
{
var crmConnection = CrmConnection.Parse(connectionString);
var organisationservice = new OrganizationService(crmConnection);
_OrgServiceList.Add(organisationservice);
}
Как я создаю свои задачи:
private void ImportNewBatch(List<Customer> dataSet)
{
var service = _OrgServiceList[_CurrentServicePosition];
_CurrentServicePosition++;
if (_CurrentServicePosition >= _OrgServiceList.Count)
_CurrentServicePosition = 0;
var aTask = new Task(() => WorkerThread(dataSet, service), TaskCreationOptions.None);
aTask.Start();
_RunningThreads.Add(aTask);
if (_RunningThreads.Count >= _MaxThreads)
Task.WaitAny(_RunningThreads.ToArray());
_RunningThreads.RemoveAll(t => t.IsCompleted);
}
Выполнить множественный запрос
var requestWithResults = new ExecuteMultipleRequest()
{
Settings = new ExecuteMultipleSettings()
{
ContinueOnError = true,
ReturnResponses = true
},
Requests = new OrganizationRequestCollection()
};
Обновление 1. Получен полунеофициальный ответ от Microsoft относительно CRM в Интернете, который может быть интересен и другим:
- Хорошая производительность для CRM онлайн составляет около 10 записей в секунду.
- Производительность сильно зависит от того, есть ли у вас плагины или нет.
- CRM Online регулирует множественные запросы, так что только два (2) могут выполняться одновременно, все запросы после этих двух ставятся в очередь и обрабатываются по очереди.
- CRM Проверяет ваш IP-адрес и логин, чтобы вы не могли обойти регулирование с несколькими пользователями или отдельными контекстами.
- Наличие решения с большим количеством лицензий даст вам большую производительность, т. е. при прочих равных условиях экземпляр со 100 лицензиями будет быстрее, чем экземпляр с 5.