我发现了一些关于Meteor及其扩展功能的文章,但没有完全解释如何做到这一点.他们中的大多数都推广Oplog Tailing,但这不是我作为程序员在编写代码时需要考虑的事情,对吗?
当我看看modulus.io的定价模式时,它们为我提供了我的应用程序将使用的不同数量的伺服器,并声称"每个伺服运行一个应用程序的单个实例".运行多个实例是扩展Meteor应用程序的方法,对吧?
但是这有什么问题呢?与数据库的竞争条件可能会发生,对吧?我怎么处理这些?我是否需要设计我的应用程序以便不会发生竞争条件,或者我可以在它们发生时处理它们吗?
在考虑扩展之前,我曾经用来setInterval运行后台任务(例如,每小时向我发送一封包含一些数据的电子邮件).但是,我不希望我的应用程序的每个实例都这样做,而只是一个.这是什么解决方案?Meteor有可能吗?
Aks*_*hat 14
要拥有可扩展的Meteor应用程序,您需要认真考虑几件事情.这里只是设计考虑因素,而不是代理技术或负载平衡方法.
1)避免写入或读取文件系统.Meteor的设计决定是Assets.getText/ getBinary仅针对生产中捆绑的文件,但由于这个原因,没有直观的方式来读取或写入文件.如果您有多个发电机,您可以获得一个只能在一台服务器而不是另一台服务器上拥有数据的请求.使用S3或GridFS将任何上传的文件存储在无人机上.
2)如果你Meteor.setInterval的代码中有一个,它将与其他"无人机"并发启动,所以请确保你编写代码以通过cron作业单独地与应用程序本身一起工作或确保只有你的应用程序的一个无人机做这个.
3)如果myCollection.find().observe..服务器端的代码中有任何地方与客户端实例无关,请避免使用它.这可能会创建竞争条件,因为所有竞争条件都会同时获取信息.考虑创建一个单独的应用程序或确保只有一个无人机可以运行这些或它们将运行多次.
4)避免使用存储用户状态的变量.例如,您有一个全局变量,就像UsersOnline = []您使用Meteor方法或发布方法更改一样.考虑将状态存储在mongo或redis上,以便每个无人机可以访问彼此的状态.
5)确保每个无人机都使用oplog而不是轮询间隔系统.否则,当另一架无人机更改数据时,您的应用程序的其他无人机将会延迟.
请注意用于确保支持oplog拖尾的查询.并非所有查询类型都受支持,特别是涉及观察者的情况.您可以使用该facts包来确定这一点.
6)考虑仅使用无人机进行websocket/ddp服务器连接.这是使用WebAppInternals.setBundledJsCssPrefix('https://xxx.cloudfront.net');(如果你使用cloudfront,任何其他cdn工作正常)作为你的应用程序前面的CDN.这可以确保您的应用加载速度很快,但每个无人机都不会一次又一次地提供静态资源.它还减少了每个负载
7)小心你添加的任何包,并确保他们也遵循上述.
您可以使用单独的Meteor应用程序,也可以确保Meteor应用程序的单个实例执行此操作.如果您可以访问可以确定哪些无人机在线的api,则可以使具有最低端口的无人机执行该任务.请注意,由于单个无人机可能处于脱机状态,因此请不要在恒定端口上执行任务,以考虑冗余.