Как разграничить настройками очереди и выполнения воркеров так, чтобы короткие задачи не стояли в очереди из-за долгих задач?Общее описание
Написан Restful бекенд на фласке. 3 эндпоинта. Работают асинхронно через один порт.
2 из них обрабатывают задачу быстро, 1 - долго. Нужно их разделить так, чтобы для коротких задач всегда был воркер который будет обрабатывать задачу, как только она приходит.
Могу запустить через 2 порта. Но внешний сервер шлет запросы на один порт.
Сейчас 2 независимые очереди, но задачи в них выполняются в общем порядке, то есть короткие задачи ждут своей очереди, как я понимаю воркеры у них общие.
Заранее спасибо за помощь.
Через Nginx настроен реверс прокси.
Настройки сервера и очереди сообщений:
from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy
from flask_rest.celery_pack import make_celery
from flask_migrate import Migrate
from kombu import Queue, Exchange
app = Flask(__name__)
app.config.from_object('config')
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///mapping_status.db"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config.update(
CELERY_BROKER_URL='redis://localhost:6379',
CELERY_RESULT_BACKEND='redis://localhost:6379',
CELERY_QUEUES = (
Queue('long', Exchange('long'), routing_key='long'),
Queue('short', Exchange('short'), routing_key='short'),
),
# CELERY ROUTES
CELERY_ROUTES = {
'flask_rest.flask_rest_release1.map_this': {'queue': 'long'},
'flask_rest.flask_rest_release1.map_annul_dd': {'queue': 'short'},
'flask_rest.flask_rest_release1.map_fns_dd': {'queue': 'short'}
}
)
api = Api(app)
db = SQLAlchemy(app)
migrate = Migrate(app, db)
celery = make_celery(app)
from flask_rest.flask_rest_release1 import long_task, short_task_1, short_task_2
api.add_resource(long_task, '/long_task')
api.add_resource(short_task_1, '/short_task_1')
api.add_resource(short_task_2, '/short_task_2')
настройки UWSGI
[uwsgi]
master = true
http-socket = 0.0.0.0:8000
chdir = /root/to/chdir
smart-attach-daemon = celery_worker/all_queue.pid celery -A flask_rest.celery worker -Q long, short -E -n program_with_tasks --pidfile celery_worker/all_queue.pid
touch-reload = uwsgi_dev_1.ini
workers = 1
processes = 2
chmod-socket = 777
wsgi-file = run.py
callable = app
task_acks_late = True
task_track_started = True
; daemonize = uwsgi_dev_1.log
CELERYD_MAX_TASKS_PER_CHILD = 1
CELERY_CREATE_MISSING_QUEUES = True