В данный момент я пытаюсь внедрить балансировщик нагрузки и немного ударил по скорости. Ситуация следующая (упрощенно),
- У меня есть очередь запросов queue_a, которые обрабатываются worker_a.
- Существует вторая очередь запросов queue_b, которые обрабатываются worker_b.
- И у меня есть третья очередь запросов queue_c, которая может идти к любому из рабочих
Причина такой настройки в том, что у каждого воркера есть уникальные запросы, которые может обработать только он, но есть и общие запросы, которые может обработать любой.
Я собирался реализовать это, используя 3 экземпляра C5 IntervalHeap. Каждый работник будет иметь доступ к своей локальной очереди + к общим очередям, частью которых он является (например, worker_a может видеть queue_a и queue_c).
Проблема с этой идеей заключается в том, что если есть запрос в локальной очереди и запрос в общей очереди (очередях) с одинаковым приоритетом, невозможно узнать, какой из них должен быть обработан первым (обычно IntervalHeap обрабатывается в порядке очереди). первая подача, когда это произойдет).
РЕДАКТИРОВАТЬ: я обнаружил, что IntervalHeap не работает в порядке очереди с запросами с одинаковым приоритетом!
Я хотел бы свести к минимуму блокировку очередей, поскольку это будет относительно высокой пропускной способностью и чувствительным ко времени, но единственный способ, который я могу придумать на данный момент, будет включать гораздо большую сложность, когда третья очередь удаляется, а общие запросы помещаются в обе. очередь_а и очередь_б. Когда запрос всасывается, он узнает, что это общий запрос, и должен удалить его из других очередей.
Надеюсь, что это объясняет это достаточно ясно!