Google Cloud Run для клиентов TCPListener? - PullRequest
1 голос
/ 28 марта 2020

В настоящее время у меня есть приложение C#, работающее как windows. Приложение запускает TCPListener, затем через некоторое время l oop захватывает клиентов и сразу же выбрасывает их в ThreadPool.UnsafeQueueUserWorkItem для выполнения всей реальной работы. Клиент закрывается в конце вызова UnsageQueueUserWorkItem. Базовый c код приведен ниже:

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) должны будут обновляться при каждом вызове функции. Мысли? * * 1004

1 Ответ

0 голосов
/ 29 марта 2020

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

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

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

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

...