负载平衡与节点和Heroku

我有一个Web应用程序接受来自ios应用程序的API请求。 我的networking应用程序使用Heroku免费的dyno托pipe在Heroku上,每个请求可以处理512 MB的数据。 由于节点是单线程应用程序,一旦我们开始从ios端到Web服务器获得更高级别的stream量,这将是一个问题。 我也不是世界上最富有的人,所以我想知道是否会聪明地创build另一个免费的Heroku应用程序,并使用循环赛方法来平衡从iOS应用程序接收到的负载?

我只需要指出正确的方向。 垂直缩放在经济上不是一个真正的select。

正如丹尼尔所提到的那样,这是违反Heroku规则的。 话虽如此,也许有其他服务可以让你做到这一点。 解决这个问题的一种方法是使用ZeroMQ的集群模块(在使用模块之前,您需要安装ZeroMQ – 请参阅模块描述 )。

var cluster = require('cluster'); var zmq = require('zmq'); var ROUTER_SOCKET = 'tcp://127.0.0.1:5555'; var DEALER_SOCKET = 'tcp://127.0.0.1:7777'; if (cluster.isMaster) { // this is the main process - create Router and Dealer sockets var router = zmq.socket('router').bind(ROUTER_SOCKET); var dealer = zmq.socket('dealer').bind(DEALER_SOCKET); // forward messages between router and dealer router.on('message', function() { var frames = Array.prototype.slice.cal(arguments); dealer.send(frames); }); dealer.on('message', function() { var frames = Array.prototype.slice.cal(arguments); router.send(frames); }); // listen for workers processes to come online cluster.on('online', function() { // do something with a new worker, maybe keep an array of workers }); // fork worker processes for (var i = 0, i < 100; i++) { cluster.fork(); } } else { // worker process - connect to Dealer let responder = zmq.socket('rep').connect(DEALER_SOCKET); responder.on('message', function(data) { // do something with incomming data }) } 

这只是为了指出你正确的方向。 如果你仔细想想,你可以用一个参数来创build一个脚本,告诉脚本是主还是辅助进程。 然后,在主服务器上运行它,并在其他服务器上运行使用工人标志,这将强制它连接到主要经销商。

现在,您的主应用程序需要将请求发送到路由器,稍后将转发给工作进程:

 var zmq = require('zmq'); var requester = zmq.socket('req'); var ROUTER_SOCKET = 'tcp://127.0.0.1:5555'; // handle replies - for example completion status from the worker processes requester.on('message', function(data) { // do something with the replay }); requester.connect(ROUTER_SOCKET); // send requests to the router requester.send({ // some object describing the task }); 

我是Heroku的Node.js平台所有者。

你可能会做一些过早的优化。 Node.js是我们最小的1X大小(512MB RAM),可以处理数百个同时连接和每分钟数千个请求。

如果你的iOS应用程序始终如一,这可能是考虑货币化的时候了!

所以,首先,正如其他答复指出的,运行两个应用程序的副本,以避免Heroku的限制违反了他们的ToS,这可能不是一个好主意。

然而,有一些好消息。 对于初学者(来自Heroku的文档 ):

测功机pipe理器将重新启动您的dynamic和loggingR15错误,如果内存使用情况:

  • 免费的,爱好或标准的1xdynamic达2.5GB,是其配额的五倍。

据我了解,尽pipe你的dyno具有512MB的实际内存,但在实际重新启动之前它将交换为5倍。 所以你可以超过512MB(只要你愿意支付交换到磁盘的性能损失,这可能是严重的)。

除此之外,Heroku还有第二个账单,并允许您根据需要上下调整您的dyno组合。 通过点击Heroku API,在你自己的应用程序中执行相当容易 – 我看到你已经用NodeJS标记了这个标签,所以你可能想看看:

  • Heroku的节点客户端
  • 非常准系统但是仍然function的toots / node-heroku模块

这两个模块可以让你扩大和缩小你的dynos的形成 – 用一个简单的启发式(比如,总是有一个备用的1X dyno运行),你可以在处理请求的时候增加容量,并且去除备用当api请求没有运行时的容量。 由于你是第二个账单,这可能会非常便宜, 1X dynos运行到5¢一小时运行。 如果你最终每天运行额外的dynos几个小时,这对你来说是非常非常小的成本。

最后,还有第三方服务,比如Adept和Hirefire (Google提供的两个随机例子,我敢肯定还有更多)可以让你在某种程度上实现自动化,但是我没有任何经验。

你当然可以,我的意思是,编程 – 但是这将绕过Heroku的TOS :

4.4您不得开发多个应用程序来模拟或作为单个应用程序,或以避免招致费用的方式访问Heroku服务。

现在,我不确定这一点:

由于节点是单线程应用程序,一旦我们开始从ios端到Web服务器获得更高级别的stream量,这将是一个问题。

有一些线索讨论,有一些有趣的答案:

重交通生产环境下的节点JS聚类

如何决定何时使用Node.js?

另外,他们链接到这个video,介绍了Node.js,它谈论了一些基准:

Ryan Dahl介绍节点JS