通知系统 - Socket.io 还是 Ajax?
Posted
技术标签:
【中文标题】通知系统 - Socket.io 还是 Ajax?【英文标题】:Notification System - Socket.io or Ajax? 【发布时间】:2015-10-02 18:57:26 【问题描述】:我正在使用 Laravel5,并且我想为我的(网络)项目创建一个通知系统。我想要做的是,通知用户有新的通知,例如;
另一个用户开始关注他, 另一位用户在他的墙上写字, 另一个用户给他发消息等,(可能通过下拉菜单突出显示标题上的图标。例如 ***)。
我发现了关于 Laracast 的新教程:Real-time Laravel with Socket.io,其中一种类似的事情是通过使用 Node、Redis 和 Socket.io 实现的。
如果我选择使用 socket.io 并且我有 5000 个在线用户,我假设我必须建立 5000 个连接、5000 个广播和通知,所以它会发出很多请求。而且我需要在主刀片上为每个登录用户启动,这是真的吗?
这是一种不好的做法吗?我也认为同样的事情可以通过 Ajax 请求来实现。我应该避免使用太多连续的 ajax 请求吗?
我想问一下,Socket.io 是否是创建此类系统的一种好逻辑方式,还是在 5 秒内使用 Ajax 请求的更好方法?或者有没有其他更好的方法呢? Pusher 可以是一个替代方案,但是,我认为免费是一个更好的选择。
【问题讨论】:
如果您有 5000 个用户在线,所有 5000 个用户将使用您建议的 ajax 替代方案每 5 秒访问一次您的服务器,而套接字替代方案只会将通知推送给需要通知的用户。跨度> 确实如此,但选择哪一个是最佳路径? 取决于您的用例/资源。 *** 正在使用的那个。就我而言,免费是更好的选择。 我个人会使用 websockets,因为每 5 秒触发一次 ajax 请求会浪费服务器和客户端的资源,但您必须确保您的服务器可以处理工作负载. 【参考方案1】:一些想法:
Websockets 和 Socket.io 是两个不同的东西。
Socket.io 可能使用 Websockets,它可能会回退到 AJAX(在不同的选项中)。
Websockets 对网络更友好且资源效率更高,但就编码和设置而言,它们需要工作。
出于多种原因,将 SSL 与 Websockets 一起用于生产也非常重要,并且某些浏览器要求 SSL 证书有效......因此可能需要付出代价。
Websockets 有时即使在浏览器支持的情况下也无法连接(这是推荐使用 SSL 的原因之一)...因此为遗留问题或连接问题编写 AJAX 回退意味着 Websockets 的编码通常不会替换 AJAX 代码。
5 秒内 5000 个用户是每秒 1000 个新连接和请求。有些应用每秒无法处理 1000 个请求。情况并非总是如此,但这是一个足够普遍的问题。
您拥有的用户越多,您的 AJAX 就越接近 DoS 攻击。
另一方面,Websockets 是持久的,没有新的连接 - 这是一个很大的资源问题 - 特别是考虑到 TCP/IP 的慢启动特性(是的,它是一个特性,而不是一个错误)。
即使新客户端被拒绝,现有客户端也不应该遇到 DoS(服务器设计可能会影响此问题)。
Heroku dyno 应该能够处理 5000 个 Websocket 连接,并且仍然有更多空间,同时仍然响应常规 HTTP 请求。
另一方面,我认为 Heroku 对每个 dyno 施加了每秒活动请求和/或积压限制(每个约 50 个请求)。这意味着如果超过一定数量的请求正在等待第一个响应或您的应用程序接受连接,新的请求将被自动拒绝......所以你必须确保你有不超过 100 个新请求一次。对于每秒 1000 个请求,您需要以每个请求 10 毫秒的时间同时允许 100 个请求作为最低性能状态......这在您的本地机器上可能很容易,但是当网络延迟开始时,就很难实现了。
这意味着在一个 Heroku Dyno 上运行的 Websocket 应用程序很可能在使用 AJAX 时需要多个 Dynos。
这些只是您在选择方法时可能考虑的一些想法,无论您使用什么 gem 或框架来实现您的方法。
将应用程序的部分外包,例如推送通知,需要其他考虑因素,例如可扩展性管理(您节省了哪些资源?)与价格等。
【讨论】:
感谢您的详细解释。如果我决定让 user2user 通知(userA 将 userB 添加为朋友),我需要为 Pusher 提供不同的频道,据我所知,由于“最大频道连接数”,它可能会变得昂贵。对于 Ajax 选项,我想我可以设置 15-20 秒。你会选择哪个选项? 我会从一开始就使用 Redis 服务器编写自己的 Websockets 实现。我相信从长远来看,这将使扩大规模变得更容易。我认为从长远来看,花时间编写代码并为证书支付年度价格(可选,wss
)会比外包的价格更好。除非我将应用程序限制在小客户群中,否则我不会满足于 AJAX。
所以,Socket.io + Nodejs + Redis + Laravel 似乎是我的最佳选择。如果我有很多频道,你认为它会中断吗?也许比方说 5000..?
我不喜欢 php,所以我想我也会为 html 层选择 Rails 或 Node.js。我可能会考虑 SPA,尽管这并不是解决所有问题的最佳解决方案。
最后,通知系统user2user的逻辑应该如何。用户在加载每个页面后立即连接到 websocket,服务器是侦听器。一旦用户触发一个动作,服务器就会收到通知并向其他用户发送一个“运行事件”调用,一个事件(广播事件)将被调用。我在正确的轨道上吗? *或者*我需要根据userId为每个人分别创建私人频道吗?以上是关于通知系统 - Socket.io 还是 Ajax?的主要内容,如果未能解决你的问题,请参考以下文章
到底是用 Ajax 还是 Socket.IO? 用测试数据说话!
使用 express.js 和 socket.io 构建推送通知系统的最佳方法
使用 socket.io node.js 和传入消息的通知系统的架构实现和设计