通知系统 - Socket.io还是Ajax?

时间:2015-10-02 18:57:26

标签: ajax node.js sockets laravel websocket

我正在使用Laravel5,我想为我的(网络)项目创建一个通知系统。我想要做的是,通知用户新的通知,如;

  • 另一位用户开始关注他,
  • 另一位用户在他的墙上写道,
  • 其他用户向他发送消息等

(可能会通过下拉菜单突出显示标题上的图标。例如StackOverflow)。

我在Laracast上发现了新的教程:使用Socket.io实时Laravel,其中使用Node,Redis和Socket.io实现了类似的功能。

如果我选择使用socket.io并且我有5000个在线用户,我认为我将需要进行5000次连接,5000次广播以及通知,因此它会产生大量请求。我需要在登录时为每个用户启动,在主刀片上,是真的吗?

这样做不好吗?我也认为使用Ajax请求可以实现同样的目的。我是否应该避免使用太多连续的ajax请求?

我想问一下,Socket.io是否是创建此类系统的好方法,或者它是一种在5秒内使用Ajax请求的更好方法?或者有没有其他更好的方法呢? Pusher可以替代,但是,我认为在我的情况下,free是更好的选择。

1 个答案:

答案 0 :(得分:3)

一些想法:

  1. Websockets和Socket.io是两回事。

    Socket.io可能会使用Websockets,它可能会回归到AJAX(在不同的选项中)。

  2. Websockets更具网络友好性和资源效率,但就编码和设置而言,它们需要工作。

    出于多种原因,将SSL与Websockets一起使用也非常重要,有些浏览器要求SSL证书有效......因此可能需要付出代价。

  3. 即使浏览器支持,Websockets有时也无法连接(建议使用SSL的一个原因)...因此,为传统或连接问题编写AJAX后备,意味着Websockets的编码通常不会取代AJAX代码。

  4. 5秒内的5000个用户是每秒1000个新连接和请求。有些应用每秒无法处理1000个请求。这不应该是这种情况,但这是一个很常见的问题。

    您拥有的用户越多,您的AJAX关闭就像DoS攻击

    另一方面,Websockets是持久的,没有新的连接 - 这是一个很大的资源问题 - 特别是考虑到TCP / IP的慢启动功能(是的,它是' sa功能,而不是错误)。

    即使新客户被拒绝,现有客户也不应体验DoS(服务器设计可能会影响此问题)。

  5. 一个Heroku dyno应该能够处理5000个Websocket连接,并且仍然有更多的空间,同时仍然可以回答常规的HTTP请求。

    另一方面,我认为Heroku强制每秒的活跃请求和/或每个dyno的积压限制(每个约50个请求)。这意味着如果超过一定数量的请求正在等待第一个响应或您的应用程序接受连接,则新请求将被自动拒绝....因此,您必须确保您的请求不超过100个一时间对于每秒1000个请求,您需要并发以允许每个请求10毫秒的100个同时请求作为最低性能状态...这可能在本地计算机上很容易,但是当网络延迟很难完成时很难实现。

    这意味着在使用AJAX时,在一个Heroku Dyno上运行的Websocket应用程序很可能需要多个Dynos。

  6. 这些只是您在选择方法时可能会考虑的事项的想法,无论您使用什么样的宝石或框架来实现您的方法。

    应用程序的外包部分(例如推送通知)需要其他考虑因素,例如可扩展性管理(您节省了哪些资源?)与价格等等