限时领|《AI 百问百答》专栏课+实体书(包邮)! 了解详情
写点什么

Meteor 为增强扩展性弃用轮询和差异机制

  • 2014-02-25
  • 本文字数:1637 字

    阅读完需:约 5 分钟

一直活跃在 Meteor 社区的 Tom Coleman 最近发表了一篇文章:扩展Meteor:实时程序的挑战,介绍了Meteor 为增强扩展性而在实时处理机制上作出的调整。

Oplog tailing

自 2012 年 Meteor 问世以来,人们就在询问它的扩展性如何。虽然 Meteor 的实时处理特性很吸引人,但人们也很关心它的处理能力,关心它能否驾驭得了更多资源。Tom Coleman 在他的这篇文章中介绍了传统的、单页的和实时的三种不同的 web 程序模型,并指出三种模型实现扩展性时所面临的问题也是不同的;阐述了轮询和差异机制的处理特点及不足;接着又讲解了 Meteor 采用的新机制:Oplog tailing,以及这种机制的源起和优势;最后又给出了一些增强程序扩展性的策略性建议。同时他也提醒说:“… Meteor 的扩展性领域仍处于快速变化的状态下,所以在这个主题上很难做到盖棺定论 ”。

最后,在一个实时的单页程序中 (比如 Meteor 程序),客户端不仅能请求更多数据,服务器还可以把数据推送给客户端 (比如当数据库中的数据发生变化时)。
这引发了一些有趣的问题:服务器怎么知道数据什么时候发生了变化?还有,服务器怎么知道该把那些变化发送给哪个用户?这些问题是掌握实时程序性能特点的关键。

Meteor 最开始用轮询及差异的机制监测数据库的变化,虽然这一机制很快就会被 Oplog tailing 取代,但我们还是很有必要了解它。

Meteor 会为每个订阅了结果集的用户建立一个LiveResultsSet(LRS),并由它负责轮询数据库。得到数据库的查询结果后,并不会把全部内容都送回客户端,而是要通过比较找出新结果和之前结果的差异。但这种比较通常是非常昂贵的计算,所以经常是 CPU 先成为 Meteor 程序的性能瓶颈。导致同时有很多差异计算发生的原因主要有两个:

  1. 有很多不同的 LRS。尽管 Meteor 会尽最大努力在用户间共享 LRS,但有时做不到这一点。
  2. 数据库的写入操作很多,这反过来又会导致更多的轮询。

Meteor 0.7.0 中使用了新的Oplog tailing机制监测数据库,这一机制是基于 MongoDB 的 Oplog 实现的,Oplog 是 Mongo 用来同步副本集的。但它只能告诉 Meteor 集合层面的变化,所以 Meteor 还要做大量工作来确定查询层面的变化,并确定这些变化是否应该发给订阅了查询的客户端。

尽管 Oplog tailing 技术比粗陋的轮询和差异算法效率高得多,但要实现实时仍然会有很高的 CPU 负载。

所以尽管 Oplog tailing 真的带来了改善,但我们依然要铭记,它跟你对你的发布 / 预订策略的正确思考是分不开的。此外,即便你启用了 Oplog tailing,现在也只有一部分查询适用此项技术。

数据推送方式

除了介绍监测数据变化的机制,Tom Coleman 还讲解了 Meteor 如何确定该将数据变化发送给哪些用户。

这意味着要为每个已连接客户端维持一个“内存数据库”(在 Meteor 中,即 Minimongo 中的内容)。Meteor 中包含这个的数据结构是 Merge Box
这样的直接影响是每个已连接客户端都要在服务器上占用一部分内存。并且你向客户端发布的数据越多,服务器上追踪它们所用的内存越多。

文章还给出了几个增强程序扩展能力的策略:

  • 尽量将用户独有的预订数量降到最低,让 Meteor 可以最大限度地跨用户汇集工作。
  • 使用更简单的查询,因为这通常意味着 Meteor 在决定变化是否会影响到它时所做的工作更少。
  • 限制数据库的写操作(特别是那些被重度观察的集合),这样 Meteor 做有限的工作就可以保证这些观察可以及时更新。

文章最后还给出了几个监测工具,比如监测每个集合上打开 LRS 状态的 Server Info ,收集打开的观察器相关数据的 Facts 包,性能监测服务 MeteorAPM ,测试程序扩展能力的 Load Test

在最终的结论部分,Tom Coleman 说:

就像我们看到的,实时程序之所以比传统的 web 程序对服务器有更高要求,是有些根本原因的。希望本文能帮你理解各种起作用的因素,让你在扩展 Meteor 程序时更容易一点儿。


感谢水羽哲对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-02-25 02:181874
用户头像

发布了 45 篇内容, 共 26.4 次阅读, 收获喜欢 11 次。

关注

评论

发布
暂无评论
发现更多内容

终于啃完了Java核心原理+框架“面试圣经”成功五面上岸美团

小Q

Java 学习 编程 架构 面试

阿里云官方推出操作系统“等保合规”镜像 -- Alibaba Cloud Linux 等保2.0三级版

阿里云基础软件团队

内核

移动安全加固助力 App 实现全面、有效的安全防护

蚂蚁集团移动开发平台 mPaaS

安全攻防 App风险 mPaaS

重磅解读:K8s Cluster Autoscaler模块及对应华为云插件Deep Dive

华为云开发者联盟

容器 k8s 服务

如何实现后台管理系统的权限路由和权限菜单

徐小夕

Java 大前端 编辑器 H5 数据可视化

浅谈API网关(API Gateway)如何承载API经济生态链

华为云开发者联盟

API 网关

架构师训练营第 1 期第 7 周总结

owl

极客大学架构师训练营

【涂鸦物联网足迹】涂鸦云平台接口说明

IoT云工坊

人工智能 物联网 API sdk 云平台

价值超10亿美元的直播系统架构图是什么样子的?

冰河

系统架构 高并发 高性能 亿级流量 直播架构

【云小课】版本管理发展史之Git+——代码托管

华为云开发者联盟

git 代码管理 托管

谈谈敏捷开发概念和迭代开发方案

Learun

敏捷开发

帮助企业摆脱困境,名企归乡工程师:能成功全靠有它!

Philips

敏捷开发

解决大中型浏览器(Chrome)插件开发痛点:自定义热更新方案——2.基于双缓存更新功能模块

梁龙先森

Java chrome 大前端 浏览器 技术方案

医疗界“最强大脑”落户杭州!阿里巴巴联合浙大一院共同打造

互联网

Apache DolphinScheduler 是如何走进Apache的

代立冬

大数据 数据湖调度 DolphinScheduler Apache DolphinScheduler

【运维思考】如何做好云上运维服务?

嘉为蓝鲸

云计算 运维 数字化转型 数据中心 云服务

爆料!前华为微服务专家纯手打500页落地架构实战笔记,已开源

996小迁

架构 面试 分布式 微服务 程序人生

架构师训练营第一期 - week8

习习

百亿级数据分表后怎么分页查询?

艾小仙

Java MySQL 数据库 编程语言 分库分表

魏际刚:精准谋划我国供应链发展新方位

CECBC

供应链 物流

终于啃完了这份Java核心原理+框架“面试圣经”,成功五面上岸美团

Java架构追梦

Java 架构 面试 微服务 框架开发

DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座

华章IT

数据库 postgresql

LeetCode题解:77. 组合,递归回溯,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

技术分享:WebAssembly能否重新定义前端开发模式?

葡萄城技术团队

webassembly

每周一看:16份文档资料,程序员软硬实力全概览,总有一个适合你

小Q

Java 学习 程序员 架构 面试

架构训练营 - 第7周课后作业 - 学习总结

Pudding

揭秘在召唤师峡谷中移动路径选择逻辑?

华为云开发者联盟

算法 地图 最短路径

《Python:Python编程简介:计算机编程和机器学习入门指南》

计算机与AI

Python

架构师训练营 - 第 7 周课后作业(1 期)

Pudding

又一道比较运算符相关的面试题让我明白基础很重要

Gopher指北

Go 语言

如何稳扎稳打推进数字货币进程

CECBC

数字货币

Meteor为增强扩展性弃用轮询和差异机制_语言 & 开发_吴海星_InfoQ精选文章