Google Cloud Run для клиентов TCPListener?

В настоящее время у меня есть приложение C #, работающее как служба Windows. Приложение запускает TCPListener, затем через некоторое время цикл захватывает клиентов и немедленно передает их в 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 потенциально может быть запущен входящим запросом, тогда я мог бы просто запустить свой код TcpClientService, который в настоящее время вызывается Threadpool.UnsafeQueueUserWorkItem. Это хорошая реализация? Это то, для чего оптимизирован Google Cloud Run? Мне интересно, увижу ли я некоторую деградацию в том, что соединения с БД не могут быть объединены в пул, а некоторые другие структуры, которые я разделяю по потокам (все мои входные данные для вызова TcpClientService), должны будут обновляться при каждом вызове функции. Мысли?


person Kevin Bowers    schedule 28.03.2020    source источник
comment
У вас есть проблема или вы ищете совета?   -  person guillaume blaquiere    schedule 28.03.2020
comment
Больше ищу совета о том, будет ли это подходящей реализацией бессерверной функции   -  person Kevin Bowers    schedule 28.03.2020
comment
AFAIK, Cloud Run совместим с образом Linux, а не с Windows. Это твой случай?   -  person guillaume blaquiere    schedule 28.03.2020


Ответы (1)


Cloud Run поддерживает только HTTP / 1 или HTTP / 2 (включая gRPC) через TLS (хотя вашему приложению не нужно беспокоиться о завершении TLS). Следовательно, произвольные протоколы TCP, не входящие в их число, не поддерживаются. См. По каким протоколам мое приложение может обслуживать трафик?

Экземпляры контейнеров Cloud Run не получают отдельные TCP-соединения от клиентов. Он скорее получает простые незашифрованные «HTTP-запросы» от своего балансировщика нагрузки, который завершает HTTPS-запросы. Таким образом, экземпляры контейнера Cloud Run не получают прямого TCP-соединения от клиента.

Помимо этого, описанное ниже использование определенно предназначено для Cloud Run:

Я получаю сотни запросов (клиентов) в минуту и ​​надеюсь масштабироваться до тысяч.

person Ahmet Alp Balkan    schedule 29.03.2020