каждый на своем инстансе.
1 клиент может в какой то момент времени накидать тяжелых задач в очередь,
воркеры будут заняты задачами 1 го клиента например 30 мин, в это же время 2й, 3й клиент закинут свои маленькие задачи в очередь, но им придется ждать завершения обработки 1го клиента.
Заставлять ждать других клиентов нельзя.
Как бы вы решили такую задачу? Как вообще принято их решать?
Пока решил ручным решением, что задачи клиентов закидываются в очередь порционно, а не все сразу, что позволит другим клиентам втиснуться в промежутки. Размер порции лимитировано зависит от количества всех задач в обработке и максимум зависит от количества воркеров.
Мне кажется, это такая же задача, как например, на балансере выбор сервера
У меня воркер может взять только 1 задачу из очереди, когда закончит - возьмет другую. Баланса по ресурсам не нужно пока.
Сделать приоритетные очереди по размеру задач.
Мб это можно как-то асинхронить? Бить задачи на примерно одинаковые по времени выполнения части и асинхронно обрабатывать
Так это все в паралель на разных инстансах.
Так у него уже асинхроно очередь же)
не вникая - плюс-минус приемлимое решение. Возможно я бы имел некий механизм посредине, что считал бы "бюджет" задач на единицу времени для тенанта и решал пушить ли задачу непосредственно в работу, или придержать ещё немного. Также при сильном росте можно пробовать считать объемы задач по большим клиентам и расселять их равномерно с маленькими по разным очередям. Ключевые слова, что могут помочь найти в интернетах опыт других: - multi tenancy - queue - task balancer Одна из ссылок (не вчитывался): https://medium.com/thron-tech/multi-tenancy-and-fairness-in-the-context-of-microservices-sharded-queues-e32ee89723fc UPD: вот сам амазон ещё написал что-то релевантное https://aws.amazon.com/ru/blogs/apn/using-amazon-sqs-in-a-multi-tenant-saas-solution/
Очень полезно. Нужно бы раньше ознакомиться. Понял, что моя проблема называется “noisy neighbor”
Обсуждают сегодня