существует поток задач приходящих от UI. каждая задача имеет приоритет и может выполняться некоторое продолжительное время без гарантии удачного выполнения. Задачи поступают в приоритетную очередь, откуда раздаются специальным исполнителям. Каждый исполнитель имеет ограничение по количеству одновременных задач, которых он может исполнять. Так же существует ограничение на количество задач, которые очередь может предоставлять.
Например в очередь 600 задач, и два исполнителя. сама очередь имеет ограничение в 400 одновременных задач, а исполнители 100 и 500 соответственно. Это значит, что очередь передаст 100 задач первому исполнителю и 300 второму, несмотря на то, что у второго остались слоты для исполнения.
Важным условиям является то, что задачи должны проводить минимально возможное время в очереди, а вот сколько времени они проведут в исполнителе не так важно. Так же пока задача находится в очереди и не была передана исполнителю ее приоритет может измениться или задача может быть отменена.
Мне не очень нравится, что очередь раздает задачи исполнителям, но таково требование и с этим я ничего не могу поделать(мне кажется правильней, что бы исполнители сами разбирали задачи)
Вопрос в том, как реализовать такую очередь лучше всего?
пока что все реализовано на несортированном списке, который сортируется каждый раз, как нам надо выдать очередную задачу. это не так страшно, так как ожидаемое количество задач пока что не велико(не больше 10к), но все же уверен, что можно сделать лучше. первое что мне пришло в голову - rxjava2, но там, на сколько мне известно, нельзя задать приоритет сообщению(или таки можно?). с помошью фильтров можно пытаться выципить задачи с наименьшим приоритетом, например. Есть ли иные способы и идеи?