【问题标题】:CloudQueue.BeginAddMessage in logger implementation记录器实现中的 CloudQueue.BeginAddMessage
【发布时间】:2016-11-18 15:49:45
【问题描述】:

我正在考虑使用CloudQueue.BeginAddMessage 方法进行日志记录的性能方面。每次调用 logger.LogMessage 都会向 Azure 队列发送一条消息。我知道每次调用BeginAddMessage 都会发送一个POST 请求。等待它完成不是一种选择,因为我的目标是使logger.LogMessage 方法尽可能快。这就是为什么我打算只触发操作并忘记(如果请求失败,它并不那么重要)。

拨打CloudQueue.BeginAddMessage需要多长时间?

它在返回之前是否执行 HTTP 请求初始化(如构建 HTTP 主体、打开连接等)?

如果是,那么我将不得不将此初始化移动到其他线程,方法是将其包装在异步调用中,例如 Task.Run(() => CloudQueue.BeginAddMessage())

有更好的选择吗?

【问题讨论】:

  • 您确实意识到使用 Task.Run 创建大量线程可能会产生比 http 请求初始化更多的开销,如果发生这种情况?
  • 是的,这是我的担忧之一。在我知道 BeginAddMessage 的工作原理之前,我仍然不确定什么更好
  • 可以看源码看看是怎么实现的:github.com/Azure/azure-storage-net/blob/master/Lib/….

标签: .net performance azure asynchronous azure-storage


【解决方案1】:

这是我的建议:在你的程序中定义一个内存队列,而 logger.LogMessage() 所做的只是向内存队列添加一条新消息。此外,启动一个专门的后台线程来消耗内存队列并将日志消息上传到 Azure Queue。您甚至可以为这个专用线程设置一个信号量,以由您控制的并发上传日志消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多