Azure функций приложений и веб-заданий с триггерами служебной шины пропускают некоторые сообщения при обработке - PullRequest
1 голос
/ 23 января 2020

Я работаю над azure функциями и azure веб-заданиями.

Я пытаюсь отправить сообщения на служебную шину topi c, и оттуда сообщение

  • Сначала с помощью функции Azure - читает из одной подписки, а приложение отправляет сообщение в космос. DB
  • Во-вторых, Azure веб-заданиями - Читает из другая подписка и отправка сообщений в Azure хранилище BLOB-объектов.

Они оба используют триггер служебной шины azure.

SO, если число очень мало сообщения от 1 до 5 в виде c будут обработаны. Но если я отправляю около 30-40 сообщений одновременно, и приложение-функция, и веб-задания пропускают некоторые сообщения, я имею в виду, что если я отправляю около 30 сообщений и проверяю BLOB-объект, он показывает, что было получено только 25 сообщений. Я добавляю приложение функции azure, которое запускается по времени запуска, прекрасно работает с счетом 30 обработанных отправленных -30, но я действительно не хочу использовать время запуска, поскольку он принимает слишком много обращений в день.

Будет здорово, если кто-нибудь сможет мне помочь.

Функциональный триггер:

        public static void ProcessArchiveQueueMessage([ServiceBusTrigger("*****", "*****", Connection = "ServiceBusConnectionString")] string message, ILogger log)
        {
            ArchiveDll.ProcessArchiveTopic("****", log);
        }

Код Dll :

       subscriptionClient.OnMessageAsync(m =>
                {
                    try
                    {
                        Stream stream = m.GetBody<Stream>();
                        StreamReader reader = new StreamReader(stream);
                        topicData = reader.ReadToEnd();
                        var jObj = JsonConvert.DeserializeObject<JObject>(topicData);

                        StoreJsoninBlob(cloudContainer, stream, jObj);

                        StoreInCosmosDB(log, jObj);

                        subscriptionClient.Complete(m.LockToken);
                    }
                    catch (Exception ex)
                    {
                        subscriptionClient.DeadLetter(m.LockToken);
                    }

                    return Task.CompletedTask;

                }, new Microsoft.ServiceBus.Messaging.OnMessageOptions()
                {
                    AutoComplete = false,
                    MaxConcurrentCalls = 1
                });
            }
            catch (Exception e)
            {

            }
        }

1 Ответ

0 голосов
/ 24 января 2020

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

publi c stati c void ProcessArchiveTopi c (строка subscriptionName, ILogger log, строковое сообщение) {

        log.LogInformation("Registering message listener for " + subscriptionName);

        //Below method is triggered every time when a new message is read from queue.

        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationSettings.AppSettings["BlobConnectionString"]);
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer cloudContainer = blobClient.GetContainerReference(ConfigurationSettings.AppSettings["BlobContainerName"]);
        cloudContainer.CreateIfNotExists();

        try
        {

            #region"function app reading message"
            log.LogInformation("Processing message for subscription: " + subscriptionName);
            var jObj = JsonConvert.DeserializeObject<JObject>(message);
            log.LogInformation("Converted message to Json");
            #endregion

            StoreJsoninBlob(cloudContainer, GenerateStreamFromString(message), jObj);

            StoreInCosmosDB(log, jObj);

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...