当前位置: 首页 > 知识库问答 >
问题:

Azure服务总线监听器打开太多TCP连接(耗尽)

曾泳
2023-03-14

我们有几个服务总线侦听器在应用服务中作为连续的Azure Web作业运行。总而言之,有12个侦听器-网络作业在同一个S1应用服务计划上运行。环境很小,每天总共大约有1000-10000条消息。最近我们部署了一个新的监听器(一个监听器,它会定期将DLQ消息重新发送到原始主题长达24小时

分析了代码,但没有发现高传输控制协议需求的原因。

所有侦听器都像这样工作(. NET控制台应用程序,在应用服务中作为连续的Azure Web作业托管):

public static async Task Main(string[] args)
{
    var configuration = GetConfiguration();

    // Setup dependencies (e.g. Singleton HttpClient)
    IServiceCollection serviceCollection = new ServiceCollection();
    ConfigureServices(serviceCollection, configuration);

    IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
    var factory = serviceProvider.GetService<TopicReceiverFactory<Model>>();
    var receiver = await factory.CreateAsync();
    receiver.ReceiveMessages();

    Console.ReadLine();
}

// ctor of the receiver used above
public QueueReceiver(QueueConfiguration configuration, IHandler<T> handler, ILogger<IReceiver> logger)
        : base(logger, handler)
{
    this.configuration = configuration;

    this.Client = new QueueClient(
    this.configuration.ConnectionString,
    this.configuration.QueueName,
    this.configuration.ReceiveMode);
}

// The ReceiveMessages Method used in Main
public void ReceiveMessages()
{
    var messageHandlerOptions = new MessageHandlerOptions(this.HandleExceptionReceivedAsync)
    {
        MaxConcurrentCalls = this.configuration.MaxConcurrentCalls,
        AutoComplete = false
    };

    this.Register(messageHandlerOptions);
}

protected void Register(MessageHandlerOptions messageHandlerOptions)
{
    if (messageHandlerOptions == null)
    {
        throw new ArgumentNullException(nameof(messageHandlerOptions));
    }

    this.Client.RegisterMessageHandler(this.ProcessMessageAsync, messageHandlerOptions);
}

ProcessMessage大致有这样的逻辑:调用特定实体的处理程序(将消息发布到api),如果成功:完成消息;如果关键异常不成功(例如JsonSerializerException,因为消息的格式错误)直接死信。轻微的异常会导致内置重试(最多10次)。

预计TCP连接永远不会耗尽。环境中发生的事情并不多。

共有1个答案

毋城
2023-03-14

我们找到了问题的根源。考虑以下体系结构:具有多个主题和一个队列的servicebus命名空间。消息被发送到服务总线侦听器接收和处理消息的主题。如果无法处理消息,则将其转发到中央错误处理队列。在此队列上,一个侦听器正在接收消息并读取消息的DeadLetterSource属性。此属性中包含有关原始主题的信息。

现在问题来了:目前我们正在为每条消息创建一个TopicClient。这是因为监听器不需要提前知道有哪些主题,从而降低了可重用性。然而,正如我们现在发现的那样,这是不可持续的,因为您耗尽了TCP连接。

解决方案:我们通过配置引入主题名称,以便该侦听器可以为整个应用程序生活方式的每个主题创建一个TopicClient。本质上有n-Singleton TopicClient实例同时运行。

 类似资料:
  • 我需要将一条消息从运行在SQL Server2014下的SSIS包放入Azure ServiceBus队列中。正如本文所建议的:从ssis连接到azure服务总线队列,我编写了一个引用“azure SDK2.9”的脚本任务。这种方法适用于Azure存储帐户处理Blob(引用Microsoft.WindowsAzure.Storage程序集),但不适用于Azure存储总线(引用Microsoft.S

  • ap.onSocketOpen(CALLBACK) 监听 WebSocket 连接打开事件。 代码示例 <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.inc.min.js"></script> <style> .output{ display:block; max-width

  • 最近,我从Azure获得了一条关于在我的应用程序服务中达到TCP/IP端口上限的“建议”。 TCP/IP端口接近耗尽包含应用程序*****的应用程序服务计划已配置为使用中等实例。该应用服务计划中托管的应用程序使用了每个中型实例4096个可用TCP/IP端口中的90%以上。您可以升级实例大小以增加出站连接限制,或配置连接池以更高效地使用。 应用程序服务计划的限制是否存在差异(扩大)?或者我可以配置我

  • 2.4 多服务&多监听 2.4.1 在Go代码中声明 假定用户需要创建的Web服务 服务名称 版本号 监听地址 网络类型 读取请求数据超时 写入响应数据超时 myapp1 1.0 0.0.0.0:8080、0.0.0.0:4430 http、https(TLS) 0 0 myapp2 2.0 0.0.0.0:8081、0.0.0.0:4431 http、https(TLS) 0 0 无版本号的服务

  • 我在Center Os服务器上用JSP创建了Web应用程序。过了一段时间,到mysql的连接超过了限制,如果不重新启动mysql服务,应用程序就无法工作。 关闭Tomcat:使用catalina_base:/usr/local/apache-tomcat-7.0.27使用catalina_home:/usr/local/apache-tomcat-7.0.27使用catalina_tmpdir:/

  • 这似乎是最简单的解决办法。让我们看看流程: 第三方向RESTful API发送请求,以获取Windows Azure服务总线连接字符串-凭据-。 一旦拥有连接字符串,第三方就会连接到Windows服务总线,并开始从某个主题订阅接收消息。注意:连接字符串是在服务器端加密的,只能由接受的客户端解密。 优点 null null 第三方请求一个类似于RESTful的TCP API,以便订阅一些Window