У меня есть 2 VPS в разных местах (один EU, один NA). Мне иногда требуется, чтобы моя задача Celery выполнялась на сервере ЕС, а иногда и на сервере NA (потому что на веб-сайте отображается различная информация, основанная на местоположении).
Итак, в моем Колба приложение, которое я создал две различные задачи, которые делают то же самое:
@celery.task(bind=True, name='task_EU')
def task_EU(self, arg1, arg2, arg3, arg4):
with app.app_context():
cust_module.handle(arg1, arg2, arg3, arg4)
@celery.task(bind=True, name='task_NA')
def task_NA(self, arg1, arg2, arg3, arg4):
with app.app_context():
cust_module.handle(arg1, arg2, arg3, arg4)
Эти задачи называются, когда действие выполняется из панели администратора. В зависимости от того, что есть выбрать пользователь, я хочу, задача будет выполняться на сервере ЕС или сервер NA, так что я сделал это:
@app.route('/launch-new-project', methods=['POST'])
def launch_new_project():
arg1 = request.form['arg1']
arg2 = request.form['arg2']
arg3 = request.form['arg3']
arg4 = request.form['arg4'] # EU or NA
# launch celery task
if arg4 == 'NA': # user selected 'NA' from drop-down menu
task = task_NA.apply_async((arg1, arg2, arg3, arg4), queue='NA')
else:
task = task_EU.apply_async((arg1, arg2, arg3, arg4), queue='EU')
return task.id, 202, {'location': url_for('taskstatus', task_id=task.id)}
На VPS ЕС, я запущу очередь так:
celery -A myapp.celery worker -Q EU --loglevel=INFO --concurrency=6
Мой брокер (я использую redis) работает на одном и том же VPS, поэтому нет проблем с подключением к нему.
Команда NA VPS - то же самое, также подключается к брокеру, который находится на EU VPS.
celery -A myapp.celery worker -Q NA --loglevel=INFO --concurrency=6
Теперь, когда я иду к панели администратора, и запустить проект при выборе ЕС из выпадающего списка -> нет проблем. Задача запускается по мере необходимости. Когда я выбираю NA, однако, я получаю следующее сообщение об ошибке:
Received and deleted unknown message. Wrong destination?!?
Я тогда получить полное содержание сообщения, которое является весьма загадочным, но он в основном содержит мои аргументы. Я понятия не имею, как отлаживать это, почему он работает на ЕС, а не на НС.
Застрял на этом в течение многих дней, решения на SO не помогли. Пожалуйста помоги!