需要使用Redis/ZeroMQ后端,即可重用WebSocket连接服务器

需要使用Redis/ZeroMQ后端,即可重用WebSocket连接服务器,websocket,redis,scalability,zeromq,Websocket,Redis,Scalability,Zeromq,我需要水平可扩展的WebSocket连接服务器,用于类似聊天的系统,其中连接到不同WebSocket服务器的浏览器客户端可以在单独的聊天室中交换消息 Clients HaProxy WebSocket server1 WebSocket server2 Redis/ZeroMQ | | | | client A ----=------------>o<

我需要水平可扩展的WebSocket连接服务器,用于类似聊天的系统,其中连接到不同WebSocket服务器的浏览器客户端可以在单独的聊天室中交换消息

Clients    HaProxy  WebSocket server1   WebSocket server2    Redis/ZeroMQ
             |             |                 |                   |
client A ----=------------>o<----------------|------------------>|
             |             |                 |                   |
client B ----=-------------|---------------->o<----------------->|
             |             |                 |                   |
客户端HaProxy WebSocket服务器1 WebSocket服务器2 Redis/ZeroMQ
|             |                 |                   |
客户机A---=--->o|
|             |                 |                   |
客户机B---=--------------|------------->o|
|             |                 |                   |
这里
客户端A
客户端B
通过
HaProxy
连接到两个不同的
WebSocket服务器
,它们通过
Redis/ZeroMQ
后端交换消息,如和问题

考虑到构建这种体系结构,我想知道是否已经有了一个开源的模拟。您建议看什么样的项目?

看看Ruby框架。我是作者,它内置了自动Redis可伸缩性

(您只需使用REDIS URL设置
ENV['PL\u REDIS\u URL']

至于实现这一点的架构,它相当简单。。。我想

每个服务器实例“订阅”两个通道:一个用于“广播”的全局通道(发送给所有用户或一大“用户家庭”的消息)和一个用于“单播”的唯一通道(用于连接到服务器的特定用户的消息)

每个服务器管理它的内部广播系统,以便消息被路由到特定的用户,连接到一个连接的家庭或所有的用户,就像他们的目标受众一样。

您可以找到源代码。Redis集成是使用与一起处理的

Web套接字广播使用这两种方法进行处理。Idio服务器使用处理每个服务器实例内的内部广播

我已经发布了内部流程架构的详细信息

我认为socket.io还支持跨服务器

编辑(一些代码) 由于评论,我想我应该加入一些代码。。。如果您编辑您的问题并添加有关您正在寻找的功能的更多规范,我可以在这里编辑代码

我使用术语“房间”,因为这就是您所指的,尽管我没有将Plezi设想为一个“聊天”框架,但它是一个非常简单的用例,可以演示它的实时能力

如果您使用的是Ruby,则可以在
irb
终端中运行以下操作(请确保首先安装Plezi):

您可以通过连接到:ws://localhost:3000/昵称/myroom来测试它

要连接到多个“房间”(需要重新编写JSON和多房间的代码),请尝试:ws://localhost:3000/昵称/myroom,your_room

通过连接到ws://localhost:3000/echo来测试echo


请注意,echo的作用是不同的,它允许您针对不同的问题使用不同的WebSocket,例如,一个连接使用JSON进行更新和消息,另一个连接使用WebSocket上的原始二进制数据进行多文件上传。

它看起来像是另一个广播聊天。似乎我需要其他东西,或者我不知道如何管理单独的房间。你可以使用不同的连接路由,使用不同的控制器来管理“房间”。这些“房间”可以相互通信,可以向房间中的每个人发送消息,也可以针对特定的连接(或单个连接),而不管他们连接到哪个“房间”。很高兴,@zuba:)
require 'plezi'
class MultiRoom
    def on_open
        return close unless params[:room] && params[:name]
        @name = params[:name]
        puts "connected to room #{params[:room]}"
        # # if you use JSON to get room data,
        # # you can use room arrays like so:
        # params[:room] = params[:room].split(',') unless params[:room].is_a?(Array)
    end
    def on_message data
        to_room = params[:room]
        # # if you use JSON you can try:
        # to_room = JSON.parse(data)['room'] rescue nil
        # # we can use class `broadcast`, to broadcast also to self
        MultiRoom.broadcast :got_msg, to_room, data, @name if to_room
    end
    protected
    def got_msg room, data, from
        write ::ERB::Util.html_escape("#{from}: #{data}") if params[:room] == room
        # # OR, on JSON, with room arrays, try something like:
        # write data if params[:room].include?(room)
    end
end
class EchoConnection
    def on_message data
        write data
        MultiRoom.broadcast "myroom", "Echo?", "system" if data == /^test/i
    end
end
route '/echo', EchoConnection
route '/:name/(:room)', MultiRoom
# # add Redis auto-scaling with:
# ENV['PL_REDIS_URL'] = "redis://:password@my.host:6389/0"
exit # if running in terminal, using irb