大量的WebSocket连接

7

我正在编写一个应用程序,用于跟踪在某个任务的用户之间推送的内容。我考虑使用WebSockets将新内容发送给所有当前使用该任务应用程序的用户。

我正在使用Rails编写此应用程序,客户端应用程序在iOS上(可能也会在Android上)。我担心这种WebSocket解决方案可能无法很好地扩展。在决定是否使用WebSockets与某种轮询解决方案时,我需要一些建议和要考虑的事情。

像Heroku这样的Ruby on Rails服务器是否支持同时打开大量的WebSockets?假设有一百万个连接,任何人都可以为我提供这样的材料吗?

如果我按照这种方式设计,它会在服务器托管上花费更多吗?

同时维护数百万个WebSockets是否可行?我觉得这可能不是最佳设计决策。

这是我第一次尝试一个合适的Rails API。非常感谢任何建议。谢谢。


根据Heroku的说法,每个Dyno最多可以获得(如果我没记错的话)约600个并发WebSocket连接。一百万个并发连接(同时运行,而不是一百万个用户)需要大约1670个Dynos……这是很多Dynos,但也是很多连接。您可能还需要将Redis和数据库服务器隔离开来(或任何数据收集和发布/订阅解决方案)。 - Myst
2个回答

3
  • 如果你正在实现聊天功能,请使用Websockets。
  • 如果你正在实现实时单向消息,请使用服务器推送事件。
  • 如果你正在实现每隔几个小时发送一次的单向消息,请使用APNS。

俗话说,手机在手,使用Websockets/服务器推送事件。手机在口袋里,使用APNS。

APNS可以缓解WiFi波动、TCP/IP套接字挂起和许多其他问题。非常有用。可能需要一些时间才能完成。但是,Websockets也可能需要一些时间。

iOS的最新版本允许您向客户端发送APNS而无需弹出消息,以便它可以向服务器请求更多信息。加上一些后台实现,这真的会改善事情。

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

在Ruby中实现APNS似乎很简单,但我建议避免冲动,转而使用现有的支持谷歌和苹果的gem/service。一开始它比看起来要棘手得多。

如果你决定坚持使用Websockets,可能有意义的是,只需利用nginx中的Websockets,如https://github.com/wandenberg/nginx-push-stream-module

旁注: 在需要速度的情况下使用短信非常昂贵。每个电话号码每月1美元仅发送最大速率为1条消息。因此,每秒发送100条消息=每月100美元加上消息费用。请注意,每秒发送50条消息的100条消息=每月50美元。但如果您想发送1k条消息,则需要20秒。

祝你好运


3

在使用Ruby进行WebSocket的百万连接时,如果您没有使用集群来在不同实例之间分发连接以处理所有数据处理,我无法看到它的真实性。问题在于序列化和反序列化数据。

此外,您还需要研究从服务器定期向客户端拉取数据的频率,并且是否值得仅使用AJAX进行周期性检查,然后处理整个连接。因为如果您处理连接,然后不使用它 - 这是浪费资源。WebSockets建立在TCP层之上,而所有连接都不是“廉价”的,因为再次通过OS查询可用数据也不是简单的过程,在有数百万个连接的情况下,这几乎是不可能的,除非使用世界上最先进的技术。

我曾听说Erlang可以处理数百万个连接,但我没有详细了解过。另一个问题是处理数据和连接之间的交互 - 您可能需要检查这一点,因为如果您具有重型处理算法,则绝对需要查看水平扩展选项,以获得聚类解决方案。


你认为一个单独的Heroku Dyno能够使用em-websocket处理多少个连接?请给出你的最佳估计。 - Jonah
我之前没有使用过Heroku或em-websocket库。 - moka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接