Это концептуальный вопрос. Допустим, у меня есть приложение Python, которое состоит из трех служб: собственно приложение Python, процесс с сельдереем и redis.
Я планирую использовать redis в качестве бэкэнда для результатов. Теперь, когда я разверну свое приложение в кластере Swarm с 3 узлами, в идеале все 3 узла будут использовать все мои 3 службы.
Теперь допустим, что у меня есть следующий код для задачи сельдерея: tasks.py
время импорта
from celery import Celery
app = Celery('tasks', backend='redis://localhost:6379/0', broker='redis://localhost:6379/0')
@app.task(name='tasks.add')
def add(x, y):
total = x + y
print('{} + {} = {}'.format(x, y, total))
time.sleep(10)
return total
И приведенный ниже код для получения результата из моего бэкэнд-магазина Redis: invoker.py
import time
from tasks import add
from celery.result import AsyncResult
result = add.delay(1, 2)
while True:
_result2 = AsyncResult(result.task_id)
status = _result2.status
print(status)
if 'SUCCESS' in status:
print('result after 5 sec wait {_result2}'.format(_result2=_result2.get()))
break
time.sleep(5)
Итак, у меня есть два вопроса, связанных с режимом роя:
В файле tasks.py в строке:
app = Celery ('tasks', backend = 'redis: // localhost: 6379/0', broker = 'redis: // localhost: 6379/0')
строка "localhost" должна быть изменена на любое имя службы, которое я даю службе redis в моем кластере роя?
- Если рабочий начинает с моей задачи, а затем между тем временем узел redis, который вызвал задачу, дает сбой, то как рой позволяет мне получить результат от бэкэнда, так как исходный узел redis, который запустил задачу, больше не работает? там?
Большое спасибо за любые ответы и извинения, если это немного расплывчато, так как я пытаюсь понять, как все сочетается в режиме серийного роя.