【问题标题】:Sending a message to a service bus queue via .NET Core Logger?通过.NET Core Logger 向服务总线队列发送消息?
【发布时间】:2019-08-07 11:10:05
【问题描述】:

我创建了一个自定义记录器,它将消息发送到服务总线队列。我的问题是 Microsoft.Extensions.Logging.ILogger 没有异步 Log 方法,因此必须同步调用异步方法,这可能会导致问题。

    _queueClient.SendAsync(message).Wait();

所以我的问题是,在不导致线程饥饿的情况下,对我来说最安全的方法是什么?

【问题讨论】:

  • 您发送的那些消息:是那些日志消息还是正常程序流程的一部分,例如通知其他组件实体被删除?
  • 它正在使用 ILogger,因此用于获取信息、错误、警告等。

标签: asynchronous logging .net-core azure-servicebus-queues


【解决方案1】:

Net Core Logging 专门设计为不使用异步方法。他们相信记录应该足够快以至于它不需要它。

“日志记录应该如此之快,以至于不值得为此付出性能代价 异步代码。”

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.2

建议如果您需要记录此类内容,请改用“批处理记录器”。

"相反,将日志消息同步添加到内存队列中,并具有 后台工作人员将消息从队列中拉出以执行 将数据推送到 SQL Server 的异步工作。”

因此,基本上,您应该将队列调用移动到后台工作程序 (HostedService) 中,并让它在后台工作程序中执行异步调用。您的正常“记录器”方法应该调用将消息粘贴到 MemoryCache 队列或类似的东西,然后您的后台工作人员将在后台获取消息。我敢肯定(在我的脑海中)Azure Logger 有一个此类事情的简单示例

【讨论】:

  • 感谢您的回复。他们在那种情况下描述的不是我正在做的事情,即调用 SQL,我只是将消息放在队列中以由工作人员处理,这是在这种情况下做的正确事情。但是,由于 SB queueclient 仅是异步的,而 logger 是同步的,这意味着我现在处于代码中可能存在死锁的情况。
  • 我猜 MS 决定按照他们的方式实现它,因为他们没有预料到(或太在意)他们范围之外的场景。在你的后台服务和仅使用标准同步方法可以让您在保持当前标准工作方式的同时分离关注点。
猜你喜欢
  • 2017-08-19
  • 2018-12-07
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多