【问题标题】:Large number of WebSocket connections大量 WebSocket 连接
【发布时间】:2012-05-15 03:57:21
【问题描述】:

我正在编写一个应用程序来跟踪在特定任务的用户之间推送的内容。我正在考虑使用 WebSockets 发送新内容,因为它们可供当前使用该应用程序执行该给定任务的所有用户使用。

我在 Rails 上写这篇文章,客户端应用程序在 iOS 上(可能也会在 Android 上)。恐怕这个 WebSocket 解决方案可能无法很好地扩展。在决定使用 WebSockets 还是使用某种轮询解决方案时,我正在寻求一些建议和要考虑的事情。

Ruby on Rails 服务器(如 Heroku)是否支持同时打开大量 WebSocket?为了争论,假设有一百万个连接。任何人都可以向我提供这些东西的任何材料吗?

如果我以这种方式构建服务器托管,是否会花费更多?

是否有可能同时维护数百万个 WebSocket?我觉得这可能不是最好的设计决策。

这是我第一次尝试正确的 Rails API。任何意见是极大的赞赏。谢谢。

【问题讨论】:

  • 根据 Heroku 的说法,你得到(如果我没记错的话)每个 Dyno 约 600 个并发 websocket 连接。一百万个并发连接(同时运行,而不是一般的百万用户)将需要大约 1670 个 Dynos ......这是很多 Dynos,但它也是很多连接。您可能还需要隔离 Redis 和 DB 服务器(或您可能拥有的任何数据收集和 Pub/Sub 解决方案)。

标签: ruby-on-rails ruby html websocket em-websocket


【解决方案1】:

WebSockets 上的数百万个连接,使用 Ruby,如果您不使用集群在不同实例之间传播连接以处理所有数据处理,我看不到它的真实性。
这里的问题是序列化和反序列化数据。

您还必须研究从服务器向客户端提取数据的频率,以及是否值得使用 AJAX 进行定期检查,然后一直处理连接。因为如果你确实处理了连接然后你不使用它 - 这是资源的浪费。 WebSockets 建立在 TCP 层之上,所有连接对于操作系统来说并不“便宜”,并且再次向它们询问可用数据并不是一个简单的过程,如果不使用最先进的技术,有数百万个连接几乎是不可能的事情在世界上。

我认为 Erlang 能够处理数百万个连接,但我没有关于它的详细信息。连接是一回事,另一个是处理数据和连接之间的交互 ​​- 您可能需要检查这一点,因为如果您有繁重的处理算法,那么您肯定需要研究集群解决方案的水平扩展选项。

【讨论】:

  • 您对单个 heroku dyno 可以使用 em-websocket 处理的连接数的最佳估计是多少?
  • 我没有使用 heroku 也没有使用 em-websocket 库。
【解决方案2】:
  • 如果您要实现聊天,请使用 websockets。
  • 如果您要实时实现单向消息,请使用服务器发送的事件。
  • 如果您要实现每隔几个小时左右发送一次的单向消息,请使用 APNS。

俗话说手机在手,用websockets/server发送事件。 手机放在口袋里,使用 APNS。

APNS 将缓解 wifi 下降、tcp/ip 套接字挂起和许多其他问题。真的很有用。有可能需要一点时间才能通过。但是话又说回来,websockets 有可能会占用

最新版本的 iOS 允许您将 APNS 发送到客户端,而不会向客户端弹出消息,以便它可以向服务器询问更多信息。这与一些后台实现一起确实改善了一些事情。

如果可能,不要实现完全匿名的客户端。检测客户端是否重新安装应用程序非常棘手。因此,您最终会向客户端发送重复项。需要考虑到这一点。

APNS 在 ruby​​ 中实现看起来微不足道,但我建议避免这种冲动并使用支持 google 和 apple 的现有 gem/服务。实现起来比最初看起来要复杂得多。

如果您决定坚持使用 websockets,那么在 nginx 中使用 websockets 可能是有意义的,例如 https://github.com/wandenberg/nginx-push-stream-module

旁白: 在速度至关重要的情况下使用 SMS 非常昂贵。每个电话号码每月 1 美元只能发送每秒 1 条消息的最大速率。所以每秒发送 100 条消息 = 100 美元/月加上消息费。请注意,以 50 条消息/秒的速率发送 100 条消息 = 50 美元/月。但是如果要发送 1k 条消息,则需要 20 秒。

祝你好运

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-03
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    相关资源
    最近更新 更多