国内有没有类似 Heroku 这样的能部署 Node 的阿里云服务器部署平台

0.选择Heroku云平台
伴随着云计算的浪潮,国内的云服务可谓多种多样,价格虽然不高,但是真正能够提供永久免费使用的,哪怕有些限制也好,似乎也找不到。
出于学习/研究/实验/测试或是真正应用等各种需求,这时我们不妨使用把应用部署到国外的Heroku云平台上,Heroku的免费版除了其提供的Postgres数据库有限制之外(小于1万条记录的小型数据库不用付费就可以添加到自己的Web应用上),其它都可以免费使用,这绝对是不二的选择。
0.选择Heroku云平台
伴随着云计算的浪潮,国内的云服务可谓多种多样,价格虽然不高,但是真正能够提供永久免费使用的,哪怕有些限制也好,似乎也找不到。
出于学习/研究/实验/测试或是真正应用等各种需求,这时我们不妨使用把应用部署到国外的Heroku云平台上,Heroku的免费版除了其提供的Postgres数据库有限制之外(小于1万条记录的小型数据库不用付费就可以添加到自己的Web应用上),其它都可以免费使用,这绝对是不二的选择。
另外一点来说,Heroku对Python的支持非常良好,所以部署起来会轻松很多,这就省去了许多不必要的麻烦了。
最近要把应用部署到Heroku上,这里把完整的部署过程分享给大家。
说明:我使用的操作系统是Ubuntu 15.10,部署的Python Web应用为基于Flask的应用,下面的部署过程都是在该操作环境下进行部署,建议大家也在Linux环境下进行部署,会方便很多。(当然你有Mac Book就更好了,只是博主没钱,用不起啦)
1.准备Git环境
要想使用Heroku,你的Web应用必须要托管在Git仓库中,如果你之前一直是使用Git的方式来作开发的,那问题就很容易解决了,相信你很明白其中的道理。如果不是的话,请按照下面我的方法来生成一个Git仓库,非常简单。
很多人觉得使用Git很麻烦,于是就放弃了Heroku平台的使用,这不能不说是一种极大的浪费:
1.首先浪费的是Heroku这么好的一个平台资源;
2.然后就是放弃了Git这么优秀的版本控制系统的使用
3.再者说就是放弃了Linux环境的使用。
其实这些对于开发来说都是非常有帮助的!所以不要觉得麻烦,只要你以后不是完全做Windows平台的开发,这些你都应该要懂,只要慢慢习惯了,后面一切就都很自然了。
第一步:安装Git
以Ubuntu为例,可以直接使用下面的命令安装:
sudo apt-get install git
当然如果你正在使用的是其它版本的Linux发行版本,相信安装方法也不难。
第二步:把你的完整Web应用放到一个新的目录中
比如这里我已经有一个开发完整的Web应用,它主要有下面的这些文件和应用:
drwxrwxr-x
6 xpleaf xpleaf 4096
1月 29 16:04 .
drwxr-xr-x 38 xpleaf xpleaf 4096
1月 29 16:01 ..
drwxrwxr-x
7 xpleaf xpleaf 4096
1月 29 03:31 app
-rw-rw-r--
1 xpleaf xpleaf 3295
1月 29 03:31 config.py
-rw-rw-r--
1 xpleaf xpleaf 1083
1月 29 03:31 LICENSE
-rwxrwxr-x
1 xpleaf xpleaf 2391
1月 29 03:31 manage.py
drwxrwxr-x
3 xpleaf xpleaf 4096
1月 29 03:31 migrations
-rw-rw-r--
1 xpleaf xpleaf
1月 29 03:13 Procfile
-rw-rw-r--
1 xpleaf xpleaf
1月 29 03:31 README.md
-rw-rw-r--
1 xpleaf xpleaf
1月 29 03:13 requirements.txt
drwxrwxr-x
2 xpleaf xpleaf 4096
1月 29 03:31 tests
然后创建一个名为Heroku_pro的文件夹,并把上面完整的Web应用程序放进去,如下:
xpleaf@leaf:~/Heroku_pro$ pwd
/home/xpleaf/Heroku_pro
xpleaf@leaf:~/Heroku_pro$ ls
migrations
requirements.txt
tests Procfile
这一步完成!
第三步:在Heroku_pro目录下生成一个Git仓库
xpleaf@leaf:~/Heroku_pro$ git init
初始化空的 Git 版本库于 /home/xpleaf/Heroku_pro/.git/
这时你会发现在当前目录下多了一个.git的目录:
xpleaf@leaf:~/Heroku_pro$ ls -a
migrations
requirements
这一步完成。
第四步:把当前目录下的所有文件都托管到本地Git仓库
xpleaf@leaf:~/Heroku_pro$ git add .
xpleaf@leaf:~/Heroku_pro$ git commit -m "ver1.0"
[master (根提交) a7cea3f] ver1.0
78 files changed, 3350 insertions(+)
create mode 100644 LICENSE
create mode 100644 README.md
create mode 100644 app/__init__.py
create mode 100644 app/api_1_0/__init__.py
create mode 100644 app/api_1_0/authentication.py
Ok,这一步完成。
关于Git的使用显然不是这里要讨论的重点,这里只是为没有用过Git的朋友提供一种临时的解决方案。
2.注册Heroku账户
跟目前国内的大多数云平台一样,首先你也需要注册一个账号,可以在下面的链接进行注册:
3.安装Heroku Toolbelt客户端
Toolbelt是Heroku的命令行工具,使用该客户端的好处是,我们完全可以在本地通过命令行操作的方式来管理我们托管在Heroku上的Web应用。
以Ubuntu为例,参考官方的安装文档:
我们使用下面的命令来进行安装就可以了:
wget -O- https://toolbelt./install-ubuntu.sh | sh
可以参考这里的官方文档:
4.登陆Heroku
在刚刚的Heroku_pro目录下执行下面的命令,登陆到Heroku上:
xpleaf@leaf:~/Heroku_pro$ heroku login
Enter your Heroku credentials.
Email: flasky_
Password (typing will be hidden):
Logged in as flasky_
xpleaf@leaf:~/Heroku_pro$
注意登陆成功后的提示:Logged in as flasky_
需要注意的是,login命令默认会自动为你当前的主机创建SSH公钥并上传,SSH公钥非常重要,在你后面执行git push命令的时候是必须要用到的,不过不用担心,heroku的客户端会自动帮我们处理好。当然你也可以手动上传,只需要执行命令:heroku keys:add。
5.使用Heroku客户端创建app程序
所谓的app程序其实就是的一个子域名,当你在Heroku创建了一个名为my-heroku-app-cn的app程序之后,如果你部署成功,你就可以直接通过地址https://my-heroku-app-来访问你的Web应用,因此名字要注意,不能使用别人已经使用过的。我们下面就来创建一个。
xpleaf@leaf:~/Heroku_pro$ heroku create my-heroku-app-cn
Creating my-heroku-app-cn... done, stack is cedar-14
https://my-heroku-app-cn./ | https://git./my-heroku-app-cn.git
出现上面的提示,就说明程序创建成功了!Heroku还分配了一个Git服务器给我们,地址为
当然,其实app程序的名字也是可以改的,你只要登陆官居网,在你的个人信息页里就可以修改。
6.配置数据库
Heroku以扩展的方式支持Postgres数据库,只是有些限制而已,正如前面所说。这里我们就使用Postgres数据库,这也意味着,你需要在你的Web应用源代码中添加相应的数据库路径,这个我们待会再说。
使用下面的命令配置数据库:
xpleaf@leaf:~/Heroku_pro$ heroku addons:create heroku-postgresql:hobby-dev
Creating postgresql-rectangular-17531... done, (free)
Adding postgresql-rectangular-17531 to my-heroku-app-cn... done
Setting DATABASE_URL and restarting my-heroku-app-cn... done, v3
Database has been created and is available
! This database is empty. If upgrading, you can transfer
! data from another database with pg:copy
Use `heroku addons:docs heroku-postgresql` to view documentation.
出现上面的提示也就说明数据库配置成功了,关于该数据库的详细信息,你也可以到官网的个人中心进行查看,里面有非常详细的说明,如下:
这里我们需要注意一句话:Setting DATABASE_URL and restarting my-heroku-app-cn... done, v3
也就是说,Heroku自动为我们刚刚创建的my-heroku-app-cn程序创建了一个名为DATABASE_URL的环境变量,变量的值就是在Heroku平台中该数据库的路径地址,这也意味着,如果你想让你的Web应用部署成功后可以正常连接上该数据库,就必须在你的源代码中设置数据库的地址为:DATABASE_URL,仅此而已,其它的Heroku会为我们完成,不用担心。
7.配置必要的环境变量
这不是必要的,这取决于你的Web应用的源代码中是否有获取系统环境变量的需要,如果有的话,你可以通过下面的方式进行环境变量的设置。
比如我在我的源代码的配置文件中有下面的两行代码:
MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
显然电子邮件的用户名和密码这些敏感的信息不应该出现在源代码中,所以我是通过获取环境变量的值来知道用户名和密码的,因此我需要在Heroku上设置相对应的环境变量,命令如下:
xpleaf@leaf:~/Heroku_pro$ heroku config:set MAIL_USERNAME="xpleaf"
Setting config vars and restarting my-heroku-app-cn... done
MAIL_USERNAME: xpleaf
xpleaf@leaf:~/Heroku_pro$ heroku config:set MAIL_PASSWORD="***"
Setting config vars and restarting my-heroku-app-cn... done
MAIL_PASSWORD: ***
当然如果你需要设置其它的环境变量,通过这个方式设置就可以了。
8.使用生产Web服务器
我们知道,在使用Django或Flask作开发的时候,它们都自带了开发Web服务器来连接我们的Web应用程序,这对于在开发的过程中来说是再适合不过的了。然而现在我们要做的是在生产环境中部署我们的Web应用程序,因此你不可能说还使用原来这些Web框架自带的开发服务器,因为性能实在是不可保证,因为它们都是为开发环境设计的Web服务器,而不是为生产环境设计的。所以,我们要使用生产环境的Web服务器。(PS:请注意Web应用程序与Web服务器的区别)
我要部署的Web应用程序是基于Flask的,所以当然要使用一个支持Flask的Web服务器软件,这里我使用的是Gunicorn。当然,这取决于你使用的是什么Web框架,关于这点,可自行去了解。
选择了要使用Gunicorn来作为我的生产环境,我待会只需要把它添加到依赖需求文件中去就可以了。
当然,你也完全可以把Gunicorn下载下来进行本地的测试,由于不是每个人都使用的Python Web框架都是Flask或者使用的生Web服务器软件是Gunicorn,所以这里就不提及。
9.添加依赖需求文件和Profile文件
这是必需也是非常重要的一点,否则的话部署很难成功!
Heroku要求在我们的Web程序(这里针对Python的Web应用程序)目录中必须要有下面的两个文件:
requirements.txt
Web应用程序所依赖的各种第三方扩展包
里面包含的是我的Web应用服务器启动时执行的命令
正如刚刚在我的Heroku_pro目录下看到的:
xpleaf@leaf:~/Heroku_pro$ ls -l requirements.txt Procfile
-rw-rw-r-- 1 xpleaf xpleaf 25
1月 29 03:13 Procfile
-rw-rw-r-- 1 xpleaf xpleaf 76
1月 29 03:13 requirements.txt
注意这两个文件必须位于当前Heroku_pro目录下。
requirements.txt的文件内容类似于这样:
Flask==0.10.1
Flask-Bootstrap==3.0.3.1
Flask-HTTPAuth==2.7.0
Flask-Login==0.3.1
SQLAlchemy==0.9.9
WTForms==1.0.5
Werkzeug==0.10.4
alembic==0.6.2
bleach==1.4.0
里面包含了支撑我的Web应用程序运行的各种扩展包。当然至于内容是什么,取决于你正在开发的Web项目。
而Profile文件的内容则类似于这样:
web: gunicorn manage:app
正如前面所说,里面放的是命令,比如这里的这个命令就是用来启动我前面所说的Gunicorn生产环境Web服务器的。
再次说明,这两个文件非常重要,如果没有的话,待会部署就会失败的。
10.执行git push进行部署
前面的确认无误之后,就可以部署了,当然,如果你临时修改了你当前Heroku_pro目录下的文件,请先使用下面的命令提交你的修改:
git commit -m "ver1.0"
Ok,下面就开始部署:
xpleaf@leaf:~/Heroku_pro$ git push heroku master
对象计数中: 97, 完成.
Delta compression using up to 4 threads.
压缩对象中: 100% (90/90), 完成.
写入对象中: 100% (97/97), 35.04 KiB | 0 bytes/s, 完成.
Total 97 (delta 22), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote: -----& Python app detected
remote: -----& Installing runtime (python-2.7.11)
remote: -----& Installing dependencies with pip
Collecting Flask==0.10.1 (from -r requirements/common.txt (line 1))
..........
remote: -----& Preparing static assets
Collectstatic configuration error. To debug, run:
$ heroku run python manage.py collectstatic --noinput
remote: -----& Discovering process types
Procfile declares types -& web
remote: -----& Compressing...
Done: 37.2M
remote: -----& Launching...
Released v6
https://my-heroku-app-cn./ deployed to Heroku
remote: Verifying deploy.... done.
To https://git./my-heroku-app-cn.git
* [new branch]
master -& master
会看到中间有一大堆的输出信息,这是Heroku为我们的环境安装所需的软件包,而这些软件包即是前面我们在需求文件中指定的。当然这些操作都是在Heroku中执行的,我们本地只是看到它的一个操作过程而已。
部署完成后,根据我的Flask应用所选择的Web服务器的启动方式,使用下面的命令来进行启动:
xpleaf@leaf:~/Heroku_pro$ heroku run python manage.py deploy
Running python manage.py deploy on my-heroku-app-cn... up, run.7690
[alembic.migration] Context impl SQLiteImpl.
[alembic.migration] Running upgrade 288cd3dc5a8 -& ea, followers
[alembic.migration] Running upgrade ea -& 51f5ccfba190, comments
xpleaf@leaf:~/Heroku_pro$ heroku restart
Restarting dynos... done
上面的完成后,就可以访问我们创建的Web应用了:
当然,当你访问它的时候可能我已经把它关掉了,你可以访问另一个用同样方法部署的应用的地址:
如果你需要对你的源代码修改以增加或删除某些功能,在Heroku_pro目录下修改了之后,请依次执行下面的命令:
heroku maintenance:on
git push heroku master
heroku run python manage.py deploy
heroku restart
maintenance:off
Ok,到这里的话,本文就结束了,其实关于部署应用到Heroku上,无论你的Web应用是基于Python开发的,或者是其它语言,都是类似的,只是这里侧重说的是Python的Web应用。
当然在实际的部署过程当中可能会遇到各种各样的问题,这时就需要充分发挥你的随机应变能力了,当出现问题时,可以Google查找(百度找的资料很少,Google上不了就自己想办法吧),或者到Stack Overflow上面去查找或是提问,同时要根据提示的错误信息去阅读官方的文档来解决存在的问题。
但不管怎么说,部署Python Web应用的主要流程是类似于上面所给出的操作,本文相信对初次在Heroku上部署Python Web应用的朋友会有所帮助,写此文,也确实是希望帮到更多的朋友,因为目前国内有关Python Web部署资源实在不多,更别说部署到国外的云平台上去了。
好吧,希望帮到有需要的朋友,谢谢大家!
《Flask Web Development: Developing Web Applications with Python》
用云栖社区APP,舒服~
【云栖快讯】首届阿里巴巴中间件技术峰会,揭秘阿里10年分布式技术沉淀!阿里高可用体系核心缔造者、全链路压测创始人,DRDS与TDDL负责人等大咖出场,干货分享,不可错过!&&
基于云安全大数据能力实现,通过防御SQL注入、XSS跨站脚本、常见Web服务器插件漏洞、木马上传、非授权核心资源...
由轻量级Agent和云端组成,集云盾威胁情报于一体,通过Agent和云端大数据的联动,为您提供网站后门查杀、通用...
API 网关(API Gateway),提供高性能、高可用的 API 托管服务,帮助用户对外开放其部署在 ECS...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
2017杭州云栖大会火热抢票
Loading...> 博客详情
[Heroku]()是一个云应用部署平台,你可以在上面部署简单的应用(包括java、ruby、node.js应用等)。
这里只是做一个测试,所以使用了Express框架,你可以按照heroku的参考说明部署自己的应用。
首先要注册一个heroku账号,这个很简单,一个邮箱即可。
2. 下载heroku自己的命令行工具[Toolbelt](/)
这里我是在mac平台下,使用homebrew可以直接一键安装(` brew install heroku `),你可以按照自己的平台在官网下载相应的安装包安装。
3. 在自己电脑上登陆
打开命令行,输入: `heroku login` , 按照提示输入账号密码即可。
4. 开始部署应用
这里介绍的是node.js应用的部署,其它应用按官网上步骤操作即可。
###部署node.js应用
1. 编写应用
这里我直接使用express生成了一个应用
2. 修改package.json文件
"name": "MyMobile",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "node app.js",
"postinstall": "./node_modules/bower/bin/bower install"
"dependencies": {
"express": "~3.4.5",
"jade": "*",
"bower": "*"
"engines": {
"node": "0.10.x",
"npm": "1.3.x"
3. 添加Procfile文件
注意Procfile文件要放在根目录下,名称为Procfile。简单的话,只加一条 `web: node web.js` 即可。
4. 使用git新建一个仓库
5. 部署到heroku
1. `heroku create`
2. `git push heroku master`
6. 运行应用
命令行输入`heroku ps:scale web=1`
你可以检查是否部署成功,在命令行输入 `heroku ps`即可,如果正常输出,即是部署成功。
命令行输入 `heroku open` 即可打开浏览器,它自动在浏览器中显示你运行的应用。
###添加你自己的域名
在DNS解析的地方,用CNAME将你自己的域名映射到heroku分配给你的域名即可。
在这里我还使用了[bower](/bower/bower),所以在package.json里使用了一条 bower命令。这样heroku在运行前会自动按你的 bower.json 里的依赖下载相应的库。这样你就不用把这些库添加到仓库,减少项目体积。
人打赏支持
码字总数 14530
这个只是试着玩玩,平时开发个人小东西时候用,不会用在生产环境的、
没发现BAE之类的node.js版本多老么?TAOBAO的云环境竟然支持的还是node 0.5版本,把我惊呆了。
没发现BAE之类的node.js版本多老么?TAOBAO的云环境竟然支持的还是node 0.5版本,把我惊呆了。 aliyun的那个 基本是停滞了。
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥酷勤网 C 程序员的那点事!
当前位置: >
浏览次数:次
在Heroku上新建App: twittest-njs,下载heroku-toolbelt.exe,安装后在本地dos下heroku login登录。
然后步骤如下:
#add web.js 添加
本地git init一个目录:twittest-njs,打开dos进入该目录
运行#npm init
运行#npm install express logfmt &save
dos下提示registry.npmjs.org访问出错:
npm ERR! Error: SSL Error: CERT_UNTRUSTED
wayout: npm config set strict-ssl false
npm ERR! error rolling back express@3.4.4 Error: ENOTEMPTY
npm ERR! Unsupported
npm ERR! Not compatible with your version of node/npm: connect@2.11.0
npm ERR! Required: {&node&:&&= 0.8.0&P}
npm ERR! Actual: {&npm&:&1.1.12&P,&node&:&0.6.14&P}
wayout: upgradeto Program Filesnodejs
解决办法,升级node和npm到最新版。
#add Procfile 创建Procfile文件到当前目录,内容如下:
web: node web.js
在目录 D:Program FilesHerokuruby-1.9.2bin& 下运行#foreman start出错,提示:
foreman start(0.63)
Bad file descriptor
wayout: ggem install foreman -v 0.61
原因是0.63版本的foreman有问题,换到0.61即可。
复制 copy foreman和foreman.bat 从D:Program FilesHerokuruby-1.9.2bin& 到 to herokutwittest-njs
编辑foreman.bat edit: ruby.exe前增加路径:&D:/Program Files/Heroku/ruby-1.9.2/bin/&
当前目录herokutwittest-njs下运行:#foreman start
结果显示如下:
19:08:07 web.1 | started with pid 5880
19:08:09 web.1 | Listening on 5000
打开浏览器访问:http://localhost:5000/,网页显示:Hello JS World!
至此,Windows下搭建Heroku的nodejs测试环境成功。
补充:如果部署到Heroku出现如下错误:
Fatal: Could not read from remote repository.
PuTTY Fatal Error: Disconnected: No supported authentication methods available
强烈建议,安装时选择openssh,而不是putty。
Tags:,,,,,
This entry was posted on Thursday, January 16th, 2014 at 7:42 pm
and is filed under. You can follow any responses to this entry through thefeed. You can, orfrom your own site.
& 相关主题:中国领先的IT技术网站
51CTO旗下网站
简单、省钱、快速:Playtomic由.NET改用Node和Heroku
Playtomic是一项游戏分析服务,这项服务应用于每天大约2000万人在玩的约8000个手机游戏、互联网游戏和可下载游戏。本文是Playtomic首席执行官Ben Lowry接受Hacker News采访时给出的精辟总结。
作者:布加迪 编译来源:| 10:19
【51CTO快译】Playtomic是一项游戏分析服务,这项服务应用于每天大约2000万人在玩的约8000个手机游戏、互联网游戏和可下载游戏。
下面是Playtomic首席执行官Ben Lowry接受Hacker News采访时给出的精辟总结:
昨天就有超过2000万的人点击了我的,点击次数达人次,在玩大约8000个采用我那个分析平台的游戏,玩游戏的时间加起来总共将近600年。这只是昨天的情况。许多不同的瓶颈摆在从事大规模运营的人的面前,有待克服。就我的使用情况而言,Heroku和NodeJS最终克服了一大堆瓶颈,而且成本非常低。
Playtomic一开始几乎完全采用了微软.NET和架构,这套架构运行了3年,后来被换成了使用NodeJS全面改写的架构。在使用期间,整个平台从原来一台服务器上的共享空间,扩展到一台完全专用的服务器,后来扩展到第二台专用服务器,随后API服务器被卸载到一家虚拟专用服务器(VPS)提供商,再后来扩展到四六家相当大的VPS。最后,API服务器选用了Hivelocity的8台专用服务器,每台专用服务器搭载采用超线程技术的八核处理器、8GB内存以及运行API堆栈3个或4个实例的双500GB磁盘。
这些服务器经常同时服务于3个游戏玩家,每秒收到的请求多达1500个,通过DNS轮询技术(DNS round robin),实现机制。
今年7月份,整批服务器被换成了使用NodeJS改写的服务器,这些服务器托管在Heroku处,节省了大笔费用。
借助NodeJS扩展Playtomic
迁移过程涉及两个部分:
1.专门使用平台即服务(PaaS):PaaS的优势包括:价格低、使用方便、可以利用提供商的负载均衡机制以及降低总的复杂性。缺点包括:NodeJS没有New Relic应用性能管理工具,崩溃处理起来很棘手,以及平台总体上欠成熟。
2.由.NET改用NodeJS:原来的架构是ASP.NET / C#,带本地实例,一项服务在本地预处理事件数据,并发送至集中式服务器有待完成,改为Heroku + Redis上的NodeJS以及SoftLayer上的预处理(参阅Catalyst程序)。
专门使用PaaS
降低复杂性方面成效显著。我们有8台专用服务器,每台服务器在我们的托管合作伙伴Hivelocity运行API的3个或4个实例。每台服务器运行一小组软件,包括:
■MongoDB实例
■日志预处理服务
■监控服务
■API站点的IIS
通过FTP脚本来完成部署工作,该脚本将新的API站点版本上传到了所有服务器。服务部署起来比较烦人,不过不常变化。
说到日志数据被预处理并发送之前先暂时存起来,MongoDB是个差强人意的选择。虽然它在速度方面提供了巨大优势:起初只要写入到内存,这意味着写入请求几乎立即被&完成&&&这比Windows上的常用消息队列出色得多,但是根本无法收回已删除数据留下的空间;这意味着,要是不经常加以压缩,数据库大小会迅速增加到100GB以上。
PaaS提供商的优势相当显而易见,它们似乎都很相似,不过Heroku和Salesforce最让人放心,因为它们似乎是最成熟的,而且得到了广泛的技术支持。
迁移到PaaS面临的主要挑战在于改变这个观念:我们可以让辅助软件连同网站一起运行,就像之前在专用服务器上那样。大多数平台提供了你可以充分利用的某种background worker线程,但是这意味着你要通过第三方服务或看似没有必要的服务器,传送来自万维网线程的数据和任务。
我们最终选择了Softlayer处的一台大型服务器,它运行十几个专用的Redis实例和一些中间件,而不是background worker。Heroku并不针对出站带宽收费,Softlayer并不针对入站带宽收费,这有效地避免了所需的大量带宽。
由.NET改用NodeJS
在服务器端处理JavaScript是个有利也有弊的过程。一方面,不用拘泥形式和没有样板带来了自由。而另一方面,没有New Relic管理工具,也没有编译错误,这就加大了各方面的难度。
两个主要的优势让NodeJS特别适用于我们的API。
1. background worker与在同一个线程和内存中。
2.与Redis和MongoDB建立起了持久式、共享式的连接。
Background worker
NodeJS有这项非常有用的功能:可以独立于请求而继续工作,这样你可以预取数据及其他操作,让你可以很早终止请求,然后完成处理请求的任务。
对我们来说特别有优势的地方是,可以在内存中复制整批的MongoDB集合,定期刷新,那样全部的工作类都可以访问目前数据,没必要用到外部数据库或本地/共享缓存层。
我们在下列方面使用这项功能,每秒可以少接受100次至1000次的数据库查询:
■主API上的游戏配置数据
■数据导入API上的API证书
■开发人员用来存储配置或其他数据、热装入到游戏中的GameVars功能
■游戏积分榜(Leaderboard)积分表(不包括积分)
基本模式如下:
var&cache&=&{};& &module.exports&=&function(request,&response)&{ &&&&response.end(cache[&x&]); &} &function&refresh()&{ &&&&//&从数据库提取更新后的数据,存储在缓存对象中 &&&&cache[&x&]&=&&foo&; &&&&setTimeout(refresh,&30000); &} &refresh();&
其优势在于每个dyno或实例而不是每个用户有一条通道连接至你的后端数据库,还有速度非常快的本地内存缓存总是存有新数据。dyno是在Heroku上运行的单一Web进程,它每次能够服务于一次Web请求(网页浏览)。
要注意的地方是,你的数据集必须很小,这与其他数据都在同一个线程上操作,所以你要注意,尽量避免堵塞线程或处理过于繁重的处理器工作。
持久性连接
对我们的API而言,NodeJS较之.NET的另一大好处是持久性数据库连接。使用.NET来连接的传统方法是,打开你的连接,进行操作,之后你的连接返回到连接池,以便马上重复使用,或者如果不再需要,就过期作废。
这很常见;除非你遇到并发性很高的环境,否则它完全可行。在并发性很高的环境下,连接池无法足够快地重新使用连接,这意味着它会生成新的连接,而数据库服务器就不得不扩展,以便处理这些新连接。
在Playtomic,我们通常同时有几十万个游戏玩家在发送事件数据,这些事件数据需要推送回到我们在一个不同数据中心的Redis实例;如果使用.NET,那就需要建立大量的连接&&这就是为什么我们当初在每一台旧的专用服务器上本地运行MongoDB。
借助NodeJS,我们每个dyno/实例就有一个连接,负责推送某个dyno收到的所有事件数据。它不依赖诸如此类的请求模式:
var&redisredisclient&&=&redis.createClient(&.);& &module.exports&=&function(request,&response)&{ &&&&&var&eventdata&=&&etc&; &&&&&redisclient.lpush(&events&,&eventdata); &&}&
上一分钟的请求:
_exceptions:&75&(0.01%)& &_failures:&5&(0.00%)& &_total:&537,151&(99.99%)&& &data.custommetric.success:&1,093&(0.20%)& &data.levelaveragemetric.success:&2,466&(0.46%)& &data.views.success:&105&(0.02%)& &events.regular.invalid_or_deleted_game#2:&3,814&(0.71%)& &events.regular.success:&527,837&(98.25%)& &gamevars.load.success:&1,060&(0.20%) &geoip.lookup.success:&109&(0.02%)& &leaderboards.list.success:&457&(0.09%)& &leaderboards.save.missing_name_or_source#201:&3&(0.00%) &leaderboards.save.success:&30&(0.01%)&& &leaderboards.saveandlist.success:&102&(0.02%)&& &playerlevels.list.success:&62&(0.01%)&& &playerlevels.load.success:&13&(0.00%)&
这些数据来自在后台运行的针对每个实例的某种负载监控系统,把计数器推送到Redis,然后它们被汇集起来,存储在MongoDB中,你可以在/load.html看到实际过程。
该数据有几种不同类别的请求:
■事件,检查来自MongoDB的游戏配置、执行GeoOP查询(采用了非常快的开源实现方式,详见/benlowry/node-geoip-native),然后推送至Redis。
■GameVars、积分榜和玩家关卡都检查来自MongoDB的游戏配置,然后检查任何相关的MongoDB数据库。
■数据查询被代理给Windows服务器,那是由于NodeJS对存储过程的支持很糟糕。
结果是100000个并发用户给Redis带来的负载特别轻,每分钟有500000次至700000次lpush(在另一端被取出来)。
1&&[||&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&1.3%]&任务:83个;4个运行中 &2&&[|||||||||||||||||||&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&19.0%]&负载平均:1.28&1.20&1.19& &&3&&[||||||||||&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&9.2%]&正常运行时间:12天21小时48分33秒 &&4&&[||||||||||||&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&11.8%] &5&&[||||||||||&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&9.9%] &&6&&[|||||||||||||||||&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&17.7%] &&7&&[|||||||||||||||&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&14.6%] &&8&&[|||||||||||||||||||||&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&21.6%] &&9&&[||||||||||||||||||&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&18.2%] &&10&[|&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0.6%] &&11&[&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0.0%] &&12&[|||||||||&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&9.8%] &&13&[||||||||||&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&9.3%] &&14&[||||||&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&4.6%] &&15&[||||||||||||||||&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&16.6%] &&16&[|||||||||&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&8.0%] &&Mem[|||||||||||||||&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&MB] &Swp[&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0/1023MB] &&PID&USER&&&&&PRI&&NI&VIRT&&&RES&&&SHR&&S&&CPU%&MEM%&&&TIME+&&Command &12518&redis&&&&&20&&&0&4&&&640&S&&0.0&&0.0&&2:21.53&&`-&/usr/local/bin/redis-server&/etc/redis/analytics.conf &12513&redis&&&&&20&&&0&&&&736&S&&3.0&&0.1&&4h06:40&&`-&/usr/local/bin/redis-server&/etc/redis/log7.conf &12508&redis&&&&&20&&&0&&&&736&S&&2.0&&0.1&&4h07:31&&`-&/usr/local/bin/redis-server&/etc/redis/log6.conf &12494&redis&&&&&20&&&0&&&&736&S&&1.0&&0.2&&4h06:08&&`-&/usr/local/bin/redis-server&/etc/redis/log5.conf &12488&redis&&&&&20&&&0&&&&736&S&&2.0&&0.1&&4h09:36&&`-&/usr/local/bin/redis-server&/etc/redis/log4.conf &12481&redis&&&&&20&&&0&&&&736&S&&2.0&&0.1&&4h02:17&&`-&/usr/local/bin/redis-server&/etc/redis/log3.conf &12475&redis&&&&&20&&&0&&&&736&S&&2.0&&0.1&&4h03:07&&`-&/usr/local/bin/redis-server&/etc/redis/log2.conf &12460&redis&&&&&20&&&0&&&&736&S&&2.0&&0.1&&4h10:23&&`-&/usr/local/bin/redis-server&/etc/redis/log1.conf &12440&redis&&&&&20&&&0&&&&736&S&&3.0&&0.1&&4h09:57&&`-&/usr/local/bin/redis-server&/etc/redis/log0.conf &12435&redis&&&&&20&&&0&4&&&684&S&&0.0&&0.0&&2:21.71&&`-&/usr/local/bin/redis-server&/etc/redis/redis-servicelog.conf &12429&redis&&&&&20&&&0&&395M&&115M&&&736&S&33.0&&0.5&60h29:26&&`-&/usr/local/bin/redis-server&/etc/redis/redis-pool.conf &12422&redis&&&&&20&&&0&4&&&728&S&&0.0&&0.0&26:17.38&&`-&/usr/local/bin/redis-server&/etc/redis/redis-load.conf &12409&redis&&&&&20&&&0&4&&&560&S&&0.0&&0.0&&2:21.50&&`-&/usr/local/bin/redis-server&/etc/redis/redis-cache.conf&
就每分钟次创建、读取、更新和删除(CRUD)而言,这是非常轻的MongoDB负载:
insert&&query&update&delete&getmore&command&flushes&mapped&&vsize&&&&res&faults&locked&%&idx&miss&%&&&&&qr|qw&&&ar|aw&&netIn&netOut&&conn&&&&&&&time& &2&&&&&&9&&&&&&5&&&&&&2&&&&&&&0&&&&&&&8&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.1&&&&0&&&&0|0&&&&&0|0&&&&&3k&&&&&7k&&&116&&&01:11:12& &1&&&&&&1&&&&&&5&&&&&&2&&&&&&&0&&&&&&&6&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.1&&&&0&&&&0|0&&&&&0|0&&&&&2k&&&&&3k&&&116&&&01:11:13& &0&&&&&&3&&&&&&6&&&&&&2&&&&&&&0&&&&&&&8&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.2&&&0&&&&0|0&&&&&0|0&&&&&3k&&&&&6k&&&114&&&01:11:14& &0&&&&&&5&&&&&&5&&&&&&2&&&&&&&0&&&&&&12&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.1&&&0&&&&0|0&&&&&0|0&&&&&3k&&&&&5k&&&113&&&01:11:15& &1&&&&&&9&&&&&&7&&&&&&2&&&&&&&0&&&&&&12&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.1&&&&0&&&&0|0&&&&&0|0&&&&&4k&&&&&6k&&&112&&&01:11:16& &1&&&&&10&&&&&&6&&&&&&2&&&&&&&0&&&&&&15&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.1&&&&0&&&&0|0&&&&&1|0&&&&&4k&&&&22k&&&111&&&01:11:17& &1&&&&&&5&&&&&&6&&&&&&2&&&&&&&0&&&&&&11&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.2&&&&&0&&&&0|0&&&&&0|0&&&&&3k&&&&19k&&&111&&&01:11:18& &1&&&&&&5&&&&&&5&&&&&&2&&&&&&&0&&&&&&14&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.1&&&&0&&&&0|0&&&&&0|0&&&&&3k&&&&&3k&&&111&&&01:11:19& &1&&&&&&2&&&&&&6&&&&&&2&&&&&&&0&&&&&&&8&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.2&&&&&0&&&&0|0&&&&&0|0&&&&&3k&&&&&2k&&&111&&&01:11:20& &1&&&&&&7&&&&&&5&&&&&&2&&&&&&&0&&&&&&&9&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.1&&&&&0&&&&0|0&&&&&0|0&&&&&3k&&&&&2k&&&111&&&01:11:21& &&insert&&query&update&delete&getmore&command&flushes&mapped&&vsize&&&&res&faults&locked&%&idx&miss&%&&&&&qr|qw&&&ar|aw&&netIn&netOut&&conn&&&&&&&time& &2&&&&&&9&&&&&&8&&&&&&2&&&&&&&0&&&&&&&8&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.2&&&&0&&&0|0&&&&&0|0&&&&&4k&&&&&5k&&&111&&&01:11:22& &3&&&&&&8&&&&&&7&&&&&&2&&&&&&&0&&&&&&&9&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.2&&&0&&&0|0&&&&&0|0&&&&&4k&&&&&9k&&&110&&&01:11:23& &2&&&&&&6&&&&&&6&&&&&&2&&&&&&&0&&&&&&10&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.2&&&&0&&&0|0&&&&&0|0&&&&&3k&&&&&4k&&&110&&&01:11:24& &2&&&&&&8&&&&&&6&&&&&&2&&&&&&&0&&&&&&21&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.2&&&&0&&&0|0&&&&&0|0&&&&&4k&&&&93k&&&112&&&01:11:25& &1&&&&&10&&&&&&7&&&&&&2&&&&&&&3&&&&&&16&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.2&&&&0&&&0|0&&&&&0|0&&&&&4k&&&&&4m&&&112&&&01:11:26& &3&&&&&15&&&&&&7&&&&&&2&&&&&&&3&&&&&&24&&&&&&&0&&6.67g&&14.8g&&1.23g&&&&&&0&&&&&&0.2&&&&0&&&0|0&&&&&0|0&&&&&6k&&&&&1m&&&115&&&01:11:27& &1&&&&&&4&&&&&&8&&&&&&2&&&&&&&0&&&&&&10&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.2&&&&&0&&&0|0&&&&&0|0&&&&&4k&&&&&2m&&&115&&&01:11:28& &1&&&&&&6&&&&&&7&&&&&&2&&&&&&&0&&&&&&14&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.2&&&&0&&&0|0&&&&&0|0&&&&&4k&&&&&3k&&&115&&&01:11:29& &1&&&&&&3&&&&&&6&&&&&&2&&&&&&&0&&&&&&10&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.1&&&&&0&&&0|0&&&&&0|0&&&&&3k&&&103k&&&115&&&01:11:30& &2&&&&&&3&&&&&&6&&&&&&2&&&&&&&0&&&&&&&8&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.2&&&&&0&&&0|0&&&&&0|0&&&&&3k&&&&12k&&&114&&&01:11:31& &&insert&&query&update&delete&getmore&command&flushes&mapped&&vsize&&&&res&faults&locked&%&idx&miss&%&&&&&qr|qw&&&ar|aw&&netIn&netOut&&conn&&&&&&&time& &0&&&&&12&&&&&&6&&&&&&2&&&&&&&0&&&&&&&9&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.2&&&&0&&&0|0&&&&&0|0&&&&&4k&&&&31k&&&113&&&01:11:32& &2&&&&&&4&&&&&&6&&&&&&2&&&&&&&0&&&&&&&8&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.1&&&&&0&&&0|0&&&&&0|0&&&&&3k&&&&&9k&&&111&&&01:11:33& &2&&&&&&9&&&&&&6&&&&&&2&&&&&&&0&&&&&&&7&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.1&&&&&0&&&0|0&&&&&0|0&&&&&3k&&&&21k&&&111&&&01:11:34& &0&&&&&&8&&&&&&7&&&&&&2&&&&&&&0&&&&&&14&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.2&&&&&0&&&0|0&&&&&0|0&&&&&4k&&&&&9k&&&111&&&01:11:35& &1&&&&&&4&&&&&&7&&&&&&2&&&&&&&0&&&&&&11&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.2&&&&&0&&&0|0&&&&&0|0&&&&&3k&&&&&5k&&&109&&&01:11:36& &1&&&&&15&&&&&&6&&&&&&2&&&&&&&0&&&&&&19&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.1&&&&0&&&0|0&&&&&0|0&&&&&5k&&&&11k&&&111&&&01:11:37& &2&&&&&17&&&&&&6&&&&&&2&&&&&&&0&&&&&&19&&&&&&&1&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.2&&&&&0&&&0|0&&&&&0|0&&&&&6k&&&189k&&&111&&&01:11:38& &1&&&&&13&&&&&&7&&&&&&2&&&&&&&0&&&&&&15&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.2&&&&&0&&&0|0&&&&&1|0&&&&&5k&&&&42k&&&110&&&01:11:39& &2&&&&&&7&&&&&&5&&&&&&2&&&&&&&0&&&&&&77&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.1&&&&0&&&0|0&&&&&2|0&&&&10k&&&&14k&&&111&&&01:11:40& &2&&&&&10&&&&&&5&&&&&&2&&&&&&&0&&&&&181&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.1&&&&&0&&&0|0&&&&&0|0&&&&21k&&&&14k&&&112&&&01:11:41& &&insert&&query&update&delete&getmore&command&flushes&mapped&&vsize&&&&res&faults&locked&%&idx&miss&%&&&&&qr|qw&&&ar|aw&&netIn&netOut&&conn&&&&&&&time& &1&&&&&11&&&&&&5&&&&&&2&&&&&&&0&&&&&&12&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.1&&&&&&0&&&0|0&&&&&0|0&&&&&4k&&&&13k&&&116&&&01:11:42& &1&&&&&11&&&&&&5&&&&&&2&&&&&&&1&&&&&&33&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.1&&&&&0&&&0|0&&&&&3|0&&&&&6k&&&&&2m&&&119&&&01:11:43& &0&&&&&&9&&&&&&5&&&&&&2&&&&&&&0&&&&&&17&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.1&&&&&0&&&0|0&&&&&1|0&&&&&5k&&&&42k&&&121&&&01:11:44& &1&&&&&&8&&&&&&7&&&&&&2&&&&&&&0&&&&&&25&&&&&&&0&&6.67g&&14.8g&&1.22g&&&&&&0&&&&&&0.2&&&&0&&&0|0&&&&&0|0&&&&&6k&&&&24k&&&125&&&01:11:45&
原文链接:/blog/<st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="15" month="10" year="/10/15/simpler-cheaper-faster-playtomics-move-from-net-to-node-and.htm
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
原创头条头条外电头条
24H热文一周话题本月最赞
讲师:0人学习过
讲师:0人学习过
讲师:11人学习过
精选博文论坛热帖下载排行
本书的第1版获得过“2006年度全行业优秀畅销品种奖”。全书共15章,分别介绍了网管员职责和应具备的工作习惯、共享上网与访问控制方法、子...
订阅51CTO邮刊}

我要回帖

更多关于 类似 超能力风云录 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信