Алгоритм балансировки нагрузки типа, Карта, эффективный алгоритм обновления - PullRequest
0 голосов
/ 15 октября 2011

Я использую простое решение для балансировки нагрузки.Идея состоит в том, что запрос будет иметь целочисленное значение, и на основе этого значения (если оно находится в диапазоне) я выберу правильный процесс для пересылки запроса.

Создание карты
При запуске балансировщик нагрузки обращается к каждому процессу и получает поддерживаемый диапазон.Теперь этот диапазон может перекрывать диапазон другого процесса или быть подмножеством.

Например, рассмотрим следующее

  • Процесс 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) для правильного округления кода без пропусков.

Хорошо бы избежать цикла обновления.Есть предложения по лучшему решению?

1 Ответ

0 голосов
/ 20 октября 2011

Вы пробовали LinkedHashMap? TreeMap также может помочь в вашем случае. Кроме того, существует коллекция общих ключей MultiKeyHashMap, которая позволяет поддерживать несколько ключей для одного значения.

...