Создание очереди хранения в Task.Run увеличивает время обработки вдвое

У меня есть проект, который обрабатывает файлы продуктового фида в моей системе. Для одного файла фида весь процесс занимает около 40-50 минут. Теперь я создал WebJob для обработки изображений из канала и отправляю URL-адреса изображений из моего первого проекта в WebJob, создав клиент хранилища. Когда у меня есть это в моем проекте, время обработки значительно увеличилось, поэтому я попытался использовать его с Task.Run, чтобы использовать Fire and Forget подход, но все же даже с этим общим временем процесса сейчас около 2 часов.

Вот как я вызываю свой метод создания очереди хранилища.

if (insertImages)
{
    #pragma warning disable 4014
    Task.Run(async () => { await new QueueUtility().CreateQueueMessage(picture); }).ConfigureAwait(false);
    #pragma warning restore 4014
}

А вот мой код для создания сообщения в очереди

public async Task CreateQueueMessage(Picture picture)
    {
            Utility.Log log = new Utility.Log();
            await AddQueueMessage(picture.url);

    }


public async Task AddQueueMessage(string queueMessage)
    {
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("ImagekWebJobStorage"));

        // Create the queue client.
        CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

        // Retrieve a reference to a container.
        CloudQueue queue = queueClient.GetQueueReference("imagekqueue");

        // Create the queue if it doesn't already exist
        queue.CreateIfNotExists();

        // Create a message and add it to the queue.
        CloudQueueMessage message = new CloudQueueMessage(queueMessage);
        queue.AddMessage(message);

    }

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


person erincerol    schedule 20.05.2016    source источник


Ответы (1)


Две вещи:

1 - вы пытаетесь создать свою очередь при каждом вызове AddQueueMessage(). Это ненужный путь туда и обратно.

2 - попробуйте отключить алгоритм Нэгла с помощью

ServicePointManager.UseNagleAlgorithm=false;

В противном случае пакеты TCP меньшего размера могут задерживаться более чем на 1/2 секунды.

person David Makogon    schedule 20.05.2016
comment
Да, нет необходимости продолжать это делать, если только вы не создаете новые очереди с каждым вызовом. Гораздо эффективнее создавать очереди заранее, один раз. - person David Makogon; 20.05.2016
comment
Также каждый вызов Createifnotexists влечет за собой расчет стоимости транзакции. Вы можете кэшировать его локально после того, как вызовете это один раз. Не слишком дорого, но все же хорошо, чтобы сэкономить все, что вы можете - person Frank Q.; 21.05.2016