我们有几个客户=生产者(还有1个客户= 1到N个生产者)。我们需要公平地处理每个生产者的数据(=分别是最好的选择),因为有可能一个生产者将向我们发送大量数据,并且如果所有生产者只有一个队列,其余生产者将被阻止。因此,我们需要确保不会有任何生产者受到消费者的公平阻拦和服务。
理想的模式是每个生产者都有自己的队列和自己的使用者(异步等待将发送到队列的任何消息)。上面的图片提供了这种模式。
问题在于生产者的数量将随着客户数量的增加而动态增长,因此我们也需要动态创建队列和消费者。
此外,我们需要利用生产者的数据来解决另一个难题。我们需要确保先处理来自生产者A的较旧数据,然后再处理来自同一生产者A的较新数据。(注意:生产者彼此独立,因此可以先处理来自生产者B的较新数据,然后再处理来自生产者A的较旧数据。)< / p>
根据我的研究,使用Azure队列存储作为队列不会有任何问题(通过queue.CreateIfNotExists();
动态创建队列不是问题)。但是我不知道该怎么用作为适当的消费者。我知道有很多Azure服务,例如:Azure功能,Azure WebJob,Azure Event Hub等。
我的问题是:该用例用作消费者的最佳选择是什么?
我们需要尽可能公平地服务队列,以确保生产者的队列不会被其他人阻塞。
提前感谢您的提示!
答案 0 :(得分:0)
这是一个有趣的用例,但在我看来,对于消费者来说,功能将是您的最佳选择。我将业务逻辑封装在一个单独的文件中,因此所有单独的功能都是队列绑定和对该单独文件的调用:
File 1:
public static Task DoStuff(string myQueueItem, ILogger log)
{
//tranforms here
}
File 2 - n:
[FunctionName("ConsumerA")]
public static void QueueTrigger(
[QueueTrigger("myqueue-items")] string myQueueItem,
ILogger log)
{
await DoStuff(myQueueItem, log);
}
与队列创建/删除一起,您可以use the management API创建和删除函数。每次创建一个队列时,都要调整名称和队列名称,以便将其绑定到新队列。
您可以通过更改“ maxOutstandingRequests” property in the host.json文件来控制并行处理。在使用计划上,最大请求将针对该应用程序的每个实例-如果将设置设置为一个,并且主机可以扩展到三个实例,则一次将处理三则消息。 Scaling is a little different(如果您使用的是标准App Service计划),但仍可以动态完成。消费者实例的动态扩展可能会有助于解决数据量不一致的问题:大容量数据转储将得到更快的处理,但是当环境安静时,您将不需要资源。
当主机扩展时,每个实例都包含每个功能的副本,因此,由于数据转储量大而提高了吞吐量,实际上也将增加其他队列的可用吞吐量,而不是减少它。