繁体   English   中英

带有服务总线的 Azure 函数应用和 Web 作业在处理时会触发丢失一些消息

[英]Azure functions app and Web jobs with service bus triggers missing some messages while processing

我正在从事 azure 函数和 azure web 工作。

我想要做的是,将消息发送到服务总线主题,然后从那里处理消息,如下所示,

  • 首先通过 Azure 函数 - 从一个订阅读取,应用程序将消息发送到 Cosmos DB
  • 其次是 Azure Web 作业 - 从另一个订阅读取并将消息发送到 Azure Blob 存储。

他们都在使用 azure 服务总线触发器。

因此,如果一秒钟内的消息数量非常少,例如 1 到 5,它将被处理。 但是,如果我同时发送 30-40 条消息,函数应用程序和 Web 作业都缺少一些消息,我的意思是如果我发送 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)
            {

            }
        }

以下是我用来克服上述问题的最新代码。

public static void ProcessArchiveTopic(string subscriptionName, ILogger log, string message)
{

  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);
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM