Лучшая практика Websocket для группового чата / один веб-узел для всех групп или один веб-узел на группу?

Мне нужно реализовать приложение чата с использованием websocket, пользователи будут общаться через группы, могут быть тысячи групп, а пользователь может быть в нескольких группах. Думаю о 2 решениях:

[1] для каждого группового чата я создаю конечную точку websocket (используя camel -mosphere-websocket), пользователи в той же группе могут подписаться на конечную точку группы и отправлять / получать сообщения через эту конечную точку. это означает, что могут быть тысячи конечных точек websocket. Клиентская сторона (скажем, iPhone) должна подписаться на несколько конечных точек wbesocket. это хорошая практика?

[2] Я просто создаю одну конечную точку websocket для всех групп. Клиентская сторона просто подписывается на эту конечную точку, и я сам управляю распределением сообщений на сервере: получаю участников группы, выбираю веб-сокет каждого члена из списка подключенных веб-сокетов, затем пишу сообщение каждому члену через веб-сокет.

Какое решение лучше с точки зрения производительности и его легко реализовать как на клиенте, так и на сервере?

Спасибо.


ИЗМЕНИТЬ 06.10.2015

Я выбрал второй подход и провел тест с клиентом jetty websocket, я использую websocket с верблюжьей атмосферой на стороне сервера. На стороне клиента я создаю подключения к серверу через веб-сокеты в потоках. Возникла проблема с причалом: я могу просто создать около 160 подключений к веб-сокетам (это означает около 160 потоков). В результате я почти не вижу разницы при увеличении количества клиентов с 1 до 160.

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

Если вас интересует тестовый код, вот он: http://www.eclipse.org/jetty/documentation/current/jetty-websocket-client-api.html#d0e22545


person Dzung BUI    schedule 28.09.2015    source источник


Ответы (2)


Думаю, для повышения производительности лучше использовать второй подход. Я использую то же самое для своего приложения, но оно все еще находится на стадии тестирования, поэтому не могу комментировать производительность в реальном времени. Теперь он работает на 10-15 групп и работает нормально. В моем приложении есть такое же условие, как и у вас, при котором пользователь может общаться в чате на основе группы. Я занимаюсь созданием группы на стороне сервера с помощью node.js. Вот код для создания группы, но он предназначен для конкретного условия моего приложения. Просто вставляю сюда для справки. Получение homeState и userId из внешнего интерфейса. Создание группы на основе homeState. Этот код только для примера, он вам не подойдет. Для повышения производительности вы можете использовать clustering.

this.ConnectionObject = function(homeState, userId, ws) {
            this.homeState = homeState;
            this.userId = userId;
            this.wsConnection = ws;
        },

        this.createConnectionEntry = function(homeState, userId,
                ws) {

            var connObject = new ws.thisRefer.ConnectionObject(homeState, userId,
                    ws);
            var connectionEntryList = null;
            if (ws.thisRefer.connectionMap[homeState] != undefined) {
                connectionEntryList = ws.thisRefer.connectionMap[homeState];
            } else {
                connectionEntryList = new Array();
            }
            connectionEntryList.push(connObject);

            console.log(connectionEntryList.length);

            ws.thisRefer.connectionMap[homeState] = connectionEntryList;
            ws.thisRefer.connecteduserIdMap[userId]  = "";

        }
person Kunal Kumar    schedule 28.09.2015
comment
Спасибо, я попробую второй подход, я приму этот ответ, когда у меня будет результат нагрузочного теста. - person Dzung BUI; 30.09.2015

Браузеры реализуют ограничение на количество веб-сокетов, которые могут быть открыты на одной и той же вкладке. Вы не можете рассчитывать на то, что сможете создать как можно больше подключений. Перейти к решению №2

person Lou-adrien    schedule 26.02.2019
comment
У вас есть какой-нибудь источник для этого? Более трех лет назад ОП уже писал, что хочет применить второй подход. - person Nico Haase; 26.02.2019
comment
@NicoHaase Многие ресурсы в Интернете указывают на эти ограничения. Я также добавляю это в качестве ответа, потому что первоначальная причина выбора №2 была основана на анализе производительности, который другие люди, ищущие это, могут не посчитать подходящим в их случае и пропустить это очевидное ограничение stackoverflow.com/questions/26003756/ stackoverflow.com/questions/22866552/ - person Lou-adrien; 28.02.2019