Разработка шаблона проектирования чат-сервера с помощью erlang

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

посмотрите на user_handler, это рабочий процесс, который создает несколько связанных пользовательских процессов и сохраняет идентификаторы этих процессов в таблице ets на основе запроса на вход.

Но моя проблема в том, что если с моего веб-сервера на мой user_handler поступает много одновременных запросов, то обработка этих сообщений будет медленной. правильно?

Например, прямо сейчас, если пользователь с идентификатором 2 отправляет сообщение пользователю 3, я звоню. user_handler:send_message(SenderId = 2, SendTo = 3, Message), тогда мой обработчик пользователя захватывает идентификатор процесса пользователя с идентификатором 2 и вызывает user:send_message(Pid, SendTo = 3, Message). Где user:send_message/3 получает идентификатор процесса пользователя 3, затем проверяет другие условия и, наконец, отправляет сообщение идентификатору процесса пользователя 3.

Ну, я не думаю, что это хорошая архитектура.

Поэтому любое предложение будет ценным.

Спасибо и извините за мой плохой английский.

Шаблон, который я создал в настоящее время


person Akash Bose    schedule 17.08.2017    source источник


Ответы (1)


Не сохраняйте всю информацию о сеансе в одном коде процесса, просто сохраните информацию о каждом сеансе в его состоянии init и удалите информацию о сеансе в состоянии terminate.

Я не знаю, что вы используете, но если вы работаете с сокетом TCP и беспокоитесь о приеме новых подключений, я рекомендую использовать Sockerl, в его серверной архитектуре у вас может быть много акцепторов, принимающих соединения одного сокет-сервера, каждый акцептор имеет свой собственный пул для соединений, которые он принимает:

Sockerl

person Pouriya    schedule 18.08.2017
comment
Да, это хорошая идея, и я думаю об этом, посмотрим. Но можете ли вы сказать, как я могу предотвратить другой запрос на вход, пока текущий пользователь входит в систему? Не вызовет ли это какое-то состояние гонки? - person Akash Bose; 18.08.2017
comment
Например, вы можете использовать Mnesia, в поведении sockerl вы можете проверить mnesia (использовать ее транзакции) на наличие пользователя после получения запроса на вход. - person Pouriya; 18.08.2017
comment
Хорошо, я дам вам знать, что я сделал. Спасибо. :) - person Akash Bose; 19.08.2017