说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

技术栈的选择:从Groupon转向Node.js、淘宝去IOE谈起

HTML文档下载 WORD文档下载 PDF文档下载
今年10月份,知名团购网站Groupon宣布完成了为期1年的工作——将Groupon美国站点从Rails迁移到了Node.js;在2010~2013期间,阿里巴巴逐步完成了“去IOE”运动……这些公司为什么要如此“折腾”呢?

在本文开始之前,先来看看一些案例。

  • 今年10月份,知名团购网站Groupon宣布完成了为期1年的工作——将Groupon美国站点从Ruby on Rails全面迁移到了Node.js。
  • 2010~2013期间,阿里巴巴逐步完成了“去IOE”运动,将“IBM小型机+Oracle数据库+ EMC2存储”架构逐步转向了“MySQL+PC Server”。
  • Twitter将其一些后端服务从Ruby on Rails迁移到了JVM上。
  • 京东商场后台抛弃.NET,使用Java重写。
  • Facebook iOS客户端使用HTML5重写,后又换回原生应用。
  • ……

一、这些公司为什么要如此“折腾”

关于技术栈的选择和迁移,并不是几个简单的原因就能说清楚的,也并不是说新的技术栈就比老的技术栈要优秀很多,其实每种技术都有存在的理由,并在特定领域内有其强大的优势的,当然也有缺点,比如 C的性能很高,但是开发效率较低;Java的功能强大,但是没有Ruby简单灵活。

那么这些公司为什么要如此折腾呢?下面以一些公司的实际案例,仅列出一些主要、常见的原因。

1.  速度、可维护性——Groupon从Rails转向Node.js


为什么要放弃原有技术栈?

Groupon目前在全球共有两套站点——美国网站和欧洲网站,其美国网站前端最初是一个单一的Rails(最流行的Ruby开发框架)代码库。对于为什么会选择Rails来开发最初的网站,Groupon开发人员表示,Rails非常适合小型团队快速开发,可以让网站快速启动并运行起来,这对于初期功能不断变化的Groupon来说,是个非常不错的选择。

随着Groupon的发展和新产品不断推出,这个代码库越来越大,有太多的开发者在同一个代码库工作,他们很难在本地运行并测试产品,如果有问题需要回滚,那么每个人的工作都前功尽弃了。

Groupon团队决定将原有的单一Rails库分割成小的、独立的、更易于管理的库。

为什么选择Node.js?

Groupon团队评估了不同的软件栈,想寻找一个能够解决这些问题的方案——有效处理大量传入的HTTP请求、使并行API请求服务于每一个HTTP请求、将结果渲染为HTML5,并可以有效实现监控、部署和支持。

该团队使用不同的软件栈开发了原型,并测试了它们,总体来说,发现Node.js是个非常适合的解决方案。

如何迁移?

Groupon团队使用Node.js重建了网站页面的每个主要部分,将它们作为一个独立的Node.js应用程序,然后重建了基础设施,使所有独立的应用程序可以一起工作。迁移之后,Groupon成为了全球最大的Node.js部署产品之一。

迁移带来的好处

  • 之前单个Rails前端代码库被分割成了20个独立的应用程序,其带来了如下的好处:
  • 页面加载更快——快了50%
  • 与之前相比,处理相同的流量所使用的硬件资源更少
  • 团队可以独立地更改、部署各自负责的模块
  • 网站功能和设计实现可以快速迭代

更详细的信息可参阅 Groupon开发团队的博客。

2.  原有技术栈已无法满足如今的规模——Twitter部分服务从Rails迁移到了JVM


Twitter在2006创建初期也是基于Ruby on Rails开发的,其架构设计也是完全可以应付当时的访问量。但是随着Twitter的快速发展,在每秒上万访问量的处理上,原有架构开始出现各种性能问题,比如Twitter开源负责人Chris Aniszczyk称,在2010年世界杯期间,球员进了一个球或者得到红黄牌,网站就宕机了。

为了解决这个问题,Twitter急需开发一个全新的架构,以应付现在越来越大的访问量。对于Twitter为什么从Rails转向JVM语言,来看看Ruby创始人松本行弘是如何说的。

Twitter刚开始开发的时候不可能考虑到会有现在这样大的访问量,可以说现在的Twitter发展到当初在设计上的极限了。
一个网站在遇到设计极限的时候,有很多解决方法,比如重写架构、换其他语言等等,他们的工程师想要挑战一些新的东西,就提出要改用Scala,因为Scala是编译型语言,性能也不错,正好适合编写新的架构,我觉得这样也不错。
在我看来,在网站所提供的服务还没有完全成型的时候,最重要的是能够对需求的变化做出快速的反应,这个时候就需要Ruby这样灵活性比较高的语言;而在网站获得成功之后,遇到了设计瓶颈,用一种新的语言,比如Scala,来编写一个新的架构,以节约一定的资源,我认为这也是很好的一个结果。Twitter转向Scala还只是在其核心部分,而在Web前端和一些内部工具上还有很多地方在用Ruby。

此外Twitter还将一些后端服务使用Java和 Clojure(基于JVM的Lisp方言)进行了重写,其基础设施也采用了一些开源项目。

迁移后,Twitter在美国总统竞选期间没有出现宕机。目前Twitter每秒处理约6000条消息,加起来每天处理超过5亿或每周35亿条消息。

3.  技术上更可控,规模上更易扩展——淘宝去IOE


2010~2013期间,阿里巴巴逐步完成了“去IOE”运动,将“IBM小型机+Oracle数据库+EMC2存储”架构逐步转向了“MySQL+PC Server”。

至于阿里巴巴为什么要“去IOE”,阿里技术保障部DBA负责人周宝方表示主要从以下几个因素考虑:

  • 集中式的严重制约:集中式强大单点远远满足不了阿里特别是当时淘宝爆炸式业务增长应用的模式,这里可分为三个方面,稳定性、跨IDC容灾切换、快速扩容;
  • 技术面临失控,创新潜力受限;
  • 专用设备规模化场景下诸多限制;
  • 成本(这应该是整体最次的因素);
  • 安全

“去IOE”之后,阿里的技术架构非常灵活,支撑了业务的快速发展,比如在双十一,阿里可以很淡定地做业务扩展;其次是阿里掌握了技术自主可控操作;另外还包括基础工程技术和人才的积累、技术的沉淀、成本、安全性的提升等等。

详细信息可参阅《 阿里周宝方谈“去IOE”战略及实施》。

4.  快速开发需要——PayPal使用Node.js重写其支付系统


PayPal 公司长期存在着“ 非我所创 ”的文化,这导致 PayPal 采用新技术的态度很消极,项目开发进度也极其缓慢。正是由于 PayPal 行动缓慢,其他支付服务商 Stripe 和 Square 趁机成长,逐渐撼动 PayPal 的市场地位。同时,PayPal 当时的开发技术也已经无法满足快速开发的需求,因为当时的开发基本全是 Java,不需要用 Java 来实现的也会用 Java 完成。

2012年4月,David Marcuss成为 PayPal 的总裁后,任命工程师团队重写支付系统,最终,工程师团队用了8周时间完成了该项任务,他们选择了Node.js和一些开源项目对系统进行重新开发,最终他们将这一技术栈整合成了一个 快速开发框架——Kraken,以实现公司其他产品的快速开发。

5.  追随潮流,但这是有代价的——转向HTML5


HTML5 是应用开发领域的未来趋势,由于其跨平台性,一些企业也开始将应用使用HTML5重写。

比如Facebook和LinkedIn采用HTML5重写其iOS客户端。但是他们也付出了一定的代价——由于用户的网络环境并没有预想的那么好,结果导致应用启动、浏览信息流、打开图片都比较慢,因此他们后来又放弃该技术,转而使用苹果的iOS SDK重新构建,由于是本地应用,速度提升非常明显。

当然,这并不是说HTML5不好,而是时机还未成熟。

6.  成本考虑——选择开源软件


由于昂贵的成本,开源软件往往是小型初创公司的首选。比如服务器方面:

  • 单从系统的性能和吞吐量来讲,Windows Server也不差,但是Windows在管理和部署方面没有Linux方便;
  • Windows服务器的授权费用使架构规模的横向扩展成本偏高;
  • 一些高端的服务器软件只有UNIX/Linux版本
  • 一些优化、缓存、数据库解决方案只针对Linux。

7.  更换技术团队或CTO


有这样一种情况存在,比如原有代码库相关开发者大部分都离职了,且相关工作没有交接好,文档又不全,导致现有的开发人员难以维护,或者现有开发人员认为原有代码“坏味道”太多,不愿意维护,所以团队一拍即合,重写架构。

也有可能公司更换CTO后,公司的原有架构不是新CTO所熟悉的,而且他认为原有架构有一定的问题。

8.  被迫选择


如果公司正使用的某些产品的原开发者不再提供支持,那么只能寻找其他替代品。

还有就是在特定平台上,你只能选择某个技术栈,比如iOS开发,你只能选择Objective-C(当然也可以选择其他跨平台开发工具,但是性能上比不上原生应用)。

二、大公司是如何做的

在技术栈的选择和迁移上,大公司会非常慎重,不仅要考虑新的技术栈是否能解决现有的问题,还需要从公司战略(比如发展方向)、技术发展局势(比如移动化、云端化)方面考虑。

1.  不断尝试新技术栈——Groupon

迁移现有架构或技术栈,需要大量的人力和其他资源,此外,为一个线上产品更换底层设施需要非常高的技术,比如有人将淘宝去IOE比喻成在公路上为一个高速行驶的汽车更换轮胎。

一些公司的开发团队会尝试不同的技术栈,制作出原型并进行测试,以此来看是否满足需求。

除了做好预备工作外,开发团队还会选择先迁移部分应用或服务,小步前进,并在此过程中,快速验证新技术栈的适用性,并及时反馈,以便能够发现问题后快速回滚。

2.  优化原有技术栈——Facebook

当然,也有一些公司不愿放弃原有的技术栈,比如 Facebook,转而在原有技术栈的基础上进行优化。

Facebook的前台主要使用PHP编写,尽管PHP编程效率高,能够支持产品的快速迭代,但是与传统的编译语言相比,脚本语言在CPU和内存使用率上不够好,随着Ajax技术的广泛采用,加上SNS对动态要求较高,这些缺点更显得突出。

自2007年以来,Facebook尝试使用多种不同方法解决这一问题,比如使用另一种语言重写Facebook、重写PHP的核心部分Zend引擎,但最终还是没有获得所需的性能。

于是HipHop for PHP诞生了,该项目由一个PHP到C++的转换程序、一个重新实现的PHP运行库和许多常用PHP扩展的重写版本构成,可大大加速和优化PHP应用。据悉,由于HipHop,Facebook Web服务器上的CPU使用率平均减少了50%。

3.  也有失败案例

当然,在技术栈迁移过程中,也有失败的案例,比如5173网站从.NET转向Java以失败告终。详细信息可见范凯 《对.NET系统架构改造的一点经验和教训》。

三、如何选择技术栈


选择技术栈需要参考的因素有很多,一些基本因素如下:

  • 产品预期上市时间
  • 开发团队和生产力情况
  • 可维护性
  • 可扩展性
  • 使用环境
  • 社区和许可情况(开源项目)

对于实际上该如何选择,华为开源支持平台专家庄表伟给出了他的建议。庄表伟认为:

在快速原型的阶段,就可以选择快速开发的语言,而在实用的阶段,就应该选择更加实用的语言。而在一些极端的领域,效率至上与实用至上可以毫不相干,各自有所追求,前期追求效率的开发产品,由于成本极低,大多是可以随时抛弃的。而真正的困难在于想要兼得。常见的与架构相关的两种痛苦:

  • 一种是,刚开始为了追求快速开发,在技术选型上怎么快怎么来,结果系统越来越大,越来越复杂,等到想要考虑架 构优化,想要重构的时候,却已经积重难返,改起架构来伤筋动骨;
  • 另一种是一开始想得太多,架构做得太复杂,杀鸡用牛刀的技术用得太多,往往还没有等到系统开发完成,就已经Game Over了。

庄表伟认为想要兼得鱼和熊掌的确困难,但是并非没有可能,我们可以找到一些优秀的、可选的技术集合,对于技术选型的判断,需要考虑理论情况与实际情况:

考虑效率

  • 技术复杂度(复用性):学习并掌握一组技术栈,需要了解多复杂的技术;相应的,当我们掌握了这门技术,它可以在多少地方复用?
  • 技术友好度(优雅性):在开发的过程中,会不会有各种莫名其妙的陷阱,会不会让我纠缠于各种莫名其妙的细节?

考虑实用

  • 业务复杂度(组织性):随着业务的复杂,我们的代码会不会最终无法驾驭?无法维护?无人能懂?
  • 性能提升度(潜力):随着业务的增长,压力的提升,我们会不会最终被迫放弃现有的技术架构,重头开始?

详细信息可参阅《 技术选型:效率至上与实用至上》。

四、看顶尖互联网企业的技术选型

在Delphi 中 利 用 Tbatch 组 件 完 成 数 据 批 处 理 在Delphi 中使用计算出的字段 在Delphi3 程 序 中自 动 检 测、 建 立 数 据 库 别 名 和 表 格 在Delphi3程序中自动检测、建立数据库别名和表格 在Delphi4 BDE中配置Access数据库 在Delphi5 中修改了Delphi自带的VCL Source文件后怎样重建Delphi的库文 在DELPHI程序中动态设置ODBC数据源 在DELPHI程序中使用ADO对象存取ODBC数据库 在DELPHI程序中自动设置ODBC数据源 在Delphi的DBGrid中插入其他可视组件 在Delphi的Socket编程中如何从服务器向指定的客户机发送信息? 在Delphi动态生成定义数据库 在Delphi中处理数据库日期型字段的显示与输入 在Delphi中简单实现多重查询 在Delphi中建立和使用别名 在DELPHI中使用ADO对象存取ODBC数据库 在Delphi中使用DBF数据 在Delphi中随意控制DBGrid 每一行的颜色 在Delphi中自动检测、建立数据库别名和表格 在存储过程中使用use database-Delphi资料 在一个Dbgrid中显示多数据库-Delphi资料 在运行期创建表-Delphi资料 怎样把可以使用的表名输出到一个选择框?-Delphi资料 怎样发布基于Microsoft SQL Server的程序-Delphi资料 怎样解决打开一个DBF表时的Index not found..错误-Delphi资料 怎样向SQL Server插入带有Image字段的记录-Delphi资料 怎样在Paradox表中加密码?-Delphi资料 自动Login数据库-Delphi资料 自动检测、建立数据库别名和表格-Delphi资料 自动注册Paradox-Delphi资料 Delphi 4增訂的Object Pascal 做一个分布式的例子时的问题 大家帮我看下这几句问题到底出在哪里呀!!!!!!!谢谢 连接数据库的疑问,盼望解答!! 什么叫作实例? 菜鸟问题 十万火急:MDI的一个问题?????????在线等待!!!!!! 调查一下用汇编语言开发的工资如何?(深圳 ) 有关Builder版的兄弟定期进行网上技术交流的倡议书! 急!关系到我是否找到工作,请回答 如何根据Form的大小调整控件的大小 闪盘的另一个分区不能用了!!在线 连接数据库的疑问,盼望解答!! 急!急!急!请教一个共享的问题? 请问哪里有Class类和Method这两个类的说明呀!谢谢! 怎样打开CSDN电子版 请推荐一下有关于JAVA,JSP,JAVASCRIPT相关的好书 汽车与电脑谁重要(转) 转让 全新飞利普 820 彩屏手机一部(个人) 请问是否有可以统计数据的电子表格控件? 给点看法? 是不是来这里的人混得好的不多,搞得我都不敢跳槽了 倒霉就一个字,我只说一次。 一个关于Delphi的简单循环外提(编译优化)的测试,有兴趣进来看看 大家遇到这样的问题了吗? DTPicker的问题,急急急!!!! sun的ultra5启动时显示没有键盘设备,可能是键盘坏了,哪里能找到这种8芯的鬼键盘? softice调试时出现的有意思的问题 怎样终止一个函数? 关于j2ee的几个问题 谁有数值计算方法与c语言工程函数库的代码,急!!! 麻烦有项目开发经验的大虾进来看看,给项目估个价!谢谢! 急!!大问题!!求助!!发扬你们的美德吧! JAVA的配置问题 菊花在水里跳舞!!! 用什么来写啊!!!jdk还是jbuilder TP-LINK的RTL8029(AS)芯片的网卡怎么装? w32dasm怎么把程序中的中文字符串反汇编成指令了呢? 曾用B/S四层结构开发过OA的,请进!! sql语句的问题? 关于QUERY->SQL的赋值 c++学习中的问题,拿来和大家一起讨论。 求助!要写一个MP3的播放程序~~ Project Settings里面的设置怎么设为默认值,让以后新建的每个工程都适用? 怎样读取数码相机的照片,并将它存入sqlserver数据库中(100分) VB6菜单设计器设计的菜单跟到WINDOWSXP下面,会自动变成XP类型的菜单吗? 请问openpicturedialog的用法? 紧急求教:ScktSrvr(Borland Socket Server)设置问题????????? 关于com与asp的疑惑 怎样读取数码相机的照片,并将它存入sqlserver数据库中 JSP里连接DB2的疑问? 为什么dbgrid的网格颜色属性的更改不是每次都可以。 有一块3公顷的地,把它分成7份,每份多少公顷?其中3份种桃树,桃树地占这块地的几分之几?桃树有多少公顷?每份多少公顷?3除以7等3/7公顷.桃树占这块地的几分之几?3/7=3/7占地3/7.问题是桃树有多 一平米可以种多少棵桃树 《三字经》的内容 课间操上,同学们排成一列纵队,彤彤站在其中.她数了数,排在她前面的人数是总人数的1/4,__________________,(这里缺了个条件,谁知道),彤彤应排在第几? research是可数名词吗? The temperature has __high this week.A.got B.stayed 选哪个,为什么?保持升高?那变得高了不行么? Is it easy or difficult for achild to wake up and know where he or she is? 在一个长300米宽250米的果园里种了8000棵桃树,平均每公顷种桃树多少棵? The temperature has stayed _____ this week A hest B highly C high D heated For example,it's easy for a child to wake up and know where they are.这里的a child表示孩子们,帮我说说这一类的语法,为什么单数可以表示复数? research可数吗? what the temperature for 3 week 脊椎动物中变温动物有哪些?说了答了那20分就是你的啊~~~ 错了 是30分要~ 你说叼不叼~叼不叼~叼不叼~叼不叼! 快车、慢车同时从甲乙两地相向而行开出4小时后还相距240公里,已知快车行完全程要10小时,快慢车的速度比是3比2,甲乙两地相距多少公里?用小学六年级解题方法,谢谢. a scolding hurt more than a beating什么意思 这句话是否有错误:For example,it's easy for a child to wake up and know where they are.For example,it's easy for a child to wake up and know where they are.a child 与they are是否不太一致?要么把a child 改成children,要么把they are 一列快车与一列慢车同时从甲乙两地相向而行,开出4小时后还相距240千米.以知快车行完全程要10小时快车与慢车的比是3:2.甲乙两地相距多少米 求三字经的内容.我想自己随时都方便看. 在脊椎动物中,属于变温动物的有_____类,属于恒温动物的有____类? 一只船顺水行320千米需用8小时,水流速度为每小时15千米,这只船逆水行这段路程需用几小时?马上回复,用方程和算式解答,快啊, 孩子们调课了,大人调吗 It's easy for a child to wake up and know where they are.where引导了什么从句啊?句子中有什么需要掌握的语言点么? the little girl is lovely 自然课上做的实验 脊椎动物中变温动物有哪三类 还要音标 she hurt (hurt) my feelings.i'sorry to hear that he has been seriously ( serious)ill为什么要用副词...还有那,'是什么的缩写吗.he is busy with the organizing (organize)of a new club.为什么是organizing...we chattered like two teenage research当名词讲有单复数形式吗? 预备语文课文布丰的《松鼠》节选中第二节的第一句话的作用是什么,它们面容清秀,眼睛闪闪有光,身体矫健,四肢轻快,非常敏捷,非常机警. You are a liar!Deceive my feelings Hurt my heart!Wu Yu-you! research前面能用名词吗 语文六年级上课文《松鼠》布丰,课后学习建议,积累 快 求翻译.hurt my feelings 测量盐酸浓度 5%用什么膜片的差压变送器,316的可以吗盐酸浓度 5%,温度25度 to the best of our knowledge是什么意思 六(2)班开展向山区儿童捐书活动,第一小组捐书36本.第二小组捐的是第一小组的8/9,是第三组的4/5,六(2)班共向山区小朋友捐书多少本? 天然气输气过程中,差压变送器平衡膜片被冲破后会出现什么情况? this is sea brief looks 还有OLD TO THE 都是衣服上印的文字 You ought not to have hurt my feelings.什么意思 She wanted to know __ child it was on the grass.为什么空处是填whose而不是whom,不是应该填宾格吗? 文章《老王》中,哪些地方用了各种描写比如动作描写 之类的 并赏析 要赏析好点哈 我明天就要 教育要因材施教, 一方阵形桃园共11层,最里层共种16棵桃树,若每颗桃树结桃60千克.这个桃园共结桃多少千克? to our best knowledge是什么意思 We l----- like each other very much and we like to help each other. 一方阵形桃园共15层,最里层共种12棵桃树,若每棵桃树结桃子60千克,这桃园可结桃多少千克? 我做题时看到了这样的句子 What is your last name My name is Black.对么 so we miss each other very much的中文意思 一个三角形桃园,底45米,高40米.如果平均每棵桃树占地9平方米,这个桃园一共有多少棵桃树? 三字经全部内容 根据句意填空.Ann and Joan are( 1 ) .They look( 2 ) each other very much.People often ( 3 ) that Ann is Joan or Joan is Ann, ( 4 ) it's to tell the difference.上面一句的t's和to之间还有一个空,第二句以下为准。People who"s the little girl sitting ( )a big tree 两列火车同时从甲乙两地相对开出.快车行完全程需要20小时,慢车行完全程需要30小时,已知快车中途停留2小时,慢车停留1小时.则两车开出后多少小时才相遇 三字经的内容是什么? I don t know.Does she do morning exercises hereeveryday? 两列火车同时从甲乙两地相对开出.快车行完全程需要20小时,慢车行完全程需要30小时.已知快车中途停留停留2小时,慢车停留1小时.则两车开出后多少小时才相遇? 三字经,主要内容 青蛙是水里排卵来繁殖后代的吗 两列火车从甲、乙两地同时相对开出,快车完全程需要二十小时,慢车行完全程需要三十小时,开出后十五小时两车相遇.已知快车中途停留四小时,慢车停留了几小时? 老王 墓志铭 50字给《老王》中的老王写墓志铭 媒体揭秘美国监听手段:大使馆屋顶材料美无人机操作员:操纵飞机在阿富汗杀人美机场枪击案导致1死7伤 疑犯称对政日议员不顾禁令执意访朝 或受到处分哈里王子遭英国报刊窃听五角大楼否认美日制定“钓鱼岛共同防卫德国人在乎被美国监听吗?美驻德大使馆“近水楼台”监听默克尔 洛杉矶机场发生枪击案致1死7伤 嫌犯委总统微博掉粉 谴责国际右翼势力插手斯诺登密会德议员 称愿为NSA窃听事美国一长约4米重达330公斤巨鳄被捕媒体揭秘美国监听手段:大使馆屋顶材料五角大楼否认美日制定“钓鱼岛共同防卫放宽对华签证国家持续增多 目前已有1杭州昨雾天多个监测点PM2.5超标 日参议员违禁访朝促改善日朝关系 或将中国多地同现雾霾 华北再中“霾伏”局北京遭5级以上重度“霾伏” 一周发4北京继续被雾霾笼罩 前门PM2.5居德国与巴西共同向联合国提交有关反监控职场上,“稳定”有个卵用外媒:俄达吉斯坦爆炸致一警察死亡 I外媒:大众汽车或面临美国上百亿美元新3月30日全球媒体头条意外!外汇局大手笔杀入A股!抢高点和结硬寨 联想控股年报透露了什油价“涨”声如潮 EIA暗变“杀手”A股预言:今日暴涨原因已查明,周四早iPhone SE明天发售 国行请认揭秘高科技:iPhone SE缺少的意外吗?iPhone SE将成功收揽苹果新品明日发售,这次可以用微信支付美联储诸般作为,是为非农做好铺垫?且新疆决定开展“民族团结进步年”活动别再被天价学区房忽悠了,快来看看这个从代孕事件看试管婴儿 这条路该怎么走从硬件到生态 海信金刚II发力户外运大部分人不懂的EIA数据内幕,学会的中国中产突破一亿,已经超越美、日?一句话就能左右油价,“她”眼下最担心为什么我们应该害怕被“支付宝”和“微
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘