2016-03-04 147 views
0

我一直在使用Google,我对此有点困惑。几乎所有我读过的关于它的东西都有1个用例,但它对我来说似乎并不是最好的。也许它是?不确定。可伸缩Websockets - 我很困惑

让我先设置环境: 的前端被AngularJS 通过Laravel供电(我们会打电话给他们一个& B)的两个后端的API供电。

现在,所有这3个规模都是相互独立的。每个人都在自己的码头集装箱。每个处理路由和任何事情的前面都有负载平衡器。我正在为我的数据库使用RDS。

现在,我通常看到的方式是使用负载均衡器的hash-ip函数,以便您只需连接到处理所需web服务器事件的服务器即可。

那么,这并不像我想要的那样。真的,长轮询似乎是我想要的,但我想也许我可以让websocket工作。基本上,任何时候任何人在任何一个API上改变任何东西,都会触发一个事件。然后我需要所有的前端进行更新。现在据我所知,websockets使用redis来跟踪事件。

如果它确实使用redis,那么如何在多台服务器上缩放redis?或者,如果使用elasticache之类的东西更容易,那么我就不必处理那部分?

这一切基本上是真的吗?我的思路是否正确?

感谢您的关注。对不起,如果它有点流言蜚语或困惑。我仍然不清楚,所以我写的所有内容都只是我的想法。

+1

的WebSockets自己什么都没有做的Redis。有一个socket.io(使用webSockets)的多服务器实现,它使用redis来存储状态。在那个实现中,有一个中央redis存储库,扩展中涉及的所有服务器都可以咨询,以便与可能连接到不同服务器的用户进行通信。你可以阅读关于redis/socket.io的组合[这里](http://socket.io/docs/using-multiple-nodes/)。 – jfriend00

+0

我想通了。只有几个额外的步骤,我没有看到。 – Kenyon

回答

0

我想通了。我会为任何碰巧遇到此问题的人发布答案。

所有这些都可以像我需要的那样独立缩放。但它有点令人困惑,而且我在使用Docker,所以我的答案也会涉及到这一点。

在Laravel上,我只是设置了Events。他们被发送到Redis实验室的Redis服务器。

在我的前端docker上,有一个AngularJS应用程序,并且websocket.js服务器通过端口3000上的节点运行。容器上有Nginx服务它们,AngularJS协议只是一个普通的服务器指令。节点的一个,是一个代理pass目录,所以端口80工作正常,但它被转发到后端的端口3000。

websocket.js服务器端部分连接到Redis Labs上的同一Redis服务器。

AngularJS应用程序是使用websockets客户端代码的应用程序。

现在有另一个docker容器运行负载平衡的nginx服务。所以,负载均衡器是所有websocket,api和前端URL经历的负载均衡器。

将websocket.js放入它自己的容器并单独调整它可能会更好。但是,现在,我认为将前端和websocket.js扩展到一起将工作得很好。

这是我如何做的概述。我也用了很多的东西从这里:

https://laracasts.com/discuss/channels/general-discussion/step-by-step-guide-to-installing-socketio-and-broadcasting-events-with-laravel-51

https://www.nginx.com/blog/nginx-nodejs-websockets-socketio/