【发布时间】: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