如何利用Node.js 构建分布式集群

JavaScript010

如何利用Node.js 构建分布式集群,第1张

那么到底是如何实现服务端调用解耦的呢?在实现方案中,我们采用了(Node.js + Protocol Buffers + Zookeeper + RabbitMQ)的组合,从而实现配置集中化管理:

1.Node.js,主要用于开发业务逻辑。

作为天生的异步脚本语言,Node.js 使用事件驱动、 非阻塞I/O模型大大提升了研发效率,非常适合在分布式设备上运行的数据密集型的实时应用。

我们通过 Fibers库采用协程的方式来解决Node.js 异步编程匿名回调问题,将异步回调逻辑转化为同步,同时也满足了程序员使用同步方法编写异步程序的情怀。

可参考官方介绍: https://nodejs.org/

https://github.com/laverdet/node-fibers

2.Protocol Buffers,用于强约束消息定义。

Protocol Buffers一种数据交换的格式,它独立于语言,独立于平台。由于它是一种二进制的格式,相比XML和JSON,传输效率会更高,可以将它用于分布式应用之间的数据通信或者异构环境下的数据交换。我们主要将Protocol Buffers用来模版化定义消息结构。

可参考: https://github.com/google/protobuf

3.Zookeeper,实现配置集中管理。

Zookeeper分布式服务框架是Apache Hadoop 的一个子项目,简单的说,Zookeeper=文件系统+通知机制。它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。

我们使用ZooKeeper看重的是它不仅支持集群高可用,还支持持久化节点、临时节点存储和节点变更监控的特点,主要使用了它提供的命名服务、配置管理和集群管理服务。其中,临时节点特性用以实现名字服务注册,节点变更监控实现配置集中管理。

参考: https://zookeeper.apache.org/

4.RabbitMQ,实现异构通讯服务间的解耦。

Rabbitmq是一种应用程序对应用程序的通信方法,选择RabbitMQ的原因在于它可以支持集群高可用、简单易用、性能出色和完善的管理工具(如:Web ui / Rest API )的特点。

使用Rabbitmq中间件服务端实现解耦,其中主要是利用( Work Queue + Topics Exchange )来实现后端的无缝扩容,并采用Publish/Subscribe + RPC 实现调用解耦,并利用MQ 统一输入输出。

参考: https://www.rabbitmq.com/

走过的一些坑

最后,总结经验避免犯同样的错,是非常重要的,还有一些技术遗留问题,需要我们自行避开这些坑。以下是我们在构建RPC框架过程中遇到的一些坑:

异步编程效率问题(Fibers)&Node.js 内存泄漏问题

在复杂在构建复杂应用的时候,很多地方都可能发生内存泄露,也需要考虑异步编程效率问题。为解决这两个问题,我们目前主要采取以下三个手段来解决:

a) 框架封装所有网络通信,业务方只关注业务逻辑、提高研发效率;

b)通过Fibers 封装所有异步函数调用转换为同步方法;

c)谨慎选择第三方库。

异步框架中日志跟踪

异步程序记录日志乱序不利于跟踪业务逻辑调用路径。为解决这个问题,我们通过包装 Fibers 对每一个 Fiber 实例进行编号,在所有日志输出中打印 Fiber id 记录异步调用路径,并配合跨模块会话编号实现请求调用跟踪,以此解决日志纪录的无序问题。

RabbitMQ HA 高可用问题

如果需要实现RabbitMQ HA 高可用特性,有两种途径可以实现:Server 端 HA 和 Client HA。Server 端的高可用性可使用 LVS 或 HAProxy来实现,Client 端的高可用性也是一种选择,这样可以减少架构复杂度和层次依赖。值得注意的是,实现高可用特性时,要记得开启Queue 高可用配置。

(https://www.rabbitmq.com/ha.html)

RabbitMQ HA 网络闪断导致节点分区问题

网络不稳定导致RabbitMQ HA 网络闪断,进而导致节点分区问题。针对这个问题,需要添加对 /api/nodes 进行监控,并及时处理分区问题。

具体的解决方法可参考: https://www.rabbitmq.com/partitions.html

ZooKeeper Session Expired

针对ZooKeeper 会话过期问题,需要大家特别关注处理Zookeeper 集群断开后的重连处理,因为如果重连逻辑没有处理好的话,所有依赖ZooKeeper的特性都将不可用。

具体解决方法可参考: http://wiki.apache.org/hadoop/ZooKeeper/FAQ

结 语

经过应用实践,目前看来 Node.js几乎可以做到其他后端语言所能做到所有的事情,ES6特性正式发布如今有人已经开始高喊“javascript: The World's Best Programming Language”,但我也并不认为整个后端完全用Node.js来实现会是一个很好的方案。

本文中提到了Node.js的诸多优点,如异步、非阻塞和事件驱动等,但其也存在一些缺点,如默认单进程单线程不能利用多核,脚本弱类型容易出现运行时BUG,同时因为它简单易用,也导致了代码质量不易控制,对开发人员也提出了更高的要求。所以,就个人经验来看,建议偏复杂业务逻辑控制使用Node.js,如果是偏极致性能的业务建议和C++等其他方案结合使用。

就单单的从js方面来说

库:lib,方法库,或组件库。核心库是给二次开发同学用的,它严谨、符合标准、独立健壮、无污染。

框架:framework,主要是给用户使用,当然也给二次开发者用,它易使用、易扩展、可持续发展、可控。

有些框架,依赖它开发的东西,只能在它的树荫下生存,而无法独立。这样的框架,就不能当库来用。如jquery。

有些库,几乎没有框架的特性,所以易用性很差,如YUI2,所以,它的用户群也只能局限于二次开发者,或水平比较高的开发者。

为作框架,可能为了易用性,牺牲了严谨性。例如:渲染String与Array的prototype。这就与库的无污染理念冲突。

所以,一个产品,如果需要它自己即能当框架,也能当库,那么,它就需要权衡取舍。当然,他也可以选择有多种形式的输出(输出成独立的库,或是易用的框架)。

所以jquery是一个框架,其实目前来说,js库都可以叫作js框架,js类包是使用了oo的思想,封装的一个方法包,jquery也可以看作一个类包

JS 台湾全创作才华兄妹组合

1999年以哥哥妹妹为团名发过专辑<<SAY FOREVER>>

那清澈的声音让很多人始终难以忘怀

初尝走红滋味却遭遇唱片业改组 被迫雪藏...

2004年他们首次以JS团名发行专辑<<遇见未来>>广受好评

2006年 JS展开独立发行的道路 发行了EP三部曲.

投身到非主流音乐创作中来

JS的新专集也将在2008年和大家见面

JS档案

JS最全档案★

:::陈忠义:::

英文名字:Justin

生 日: 1977年2月6日

籍 贯:辽宁

出 生 地:屏东

星 座:水瓶

血 型:O

身 高:188 cm

体 重:75 kg

个 性:独立, 爱好自由

家庭成员:爸,妈,一姐,一妹

喜爱的歌手:David Foster, 阪本龙一, Laura Pausini,

喜爱的音乐:Folk,R&B,电影配乐

喜爱的电影类型:剧情片,科幻片,喜剧

平常的嗜好:看电影,旅行,享受美食

喜爱的动物:拉布拉多犬

讨厌的动物:蚊子

喜欢的颜色:白,黄,红

喜欢的服饰:休闲舒服的款式

喜爱的饰品:银饰

喜爱的食物:日本料理,意大利面,泰国菜

最想做的事:低调的音乐人

对自己的形容:务实的天真者

如何踏入演艺圈:MTV新声卡位战创作组第一名1999年推出第一张国语大碟GoGo&MeMe「Say Forever」

:::陈绮萱:::

英文名字:Sophia

生 日:1980年7月26日

籍 贯:辽宁

出 生 地:屏东

星 座:狮子

血 型:O

身 高:175 cm

体 重:58 kg

个 性:慢热

家庭成员:爸,妈,一兄,一姐

喜爱的歌手:Misia,中岛美嘉

喜爱的音乐:Jpop和其它一听就喜欢上的音乐

喜爱的电影类型:黑色喜剧,文艺爱情片

平常的嗜好:料理,阅读,看电影,上网

喜爱的动物:黄金金吉拉

讨厌的动物:青蛙

喜欢的颜色:桃红色

喜欢的服饰:有个性外加一点点女人味的款式

喜爱的饰品:自己的DIY

喜爱的食物:咖哩饭,拉面,妈妈的水饺

最想做的事:环游世界

对自己的形容:外冷内热

如何踏入演艺圈:

MTV新声卡位战创作组第一名1999年推出第一张国语大碟GoGo&MeMe「Say Forever」

JS专辑列表

1999《Say forever》(哥哥妹妹)

2004《遇见未来》

2004《Forever and ever》

2006《苏菲亚的盛宴》EP

2006《Scream!》EP

2007《我知道你爱我》EP

2008 《此生最美的风景》

JS官网档案

JS官网档案哥哥妹妹到哪里去了?

1999年,千禧年前夕,当时华语乐坛还一片兴盛气息,新人辈出百花齐放,有一对身高高人一等的兄妹-陈忠义与陈绮萱,挟著「MTV新声卡位战」创作组第一名的荣耀,以「GoGo&MeMe」为团名,推出了第一张专辑「Say Forever」。一首专辑同名曲Say Forever传唱至今,每年圣诞节更成为电台的必播曲--「我一个人不孤单/想念的人才孤单…」,清新的嗓音动人的旋律在在令人回味不已,只是,这对兄妹发完这张专辑之后,到哪里去了?时空拉回到2000年,场景是日本,他们与当时所属的唱片公司的大批工作人员,正在拍摄第二张专辑的封面与MV。工作尚未完成,工作人员却接到台湾公司打去的电话------公司人事改组,在日本的整组工作人员全部遭到解雇,这张专辑于是被搁置………

从没想过会发生这种事。他们只是两个爱音乐的大孩子,从没想到作音乐还会遇到「人事改组」这个名词。回到台湾之后,第二张专辑的发片遥遥无期,公司的其他艺人陆续发片,却好像没有人再想到他们。直到他们死心不想再等,鼓起勇气向公司提出提早解约换取自由身的要求。之后哥哥陈忠义专心于自己的美术系学业,进入师大美术研究所攻读硕士(今年已毕业),并且埋头努力创作,间或接一些电玩配乐或广告配乐的案子;妹妹陈绮萱一样努力于世新广电的学业,并且担任哥哥的DEMO歌手,哥哥接的电玩案子广告案子,妹妹也帮忙演唱以及担任配音员,并且也接一些老师同学的影片后期的CASE。

音乐的梦还在心里不断诱惑著他们,但是曾经遇到的打击却也让他们踌躇起来。那段孤绝地日子里,他们以为事情就这样结束了,原本忠义打算从此走入幕后,等研究所毕业后一边担任大学讲师一边写歌,而绮萱也准备朝往影片制作的路线走去。一切直到华研唱片听到忠义的创作--「也许有一天」,当时正在收动力火车的歌的华研制作部,收到这首DEMO之后,惊艳于忠义作品的突飞猛进,之后再向他们邀歌,又收到「镇守爱情」……他们的音乐故事从此又转了个弯,华研欣赏他们的丰沛创作与演唱实力,他们也愿意把自己交给这家拥有动力火车与S.H.E两种不同风格的组合的公司,从GoGo&MeMe改名为JS,华研唱片与JS共同携手在2004年一起出击—遇见未来。

物语式情歌 以音符当胶卷 用旋律说故事

JS这张历时4年的专辑,收录了10首歌曲,以及序曲与终曲两首演奏曲。除了其中的一首词之外,其余的词曲都由陈忠义一手包办;专辑的制作除了力邀金曲奖最佳制作人Jim Lee跨刀之外,陈忠义也参与了一部份的制作与编曲。因此这张专辑是JS完成度相当高的作品,作词作曲编曲制作演唱,可说是一张全疮作专辑辑。而专辑辑中的曲风多变到令人惊讶。通常一张专辑如果有很多作者与制作人,曲风多元则属平常,但是同一个作曲人却能横跨世界音乐、民族音乐、民谣摇滚、另类摇滚、民谣、日式复古Fusion、东方五声小调…..等等,其创作能力之丰沛着实令人咋舌。

可能是因为JS兄妹两人所学都跟视觉有关系吧,又都爱看电影与日剧,所以他们的创作几乎都充满了戏剧感与画面感,每一首歌都有其创作时的来源,都是心有所感、被什么所触动而写下,绝非强说愁式的或是故作惊人之语的做作。因此唱片公司把他们的曲风命名为「物语式情歌」,每一首歌都是一则动人的物语。例如专辑的第一波主打「杀破狼」,灵感即来自电影「末代武士」。忠义看了这部电影后,感到震撼而写下此曲,除了特别的歌名,歌词中也充满日本时代剧式的凄美意象,为了衬托这首特别的作品,编曲更混合了钢琴与大弦乐组与DRUM&BASS再加日本传统乐器「尺八」,融合出既古典又现代的气势。

又如专辑标题曲「遇见未来」,曲式是迪士尼电影式的磅礴,歌词内容写的却是他们遇见华研唱片的心情。作词者姚若龙把他们在绝望之下再遇伯乐重新出发的心情,巧妙地写成一首动人的情歌。再如专辑中的「命运的重逢」是来自日剧「大和拜金女」;「天空的颜色」是写给外婆的想家心情;「苏菲亚的愿望」是描写他们音乐梦的自传式作品;「明天是晴天」则是自己再出发的期待……。

整张专辑歌曲内容皆谓之有物,并且充满优雅的人文与文艺气息,在这个越来越偏向世俗的时代,JS的「遇见未来」专辑,无疑是一种优美的文艺复兴。

四年不见 脱胎换骨

Justin创作能力辈受肯定 Sophia演唱功力更上层楼

沉寂4年多,忠义不但在创作方面,有了长足的进步,常被各大唱片公司、各大牌歌手列为首要邀歌对象,每每被寄予写出主打歌的重任。在这张兄妹俩自己再出发的专辑中,忠义更是大展神威,全面展现了他的创作才华,一个人写尽新世纪音乐、叙事性民谣风、另类摇滚、日式复古..等等迥异多元的曲式,而且每首不同曲风的歌曲都动听至极!

而绮萱这4年多,也没有荒废了她的时间,不但常抱着电视观察各家歌手的音乐录影带、而且反复聆听喜爱的日本众歌姬的作品,而为哥哥忠义演唱Demo诠释各种不同唱腔积累下来的唱功,也在这张专辑中,展现无遗;由「杀破狼」的澎湃激越、「遇见未来」的厚实温暖、「苏菲亚的愿望」唱出民谣的吟颂风格;「明天是晴天」的新民谣摇滚..;时而大女人般的奔放个性、时而小女人般的喃喃自语,除了以往的清新脱俗,更多了经过4年岁月积累之后,更为丰富的生命经历所淬炼出的声腔表现!绮萱在这张专辑里的演唱,更被资深乐评家王祖寿先生拿来与梁静茹并列为「痛苦时代的温暖歌声」。再加上她从小习舞的经验累积,让她在演唱时的肢体表演,展现出非常独特而迷人的韵律感,例如「杀破狼」MV中的能剧式肢体表演,自信而投入,与音乐完美结合,流露出与众不同的知理性与感性神采,「新文艺派歌姬」的称号实在是当之无愧!

Justin创意无穷寓意深刻的创作,加上Sophia温暖动人的演唱功力 ,成就了这张在华语乐坛十分罕见的,音乐与人声都极具可听性的极品专辑。

独立发行EP三部曲

JS独立发行的3张EP介绍JS 2006 独立发行专辑三部曲之第一乐章:

Rosso ~ 苏菲亚的盛宴

⊙S为何选择独立发行?

沉淀了近两年的时间,JS将在今年7月26日独立发行最新创作专辑【Rosso~苏菲亚的盛宴】。离开前东家之后,JS发现在唱片公司旗下当歌手,似乎不那么适合自己。这段时间Justin和Sophia用心经营无名小站的部落格。除了JS自己设计的版面令人惊艳之外,藉由旅行中精彩的摄影及诚恳的文字,也让乐迷看见Justin与Sophia在音乐创作以外的另一面。两人的部落格总浏览人次至今已突破100万人次。JS今年年初也在部落格中表明:因为想做自己的心太强烈,决定在今年展开专辑独立发行计划。

⊙JS的专辑三部曲独立发行计划

这张专辑名为JS 专辑 Opus.I : 【Rosso ~ 苏菲亚的盛宴】,是JS今年独立发行专辑三部曲的第一乐章。JS计划在今年,以截然不同风格的三张专辑,来表现出JS音乐创作的三种面相。三张专辑分别名为Rosso(意大利文红色),Nero(意大利文黑色)及Bianco(意大利文白色)。Rosso是欧洲华丽宫廷风,黑色和白色又会是什么样迥异的风格?谜底只能等待专辑二部曲和三部曲发行时才能揭晓。

这是第一次JS让音乐回归本质,不受拘束地自由创作。师大设计研究所毕业的Justin和世新广电电视组毕业的Sophia,也把自己对于视觉和造型的创意,在独立发行的专辑当中忠实还原。由于是独立发行,唱片中大大小小的环节都得兄妹俩人亲力亲为。除了歌曲完全由Justin与Sophia创作及制作之外,企划、定装、平面设计发想到摄影及印刷,JS兄妹都全程参与。可谓为目前华语歌坛的创举。

⊙Rosso ~ 苏菲亚的盛宴

专辑 Opus.I的主题是Rosso, 即意大利文红色。JS在三月约满后赴意大利旅行,Justin形容这次旅行象征一种心灵的放逐。在脱离唱片公司的羽翼之前,心中是忐忑的,然而在旅行途中,JS却体会到世界的无限辽阔,应该还给音乐自由。意大利最令JS兄妹着迷的就是威尼斯,JS形容威尼斯像一场永不清醒的梦境,让人深陷其中无法自拔。也因为在威尼斯道奇宫见识了巴洛克时期的奢华宫廷生活,JS想在专辑三部曲的第一乐章,以象征威尼斯华丽宫廷风的红色为主题来出发。

【苏菲亚的盛宴】是这张专辑的主要作品,专辑将于Sophia的生日7月26日在河岸留言超限量首卖100张,并在当天晚上9:30举行【苏菲亚的盛宴 ~ 生日音乐会】,除了庆祝苏菲亚的26岁生日之外,也庆祝JS在音乐上的重生。

这张专辑当中收录三首新歌,对JS来说,每首作品都记录了生命的某一段历程。【苏菲亚的盛宴】是一种成长的仪式和祝祭;【冒险的开始】是面对未知命运的坚定和勇敢;【蝴蝶】则是对于人与生命的感激和爱。

对JS而言,这张专辑实现了二人对音乐和艺术的坚持,好的音乐应该是不被改造,诚实而纯粹的。

⊙用心创作的音乐最好听

JS说:“在市场上我们发表的每一首歌,都是用心创作,没有侥幸。也因为这样,一路走来,虽然不算一夕成名,但步步踏实。我们很感激那些青睐我们作品的制作人老师们,还有六年多来一路陪伴我们成长的歌迷朋友们,你们就是让我们继续坚持做好音乐的最大动力。”

摆脱了市场的包袱,JS期待独立发行专辑的全新尝试能获得乐迷朋友们的支持。也期待藉由EP中的创意和想法,吸引到和JS有共鸣,有想法的专辑发行公司。让我们一起为JS年底的新专辑催生吧!

EP Opus.II的主题是Nero, 即意大利文黑色。摇滚神话学一书中提到:「摇滚的原真性梦想始自『黑』。」而且说到Punk就会想到黑色骑士外套、engineer boots,因此用Nero黑色做为JS庞克曲风的单曲主题是再合适不过了。而在平面设计上,JS选择用柔性的粉红色来搭配强硬的黑,封面照片Sophia甚至戴了粉红色假发,颇有Cosplayer(角色扮演者)的味道,并且JS还用黑色手铐将手铐在一起,象征两人在音乐上的关系密不可分,内页的另一套造型则是以庞克风最经典的苏格兰格纹做主题,两种造型融合了梦幻与庞克呈现截然不同的美感,这种相当大胆的突破性视觉,也因为是独立发行才能如此勇敢尝试。

专辑名称:Bianco-我知道你爱我

演唱歌手:JS

唱片公司:喜玛拉雅

发行时间:2007年03月18日

专辑语种:国语专辑EPCD

专辑简介:

Bianco (意大利文:白色) 代表纯洁,归零,返璞归真

2007年2月,JS的EP三部曲将以Bianco写下终章

半年多过去了,我们无法忘记刚展开独立制作时的惶恐

却也感动于这一路经历的点点滴滴

是你们陪着JS见证那些日子

那些痛并快乐着,凭着一股傻劲去闯的任性

我们都因为这一切,成长了

从2006年7月开始,JS展开了独立发行EP三部曲的计划。

首部曲:《Rosso-苏菲亚的盛宴》,二部曲:《Nero-Scream》分别在2006年八月和

11月发行了,2007年的2月,我们将以《Bianco-我知道你爱我》写下三部曲的最终章

Bianco是意大利文的白色。白色代表着洁净,纯粹以及归零。我们期待在 Bianco 之

中,找回最初那个爱音乐的自己。就像鸟儿在空中飞翔;流星在天际奔驰;雨水从云

端坠落,一切反璞归真。希望未来的JS,能够像孩子一样,永远对世界充满好奇;对

音乐充满热情,并且忠于自己所坚持。这是我们和喜欢我们音乐的你的约定啊!

曲目:

01 我知道你爱我

02 飞向札幌的班机

03 爱情消失的夏天

04 我知道你爱我 (Instrumental)

JSFANS聚集处

百度JS吧 http://tieba.baidu.com/f?kw=js

JS全球歌迷联盟 http://www.jsfans.net/

JS QQ后援群

目前论坛一共有四个群(感谢jsyes提供群号支持):

JS全球歌迷联盟[1]:7138006

JS全球歌迷联盟[2]:9095657

JS全球歌迷联盟[3]:4557994

JS全球歌迷联盟[4]:12168904

希望大家不要重复加入:)

JS的BLOG(须用代理)

贾斯汀:http://www.wretch.cc/album/justin0206

苏菲亚:http://www.wretch.cc/album/JSsophia (感谢小草提供信息)

JS大事记1999-2007

1999 「MTV新声卡位战」创作组第一名

正式组合GOGO&MEME

推出了第一张专辑「Say Forever」

2000 第2张专辑 「夏天结束前」进入制作 被迫搁浅 继而解约

2004年9月 第3张专辑 「遇见未来」

其主打歌曲 杀破狼倍受推崇 以JS为主的仙剑原声带销量突破30W 创造奇迹 JS也再次走红

2006年2月 JS决心投入独立音乐创作 与HIM解约

2006年7月 首张独立EP 苏菲亚的盛宴 发行

2006年12月 第2张EP SCREAM 发行

2007年2月 第三张EP 我知道你爱我 发行

三张EP销量突破1W