【问题标题】:Listen to Queue (Event Driven no polling) Service-Bus / Storage Queue监听队列(事件驱动无轮询)服务总线/存储队列
【发布时间】:2015-12-22 00:57:48
【问题描述】:

我试图弄清楚如何监听队列中的事件(尤其是入队事件)。

假设我有一个控制台应用程序和一个服务总线队列/主题,我如何连接到队列并等待新消息?

我试图在没有While(true) 和持续轮询的情况下实现这一点,我试图以一种非常倾听的方式来做更多的事情,比如保持连接到队列的套接字。

我不想使用轮询的原因是我知道它会用请求淹没服务器,我需要一个可以在大量负​​载下工作的解决方案。

谢谢。

为了问题的简单性,我举了一个非常基本的例子,但我的实际情况有点复杂:

我有一个 Web-API,它使用服务总线队列将需要处理的消息发送到工作角色。

我需要以某种方式知道 Worker 何时处理了消息。 我希望 Worker 向队列发送一条消息,提醒 Web API 已处理该消息,但现在我需要让 Web-API “坐下”并等待 Worker 回复,这导致我的问题:

如何在不进行轮询的情况下不断收听队列(因为有很多实例会进行池化,并且会创建很多可能最好避免的请求。

【问题讨论】:

  • 有一个名为 Azure Event Hubs 的服务。
  • 谢谢 我现在就去看看

标签: azure azureservicebus servicebus azure-servicebus-queues azure-queues


【解决方案1】:

使用 Azure WebJobs SDK - 它有触发器来监控队列和 blob,代码如下:

public static void Main()
{
    JobHost host = new JobHost();
    host.RunAndBlock();
}

public static void ProcessQueueMessage([QueueTrigger("webjobsqueue")] string inputText, 
    [Blob("containername/blobname")]TextWriter writer)
{
    writer.WriteLine(inputText);
}

What is the Azure WebJobs SDK 有一个很棒的教程。

【讨论】:

  • 会定期拉吗?
  • 它监控队列日志并在添加一条消息后立即从队列中拉出一条消息。
  • @viperguynaz 我已经更新了我的问题。我不认为 Web Job 会帮助我解决这个问题。
  • WebJob SDK 可以在任何地方使用 - 在概念验证中试用。
  • 我需要指出的是,WebJob SDK QueueTrigger 实际上是一个轮询机制的包装器,它使用一种退避算法,因此它不完全是事件驱动的,只是看起来很像。这用于节省低流量队列的队列读取(Azure 中的计费操作)。轮询之间的最大等待时间是可配置的How to use Azure queue storage with the WebJobs SDK
【解决方案2】:

我最终使用QueueClient.ReceiveAsync 来等待带有Timespan 参数的消息。

            BrokeredMessage msg = subClient.ReceiveAsync(TimeSpan.FromMinutes(3));

这是一篇很好的文章,它解释了 Azure 服务总线 linkService Bus best practice 的大部分内容。

【讨论】:

  • 所以您切换到服务总线队列而不是使用 Azure 存储队列?
  • 它在 Azure ServiceBus 客户端的 Microsoft.Azure.ServiceBus 新 .NET Standard Nuget 包中不可用 :( :( :(
  • 可用,但已更改:stackoverflow.com/a/50456181/264031
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
  • 2021-11-29
  • 2015-07-18
  • 2019-02-12
相关资源
最近更新 更多