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