【问题标题】:Adding websockets to existing application将 websocket 添加到现有应用程序
【发布时间】:2017-10-26 00:17:34
【问题描述】:

所以我编写了这个不错的 SAAS 解决方案并获得了一些真正的客户。现在客户端请求添加一些需要 websockets 的功能。

为了保持整洁,我想使用另一台服务器来管理 websocket。

我当前的堆栈是一个 AWS 应用程序负载均衡器,在它后面有两台服务器 - 一台是当前的应用程序服务器。这是一个运行应用程序的带有 PHP 的 Apache Web 服务器。

客户端由 AngularJS 驱动。

第二台服务器(尚不存在)将转到 Nginx,会话将存储在第三台 Memcache 服务器上。

Websocket 和应用程序服务器都在同一个域中,使用不同的端口将请求发送到正确的服务器(AWS ELB 允许通过端口将请求发送到不同的服务器组)。应用程序和 websocket 都将由 PHP 和 Ratchet 驱动。

我的问题有两个:

  • 适用于更有经验的开发人员 - 这样的架构听起来合理吗(我的目标还不是 100K 并发 - 我需要一个可行且经济实惠的解决方案,目标是在这个阶段最大 5000 个并发)。
  • 将请求从应用程序服务器(谁具有生成请求的逻辑)发送到 websocket 服务器的最佳方式是什么?

请注意,我是 websockets 的新手,所以也许有更好的方法可以做到这一点 - 如有任何想法,我将不胜感激。

【问题讨论】:

  • “Websocket 和应用程序服务器都在同一个域中,使用不同的端口将请求发送到正确的服务器。” 使用 ALB 而不是 ELB可以路由到基于 path... 的适当后端,并且您的 cookie 将正常工作。单独的端口会带来无数的复杂性和故障排除麻烦。

标签: php amazon-web-services websocket


【解决方案1】:

我正在使用带有 SPA 的 Ratchet 来为 Web 应用程序提供动力。我使用Traefik 作为前端代理,但是是的,Nginx 在这里很流行,我相信这会很好。我喜欢 Traefik,因为它能够根据配置文件更改、API 触发器和来自 Kubernetes 之类的配置更改无缝重定向流量。

我同意 Michael 在 cmets 中的观点 - 使用 80 或 443 以外的 Web 套接字端口可能会导致您的用户遇到连接问题。家庭连接在非标准端口上通常很好,但公共 wifi、商业防火墙和移动数据都可能出现问题,最好不要冒险。

在阅读了一些资料后,您的 5,000 个并发连接可能需要进行操作系统级别的调整。我似乎记得可以轻松完成 1,024 个连接,但需要多次测试该级别(e.g. see here,但请注意评论流可以追溯到几年前)。也许您可以设置一个测试工具来在您的应用程序中触发 Web 套接字请求,例如使用两个 Docker 容器?这将让您了解在这种规模下会遇到什么限制。

考虑到任何给定的用户群通常不会同时全部上线,您的最大并发用户数让我印象深刻,您的工作规模绝对是巨大的。你可以做的一件事(我打算在我的例子中做同样的事情)是在你的前端添加一个重新连接策略,它会进行少量重试,然后弹出一个手动重新连接框(Trello 会这样做)。鉴于某些连接会不稳定,最好让其中一些连接有机会消失,这样您需要管理的连接就更少了。您还可以在前端添加一个空闲计时器,以避免毫无意义地保持未使用的连接打开。

如果你想做一些功能测试,可以考虑 PhantomJS - 我在这里使用PHPUnit Spiderling,而且网络套接字似乎工作正常(我一次只尝试过一个,请注意)。

有几个 PHP 库可以发送 Web 套接字请求。我使用Websocket Client for PHP,到目前为止它对我来说完美无缺。

【讨论】:

    猜你喜欢
    • 2017-05-10
    • 2012-01-27
    • 1970-01-01
    • 2016-06-25
    • 2014-11-26
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多