Я использую простое решение для балансировки нагрузки.Идея состоит в том, что запрос будет иметь целочисленное значение, и на основе этого значения (если оно находится в диапазоне) я выберу правильный процесс для пересылки запроса.
Создание карты
При запуске балансировщик нагрузки обращается к каждому процессу и получает поддерживаемый диапазон.Теперь этот диапазон может перекрывать диапазон другого процесса или быть подмножеством.
Например, рассмотрим следующее
- Процесс A поддерживает 1-5
- Процесс B поддерживает 1-3
- Процесс C поддерживает 3-9
Первоначальное решение, которое у меня было, было создать простой HashMap<Integer, List<Process>>
.Поэтому я переберу диапазон и создам несколько записей для одного и того же процесса.Если для ключа уже существует запись, я добавлю новый процесс в список значений.
Доступ к карте
Когда поступит запрос
- На 1-2 круговой прием на A & B.
- На 3, круговой прием на A, B & C
- На 3-5 на круговой прием на B & C
- Для 6-9, всегда C
Проблема - Обновление карты
Я был в порядке с этим, пока не появился сценарий, в котором я должен обновить некоторые параметры вОбъект процесса, который будет учитываться при будущих запросах.Поэтому, если мне нужно обновить параметр для Процесса C, я должен пройтись по каждой записи Карты, для каждой записи я должен пройти по списку значений и проверить, существует ли этот процесс в списке.Если да, обновите список, а затем обновите карту.И это ConcurrentMap, что означает, что пока я зацикливаюсь, я буду блокировать доступ к карте, пока происходит обновление.
Я пробовал разные решения, чтобы сделать обновление более эффективным, как, например, использование класса Range(int min, int max)
, который реализует Comparable<Range>
, а затем имеет NavigableMap<Range, Process>
.Но это не охватывает каждый сценарий (перекрытие, подмножество Range) для правильного округления кода без пропусков.
Хорошо бы избежать цикла обновления.Есть предложения по лучшему решению?