所以我写了这个很好的SAAS解决方案并得到了一些真正的客户。现在,客户端发出了一个请求,要求添加一些需要websockets的功能。
为了保持整洁,我想使用另一台服务器来管理websockets。
我当前的堆栈是一个AWS应用程序负载均衡器,后面是两个服务器 - 一个是当前的应用程序服务器。这是一个运行应用程序的PHP Web服务器。
客户端由AngularJS驱动。
第二台服务器(尚不存在)将转到Nginx,会话将存储在第三台Memcache服务器上。
Websocket和应用程序服务器都在同一个域上,使用不同的端口将请求发送到正确的服务器(AWS ELB允许通过端口向不同的服务器组发送请求)。应用程序和websockets都将由PHP和Ratchet驱动。
我的问题是两个:
请注意我是websockets的新手,所以也许有更好的方法可以做到这一点 - 我会感激任何想法。
答案 0 :(得分:1)
我正在使用Ratchet和SPA来为网络应用程序提供动力。我使用Traefik作为前端代理,但是,Nginx在这里很受欢迎,我相信这样会好的。我喜欢Traefik能够根据配置文件更改,API触发器和Kubernetes等配置更改无缝重定向流量。
我同意Michael的意见 - 使用80或443以外的网络套接字端口可能会导致用户遇到连接问题。家庭连接在非标准端口上通常很好,但公共wifi,商业防火墙和移动数据都可能存在问题,最好不要冒险。
在完成了一些阅读之后,您的5,000个并发连接可能需要进行操作系统级调整。我似乎记得1,024个连接可以轻松完成,但是这个级别需要多次测试(e.g. see here,但请注意评论流可以追溯到几年)。也许您可以设置一个测试工具,在您的应用程序中触发Web套接字请求,例如使用两个Docker容器?这将为您提供一种方法来了解您将在这种规模上遇到的限制。
鉴于任何给定的用户群通常不会同时存在,您的最大并发用户数会让我觉得您的工作规模非常大。你可以做的一件事(我计划在我的情况下做同样的事情)是在你的前端添加一个重新连接策略,进行少量的重试,然后弹出一个手动重新连接盒(Trello做这样的事情)。鉴于某些连接将是片状的,给他们中的一些人留下死亡的机会可能是一个好主意,因此你需要更少的连接来管理。您也可以在前端添加空闲计时器,以避免无意义地保持未使用的连接处于打开状态。
如果你想进行一些功能测试,可以考虑使用PhantomJS - 我在这里使用PHPUnit Spiderling,并且网络套接字似乎工作正常(到目前为止我只尝试过一次,请注意)。
有几个PHP库可以发送Web套接字请求。我使用Websocket Client for PHP,到目前为止它对我来说完美无缺。