Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在多个进程中使用来自Azure服务总线的消息_Azure_Azureservicebus_Azure Servicebus Topics_Azure Servicebus Subscriptions - Fatal编程技术网

在多个进程中使用来自Azure服务总线的消息

在多个进程中使用来自Azure服务总线的消息,azure,azureservicebus,azure-servicebus-topics,azure-servicebus-subscriptions,Azure,Azureservicebus,Azure Servicebus Topics,Azure Servicebus Subscriptions,我正在开发一个基于Azure服务总线的系统,用于通过API快速启动和遗忘,以及后台服务通过主题异步处理大量消息。在这个问题的上下文中,主题只有一个订阅,为什么它可能是一个队列。出于其他原因,我想将此作为一个主题 我最近使用WindowsAzure.ServiceBus包将.NET framework应用程序中的代码迁移到了使用Microsoft.Azure.ServiceBus包的.NET核心包中。为了处理大量消息,我使用了MessageReceiver类,如下所示: var connStrin

我正在开发一个基于Azure服务总线的系统,用于通过API快速启动和遗忘,以及后台服务通过主题异步处理大量消息。在这个问题的上下文中,主题只有一个订阅,为什么它可能是一个队列。出于其他原因,我想将此作为一个主题

我最近使用
WindowsAzure.ServiceBus
包将.NET framework应用程序中的代码迁移到了使用
Microsoft.Azure.ServiceBus
包的.NET核心包中。为了处理大量消息,我使用了
MessageReceiver
类,如下所示:

var connString=“…”;
var subscriptionPath=EntityNameHelper.FormatSubscriptionPath(“主题”、“订阅”);
var messageReceiver=新的messageReceiver(connString,subscriptionPath);
而(…)
{
var messages=wait messageReceiver.ReceiveAsync(10,TimeSpan.FromSeconds(5));
...
}
为了简单起见,我隐藏了一系列细节。比如,我的应用程序启动5个线程,并使用相同的
messageReceiver
实例在每个线程中处理消息

我通常会有多个应用程序实例在线程和进程之间运行。我相信我们终于找到了我问题的密码。在迁移到.NETCore和新的NuGet软件包之后,我注意到只有一个应用程序同时处理消息。当打开两个控制台窗口并在每个窗口中启动一个进程时,我可以看到窗口1中的应用程序开始处理。windows 2中的应用程序不处理任何内容。几秒钟后,windows 1中的应用程序停止处理,windows 2中的应用程序开始处理。过了一段时间,它又切换回来了。交换机中没有真正的模式,但我的所有消息都已成功处理


MessageReceiver
中是否存在某种限制,允许处理来自同一订阅或类似订阅的消息的线程总数达到最大值?

我不知道
MessageReceiver
在线程数量方面存在任何限制。不过,新的库经过了优化,以利用并发性,而不需要线程(异步代码)。因此,从技术上讲,您可以使用单个线程运行,并有多个并发接收任务。另一种方法是使用
QueueClient
SubscriptionClient
提供的消息处理程序,它们允许指定并发性以便轻松处理多条消息,但允许每个并发回调接收一条消息(无批处理)


代理在一次调用中向第一个竞争消费者提供尽可能多的消息。如果没有足够的消息,所有消息都将发送给单个(或前几个)消费者。没有循环和公平分配。它确实像预期的那样工作。

谢谢!我确实尝试了
SubscriptionClient
,但在编写时,没有批处理。批处理在我的情况下是必不可少的,因为在与API通信时,需要单独接收和确认每条消息对于ms来说太昂贵了。我不确定
MessageReceiver
是否支持多线程回调,如
SubscriptionClient
。这是你知道的某个地方记录的东西吗?我通过检查不同负载下的控制台学到了更多。现在这个话题有很多内容。所有应用(现在运行4个)都在使用消息。当负载下降时,两个正在消耗所有时间,两个处于空闲状态。我想这是工作,因为它应该,虽然不同于回到当我使用旧的软件包。正确。代理在一次调用中向第一个竞争消费者提供尽可能多的消息。如果没有足够的消息,所有消息都将发送给单个(或前几个)消费者。没有循环和公平分配。它确实像预期的那样工作。听起来不错。作为答案的一部分,抄袭你最后的评论有意义吗?我认为这是正确的答案,不是个坏主意。完成。