Какая самая лучшая, самая эффективная техника для клиентского пула с Erlang - PullRequest
7 голосов
/ 01 февраля 2012

Я настоящий новичок в Erlang (начался 1 неделю назад), и я пытаюсь выучить этот язык, создав небольшой, но эффективный чат-сервер. (Когда я говорю «эффективный», я имею в виду, что у меня есть 5 серверов для стресс-тестирования с сотнями тысяч подключенных клиентов - миллион был бы отличным!)

Я нашел некоторые учебники, которые делают это, единственное, что каждый учебник, который я нашел, похож на IRC. Если один пользователь отправит сообщение, его получат все пользователи, кроме отправителя. Я бы хотел немного это изменить и использовать обсуждение один на один.

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

У кого-нибудь были бы какие-нибудь предложения сделать это?

РЕДАКТИРОВАТЬ:

У каждого подключенного клиента есть идентификатор.

Когда пользователь подключен, он сначала отправляет команду входа в систему, чтобы дать ему идентификатор. Когда пользователь хочет отправить сообщение другому, оно выглядит следующим образом

[ID-NUMBER][Message] %% ID-NUMBER IS A FIXED LENGTH

Когда я спрашиваю «самый эффективный пул клиентов», я на самом деле ищу самый быстрый способ извлечь / добавить / удалить одного клиента в списке подключенных клиентов, который потенциально может быть большим (сотни тысяч - возможно, миллионы) )

РЕДАКТИРОВАТЬ 2:

Для ответа на некоторые вопросы:

  • Я использую Raw Socket (сейчас использую telnet для связи с сервером) - возможно, перейду на ssl позже ...
  • Это мой собственный протокол
  • Каждый клиент является порожденным Pid
  • Pid каждого клиента связан с его собственным монитором (в основном по причине отладки - клиент, если он отключен, должен заново подключиться с помощью собственной аутентификации с нуля)
  • Я прочитал пару книг перед тем, как начать кодирование, так что я пока не осваиваю все аспекты Erlang, но я не знаю об этом, я буду читать больше об этом, когда это будет необходимо.
  • То, что я действительно ищу, - это лучший способ хранения и поиска идентификаторов PID для отправки сообщений непосредственно из процесса в процесс.

Должен ли я написать свою собственную клиентскую функцию поиска, используя списки?

или я должен использовать ets?

Или даже использовать register / 2 unregister / 1 и whereis / 1 для ведения моего списка клиентов, используя его уникальный идентификатор в качестве атома, кажется, это самый простой способ сделать это, я действительно не знаю, насколько это эффективно , но я уверен, что это ужасное решение ;-)?

Ответы [ 3 ]

2 голосов
/ 02 февраля 2012

Я тоже новичок в Erlang (пару месяцев), поэтому я надеюсь, что это поможет вам выбрать правильный путь:)

Прежде всего, поскольку вы "новичок", вы должны знать об этих сайтах:

Что касается нестабильной базы данных, я бы предложил модули sets или gb_sets (документация здесь ).

Если вам нужна настойчивость, вам следует попробовать dets (см. Документацию выше), но я не могу ничего сказать об эффективности, поэтому вам следует изучить эту тему немного дальше.

В книге Learn You Some Erlang есть глава о структурах данных , в которой говорится, что sets лучше для систем с интенсивным чтением, тогда как gb_sets больше подходит для сбалансированного использования.

1 голос
/ 02 февраля 2012

Теперь системы обмена сообщениями - это то, что все хотят делать, когда приезжают в Эрланг, потому что они естественным образом смешиваются. Тем не менее, есть несколько вещей, которые нужно изучить, прежде чем продолжить. Обмен сообщениями в основном включает в себя следующие вещи: User Registration, User Authentication, Sessions Management, Logging, Message Switching/routing e.t.c.

Теперь, чтобы выполнить все или большинство из них, нужно иметь базу данных, конечно, IN-MEMORY, что приводит меня к Mnesia или ETS Tables. Так как вы новичок в Erlang, я полагаю, вы еще не освоили работу с ними. В какой-то момент вам нужно будет поддерживать Who is communicating with who, Who is available for Chat e.t.c. Следовательно, вам может понадобиться найти что-нибудь и написать куда-нибудь.

Другое дело, что вы не сказали нам, Клиент. Это будет веб-клиент (HTTP), это совершенно новый протокол, который вы реализуете через raw Sockets? Как бы то ни было, вам нужно освоить то, что называется: Concurrency in Erlang. Если пользователь подключается и ему назначается ID, если ваш дизайн A process Per User, то вам придется сохранить Pids этих процессов или зарегистрировать их по некоторым критериям, и еще раз контролировать их, если они умирают e.t.c. Что приводит меня к OTP и Supervision trees. Однако, есть довольно много, расскажите нам больше о взаимодействии Клиента и Сервера, о Сетевой Связи, в которой вы нуждаетесь, например. Или это простой RPC-проект Erlang, который вы делаете для своей ревизии?



РЕДАКТИРОВАТЬ

Используйте ETS Tables или Mnesia RAM tables. Не думайте регистрировать эти Pids или хранить их в списке, массиве или наборе. Посмотрите на это решение , которое было дано на этот вопрос

1 голос
/ 02 февраля 2012

Я делаю что-то похожее на вашу программу чата, используя gproc в качестве pubsub (аналогично демонстрации на этой странице).Каждый клиент регистрируется как его идентификатор.Чтобы найти конкретного клиента, вы делаете поиск по этому идентификатору клиента.Чтобы подписаться на клиента, вы добавляете в этот процесс свойство идентификатора клиента, на который вы подписаны.Чтобы опубликовать, вы вызываете gproc: send (ClientId, Message).Это касается вашего варианта использования, более общего чата на основе комнаты, и может обрабатывать распределенный системный реестр процессов без хозяина.

Я не проверял, масштабируется ли он до миллионов, но он использует ets для выполненияХранилище и gproc - надежный код Ульфа Вигера.Я бы не рассчитывал написать лучшую реализацию.

...