Google Cloud Run и golang goroutines

Я рассматриваю Google Cloud Run для некоторых операций, подобных cron, которые мне нужно выполнить. Они будут активированы HTTP-вызовом. Вызов вернется (вероятно, с 202) и продолжит работу в фоновом режиме с помощью golang goroutine.

Но меня беспокоит, что контейнеры Google Cloud Run уничтожаются, когда они не обрабатывают HTTP-запросы. Я мог бы пройти часть процесса обработки и получить пожатие.

Есть ли способ сказать GCR, чтобы контейнер оставался живым, пока я не закончу?


person Sandy Walsh    schedule 29.07.2019    source источник


Ответы (1)


Cloud Run почти полностью снижает ваш ЦП, когда он не обрабатывает запросы, потому что вы платите только тогда, когда запрос обрабатывается. (Это задокументировано здесь).

Поэтому приложения, запускающие горутины в фоновом режиме, не подходят для Cloud Run. Если вы это сделаете, ваши горутины, скорее всего, будут голодать по распределению времени ЦП, и ваша программа может начать вести себя очень странно (поскольку она будет работать на очень-очень медленном процессоре, если вообще что-либо).

Незначительное количество неактивного приложения Cloud Run, вероятно, годится только для сборки мусора, которую go runtime сделает за вас.

Если вы хотите дождаться завершения вашей горутины в контексте запроса, вам следует заблокировать возврат запроса, используя что-то вроде блокировки-получения от chan или sync.WaitGroup#Done().

person Ahmet Alp Balkan    schedule 29.07.2019