Приложение для приватного чата с использованием Play 2.3 Websocket

Я работаю над приложением чата, используя WebSockets (в Play 2.3 с scala). Сообщение должно быть передано всем пользователям или определенному набору пользователей на основе входящего сообщения. Один пользователь может участвовать более чем в одном групповом чате и общаться с отдельными людьми одновременно.

Concurrent.broadcast[JsValue] возвращает кортеж(enumerator, channel). Я не знаю, как применить фильтр к этому каналу, поэтому сообщение получит только определенная группа клиентов.

Мы можем применять фильтры к перечислителю, например (перечислитель &> Enumeratee.filter[JsValue] {...}). но мы не можем отправлять сообщения через этот перечислитель.

Я не хочу анализировать сообщение на стороне клиента. Мой код выглядит так,

val (public_enumerator, public_channel) = Concurrent.broadcast[JsValue]

def chat = WebSocket.using[JsValue] { request =>

       val in = Iteratee.foreach[JsValue]{ msg =>

            public_channel.push(msg)

        }.map { _ =>

            // Quit connection
        }
        (in ,public_enumerator)
}

Большинство примеров, которые я нашел в Интернете, используют устаревшие методы, некоторые из них удалены в Play 2.3 (например, Enumerators.imperative). Я не знаю, как работает Concurrent.unicast.

Я хотел бы знать, есть ли другой способ сделать то же самое с помощью Актеров. Мне также хотелось бы знать, что этот дизайн выдержит более высокую нагрузку (более 1000 пользователей). Спасибо.


person S.Karthik    schedule 02.07.2014    source источник


Ответы (1)


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

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

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

В документации есть несколько примеров кода с websockets+actors: http://www.playframework.com/documentation/2.3.x/ScalaWebSockets

person johanandren    schedule 02.07.2014