У меня есть несколько приложений, развернутых в экземплярах Azure Container, к которым я получаю доступ через API-интерфейсы флакона, теперь я создаю обработчик для запуска / остановки контейнеров, например, EG
app1 находится в container1, если яполучить запрос к app1 один мой рабочий процесс:
1) Start the contianer1 from a python subprocess using azure CLI comands
2) Make the API call to app1
3) Get the result and stop the container
Так как я могу иметь более одного запроса за раз, я обрабатываю этот процесс в функцию add - подача в очередь redis, как показано ниже:
def make_call(arg1,arg2,arg3):
start_container = 'az container start --name mycontainer --resource-group mygroup'
subprocess.call([start_container],shell=True)
data = dict()
data['query'] = {'query':"query"}
####
url = "http://api_url"
resp = requests.post(url,data=json.dumps(data), headers=headers )
print (resp)
stop_container = 'az container stop --name mycontainer --resource-group mygroup'
subprocess.call([stop_container],shell=True)
return resp
Таким образом, каждый раз, когда я получаю запрос, в очередь добавляется одна задача:
r = redis.Redis()
q = Queue(connection=r,default_timeout=3600)
task = q.enqueue(make_call,args = (arg1,arg2,arg3),timeout=500)
print (q.jobs)
Если я сделаю только один вызов, он будет работать нормально, и из лазури можно увидеть, какконтейнер включается и выключается:
Но, конечно, это не цель очереди, когда я добавляю несколько заданий в очередь,первый работает нормально, а остальное не получается:
Traceback (most recent call last):
File "/home/luis/anaconda3/lib/python3.7/site-packages/urllib3/connection.py", line 159, in _new_conn
(self._dns_host, self.port), self.timeout, **extra_kw)
File "/home/luis/anaconda3/lib/python3.7/site-packages/urllib3/util/connection.py", line 80, in create_connection
raise err
File "/home/luis/anaconda3/lib/python3.7/site-packages/urllib3/util/connection.py", line 70, in create_connection
sock.connect(sa)
TimeoutError: [Errno 110] Connection timed out
Кроме того, я не использую kubernetes для этого случая, так как у меня есть только несколько сервисов, которые будут использоваться один или два раза в неделю.
** РЕДАКТИРОВАТЬ: **
Я нашел ошибку, но пока не знаю, как ее решить. Если я удаляю строку для запуска и остановки контейнера, я работаю нормально, поэтому проблема, похоже, связана с тем, что контейнер не был готов, когда я начинаю делать запросы, это любой способ убедиться, что контейнер запущен и работаетперед вызовом API?
Edit2
В настоящее время я создаю контейнеры с использованием CLI , например:
az container create -g MyResourceGroup --name myapp --image myimage:latest --cpu 1 --memory 1
Возможно ли эток этому оттуда, или я должен изменить все это на файл YML?