【问题标题】:Google Cloud Run for TCPListener clients?用于 TCPListener 客户端的 Google Cloud Run?
【发布时间】:2020-07-08 19:40:16
【问题描述】:

我目前有一个作为 Windows 服务运行的 C# 应用程序。该应用程序启动一个 TCPListener,然后在一个 while 循环中抓取客户端并立即将它们扔给 ThreadPool.UnsafeQueueUserWorkItem 以完成所有实际工作。客户端在 UnsageQueueUserWorkItem 调用结束时关闭。基本代码如下:

var server = new TcpListener(ip, port);
server.Start();

while (true)
{
   try
   {
      TcpClient client = await server.AcceptTcpClientAsync();
      var cw = new TcpClientService(logger, client, parser, dataRepo, propertyRecordDefinitions, 
             vimAlertsSent, reservations, emailClient);

      ThreadPool.UnsafeQueueUserWorkItem(x => ((TcpClientService)x).Run(), cw);
    }
    catch(Exception iex)
    {     
       //DO SOME LOGGING    
    }
    finally
    {               
    }
}

这一切都作为 Windows 服务在 AWS 中的虚拟机上运行。我想知道这是否适合 Google Cloud Run(或任何其他无服务器/无状态功能)。我每分钟收到数百个请求(客户),并希望扩展到数千个。据我了解,Cloud Run 可能会被传入请求触发,然后我可以运行当前由 Threadpool.UnsafeQueueUserWorkItem 调用的 TcpClientService 代码。这是一个很好的实现吗?这就是 Google Cloud Run 的优化目标吗?我想知道我是否会看到一些退化,因为数据库连接可能没有被池化,并且我在线程之间共享的一些其他结构(我对 TcpClientService 调用的所有输入)必须在每个函数调用中更新。想法?

【问题讨论】:

  • 您有问题还是寻求建议?
  • 更多寻找关于这是否是无服务器功能的适当实现的建议
  • AFAIK,Cloud Run 兼容 linux 映像,而不是 windows。是你的情况吗?

标签: multithreading google-cloud-platform tcpclient google-cloud-run


【解决方案1】:

Cloud Run 仅支持基于 TLS 的 HTTP/1 或 HTTP/2(包括 gRPC)(尽管您的应用程序无需担心终止 TLS)。因此,不支持不是其中之一的任意 TCP 协议。见:Which protocols can my application serve traffic on?

Cloud Run 容器实例不会从客户端接收单独的 TCP 连接。它宁愿从其负载均衡器接收普通的未加密的“HTTP 请求”,从而终止 HTTPS 请求。因此,Cloud Run 容器实例不会从客户端获得直接 TCP 连接。

除此之外,您在下面描述的用途绝对是 Cloud Run 的用途:

我每分钟收到数百个请求(客户端),并希望扩展到数千个。

【讨论】:

    猜你喜欢
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    相关资源
    最近更新 更多