2013-03-29 3 views
0

У меня есть кластер c-узлов, которые подключаются к моему экземпляру erlang и должны иметь распределенные между ними сообщения. Мой текущий способ сделать это состоит в том, чтобы иметь -define из списка атомов имени cnode и gen_server, который просто отвечает на запрос имен, поворачивая список и отправляя обратно все, что сейчас находится спереди, и процесс запроса затем взаимодействует с каким бы узлом оно ни было. К сожалению, эти c-узлы очень сильно используются и что gen_server значительно резервируется (оставаясь в очереди около 2k-6k сообщений).Erlang rotating/random global value

Мне интересно, есть ли другой способ «загрузить баланс» через эти c-узлы. Моя первоначальная мысль заключалась в том, чтобы просто выбрать случайный элемент из списка всякий раз, когда процесс должен взаимодействовать с ним, но это кажется мне крайне неэффективным. Есть ли другие методы, о которых я не думаю?

+0

В моем опыте случайное распределение улучшило производительность по круговому распределению. Не отказывайтесь от случайного распределения без запуска и тестов. –

ответ

2

Есть несколько других методов, которые вы можете попробовать:

  1. хеширования - берет идентификатор клиента или что-то уникальное и хэш его по списку вниз серверов потока выбрать
  2. раунда Robin - вы храните все нисходящие серверы в таблице ets и сохраняете с ними последний доступный кортеж. Затем вы захватываете все серверы из таблицы ets и находите наименее недавно используемые, обновляя поле в одно и то же время.
  3. Random - просто выберите один.

Но я должен согласиться с Саурабхом Барджатией.

Не сдавайтесь при случайном распределении без пробега ... контрольных показателей.

Я имел производственную систему, в которой мы пытались сделать циклическую перебор балансировки нагрузки, потому что я думал, что случайное разбиение будет слишком «неэффективным», а не «гладко» достаточно для того, что нам нужно.

После работы через несколько различных решений (ГЭ таблицы, хеширование, gen_server материал в основном выше три с несколькими другими действительно неудобные решения) я попытался следующие из зная, что он не будет работать достаточно хорошо:

Count = length(Targets), 
random:seed(now()), 
Route = lists:nth(random:uniform(Count),Targets), 

После тестирования его локально, а затем в производственной системе, оказалось это было достаточно быстро (если не самый быстрый), и он распределил все гладкой достаточно за то, что нам нужно, и мы из-за этого не имеют проблем с производительностью.

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

+0

Оглядываясь назад, это в основном тот же самый код, в котором мы закончили использование :) –