月度归档:2014年08月

程序员大会实录:去不去 Google?Ex-Googler 讲述他的职业选择

本文出自 8/23 哪上班主办的「比代码更重要的事」程序员大会现场演讲

江宏 ,AVOS Cloud CEO & Co-founder,耶鲁大学 PhD

hjiang-nashangban

我其实没有什么成功的经验可以分享,只讲一讲过去个人职业选择方面相关的一些历史。我相信这里很多人都会上知乎,上面有很多关于职业选择的问题,比如说我是应该留学还是应该呆在国内,我是进创业公司还是大公司,我是应该去百度还是腾讯,其实这些问题对每个人都有不同的答案,只有自己给自己的答案是最好的,之所以有那么多的问题,因为有很多人没有花足够的时间了解自己,所以古希腊的哲人会说「人生最困难的一件事是了解自己」。

我本科毕业之后去了耶鲁大学学习,一段时间之后我看到别的的同学似乎都有着非常明确的兴趣和方向,很多人开始对某一个课题做深入的研究。而我好像对各个领域都很感兴趣,当时我们系有四大方向:科学计算、人工智能、程序设计语言、还有计算理论。我除了对科学计算以外的所有东西都非常感兴趣,所以我有一次发邮件给我的导师,我提到我一个很大的问题是不够专注,因为我现在还不知道我博士论文往哪个方面深入下去。后来我的导师给我回信说「我不觉得这是一个很大的问题,事实上很多人的问题是他们专注的太早」。后来回想起这句话觉得非常有道理。

我很小的时候开始学习计算机编程,我高中和大学的时候,很多同学羡慕我,因为我很早就找到了自己的兴趣,很早知道自己将来做什么,但这其实未必是一件好事。因为很多人花时间扩展知识面的同时,我把很多的时间花在某一个方面。我后来发现自己的知识结构有所欠缺的时候,需要花更多的努力去弥补,应该说在每个阶段应该做适合于那个阶段的事情,没有必要急着让自己进入下一阶段。

后来在耶鲁的五年大部分时间是很闲适的,对什么感兴趣就看那方面的书,做一些研究,看一些论文。每周只跟我的导师见一次面,在耶鲁的一个咖啡馆,两个人在那儿喝咖啡,讨论一些这一周以来比较有意思的一些问题,有的时候觉得需要在纸上做一些推导进行一些证明,就会密密麻麻地写在咖啡馆的餐巾纸,然后带回去。

后来我快毕业的时候,决定要回国,有两方面的原因,一个是家庭方面,因为我希望离父母家人近一点,另外当时觉得待在美国很无聊。我后来比较喜欢跟人打一个比方,如果在美国任何一个城市的一个十字路口,拍一张照片,十年以后回到那里还是一模一样,看不到任何变化。但是中国的变化很快,我个人更愿意生活这样的地方。所以我初步决定回国,但是不知道干什么。毕业以前的一个暑假我回国做了三个月的实习,实习完之后有点更迷茫,因为那段时间里没有在国内找到自己想要做的事。后来就回了耶鲁,收到了一个在 Google 的朋友的邮件向我索取简历,后来我知道谷歌的员工每推荐成功一个工程师会有四千美元的奖励。几周之后我通过了面试,拿到了 Google 的 offer,就决定去 Google 了。

hjiang-avoscloud

Google 是一家有着很好文化的公司,我在知乎回答过两个问题,一个是 在谷歌工作是怎样的一番体验?,另外一个是 为什么从谷歌离职? 如果大家到 Google ,可以找到一个介绍企业文化页面是「Ten things we know to be true」,其中可能最有名的一条是「You can make money without doing evil.」,也就是通常说的「Don’t Be Evil」。这句话被写到了 Google IPO 提交的 S-1 文件中。很多互联网公司说要向谷歌学习文化,但很少有人真正学到的,我觉得文化应该是定义一个企业的东西,它应该会影响到企业的商业行为,影响到这个企业里面每一个人的工作方式和价值观。所以免费午餐、在办公室养狗养猫、放台球桌和桌面足球,这些都是好的福利,但不是文化。往头上浇冰水也不是文化。

虽然 Google 很好,但我在 Google 的时候已经有一万六千名员工,我在那么大的公司很难有归属感。Google 有很多非常优秀的人才,但是和其他大公司一样也有很多可以说在混日子的人 — 据我所知,在 Google 很少有因为 performance 原因解雇人的。而 Google 内部团队之间也有很大的差别,我自己在工作中需要跟很多团队打交道。在一个公司中,个体的差异非常大。

另外大家可能觉得 Google 里面有很多非常新奇的项目,像自动驾驶汽车等等。其实这些只是一小部分。并且在我那个时候还没有这些项目,那时的新项目是 Chrome 和 Android。大部分支撑整个企业、能产生利润的项目:像搜索、广告等都是有很长历史的老项目。我所在团队负责的项目差不多有十年的历史,最早是一个 Python 程序,后来用 C 重写,再后来变成一个 C++ 的项目,最后我们为了让对 C++ 不是很熟的人可以加新功能而嵌入了 Python 解释器。当时 GCC 编译不了那个项目,会因为内存不够而崩溃,所以我们用的是修改过的 GCC。我们用全公司最好的 workstation 编译项目需要 30-40 分钟,后来使用分布式编译缩短到 5-10 分钟,但是效率依旧很低。可以想象一下,做完一些改动,按下回车,接下来就可以去茶水间吃点东西,喝杯果汁再来看结果。通常人们会说软件开发中要为人优化,而不是为机器优化,如果一个工程师花一整天的时间,把原来一毫秒的操作变成半毫秒,往往是不太值得的。但以 Google 的规模,这样的优化是很值得的。所以 Google 很愿意雇优秀的工程师负责做看起来很小的改进,因为每个优化都可以为公司节省很多钱。但是对于个人来说,生命就是那么长,愿意如何分配宝贵的时间,答案跟 Google 多半是不一致的,所以在谷歌工作三年以后,我就决定要么回国加入一家小公司,要么自己创业。

在美国这八年是我发现和了解自己的过程。我回国的时候,很多朋友挺惊讶的,很大的原因是我当时在美国再待几个月或一年就可以拿到绿卡。如果理性地去想这件事情,很多事情是对别人是有价值的,但对自己来说未必有价值。我认识很多朋友,已经长期生活在国内,但是为了维护美国绿卡的状态,每半年或者每年要飞回去一次,其实可能并不是明智的。还有个例子是北京户口,据说换算成钱可以值六七十万了,它对希望长期在北京生活的人有价值,对其他人是没有价值的。有朋友已经离开北京很多年,生活在其他城市,也没有计划回来,但还是不舍得放弃北京户口,每次办什么事情还要回来北京,并不值得。

回国之后也有很多有意思的经历可以分享,因为时间关系不讲了,只简单总结一下几点建议。第一是每一个人都要花足够的时间了解自己,因为在人生和职业选择上没有别人可以给更好的答案,人生不是一场竞赛,几十年之后大家的结局都是一样的,最重要的是做自己想做的事。第二是做选择应该基于独立思考,父母、同事、朋友都有可供参考的意见,但是最终需要自己判断。第三要把时间和精力投入到自己认为有价值的事情上,而不是别人认为有价值的事情上。最后,创造或加入一家好公司,我这里说的好公司跟商业上的成功没有直接关系,就像好人不一定有钱一样。但是我相信好的公司更容易取得长期的成功,并且做一家好的公司本身应该是一个目的而不是一个方法。

3377-11d2563755f566dc.jpg

最后,如果你还在寻找一家好的公司的话,我介绍一下我们自己,我们是 AVOS Cloud ,我们的产品是为移动应用提供后端服务,如果你是移动应用开发者,只需要开发前端手机 app 部分,所有对后端的需求都可以由 AVOS Cloud 满足,还有我们的 博客 ,及一个 开放资源 网站,我们开放了我们的很多内部信息,包括我们的薪酬。如果你要应聘一个职位,可以到这里直接算出薪酬会是多少。

谢谢大家。


现场提问

提问 :刚才也提到要创造或者加入一家好的公司,请问一下你是怎么定义一家好的公司的?

江宏 :可以用一句话定义一家好的公司。如果你在一家好的公司工作的话,如果你很认真地很好地完成了工作,好的事情应该会发生在你自己、这个公司、这个公司的投资人、用户身上。如果少了任何一点这家公司都不是一家好公司,首先个人的贡献要得到承认和奖励,做的事情要是可以为公司和投资人创造收益的,公司的业务要是对社会有益的。

提问 :江老师您好,您刚才讲的这些基于个人选择的一些自己的建议,我相信您应该是在这方面遇到问题所以才有这方面的思考,刚才讲到发现和认识自己,根据您的经验有没有具体的一些方法和行动的实践过程?

江宏 :我觉得其实没有什么特别具体的方法,每个人比较年轻的时候都会有很多不同的想法,需要去做一些尝试。比如说我本科的时候没有想一定要创业,那个时候我有很多想法,其中包括想要在学术上面有所成就,想成为一个出色的计算机科学家,同时也想过要创业,成为 Bill Gates 那样的人。年轻的时候梦想很多,需要有足够的时间让自己去做一些尝试,才能更好认识自己。举个例子,之所以我后来没有做学术,是因为我在耶鲁的时候确实用了五年做学术研究,并且有一个很好的导师。这个过程中我感到自己并没有足够的兴趣长期坚持学术工作,另外我觉得在学术上要有所成就真的需要有一定天赋,我认为我达不到我导师那样的水平,所以后来追随自己的热情走了别的路。我觉得就是需要有足够的时间让自己做不同的尝试。

工单系统开源了

很高兴跟大家说,工单系统开源了。代码托管在了 Github 上。
如果还未见识过工单系统,请移步于 https://ticket.avosapps.com/
这个系统是用 AVOS Cloud 的 Javascript SDK 、云代码功能做的。

云代码可以干什么?

  • 实现客户端难以实现的业务逻辑。 比如将两个人配对,将等待用户的信息收集在云代码中,根据他们的地理位置等信息配对。类似短暂的信息就不用存入数据库了。类似的组织调配任务也比较适合在云代码中实现。
  • 定时任务。 比如定时请求教务处出成绩的页面,页面有变化、新出成绩的时候推送给相关的用户。
  • 给你的 App 搭建官方网站。 比如看电影学英语的应用,将一些精选视频片段放在网站上能更好地吸引用户。这时候,在云代码中访问数据就像在移动端一样便捷。
  • 当在移动端无从下手的时候,不妨站在服务端、云代码的角度思考问题。

可以从这个项目学到什么?

  • 涵盖了 JavaScript SDK 的大部分章节,涵盖了 对象查询Promise文件用户云代码函数 这些章节。
  • 更多的 best practice
  • 熟悉 Node.js、Express、HTML、CSS、JavaScript

也可以从工单系统中借鉴其中的好想法,

继续阅读

10 分钟为你的 App 加入实时通讯功能

很多开发者想在自己的 App 中添加实时通讯的功能,但通常因为没有合适的后端支持,最终没能实现。而 AVOSCloud 与时俱进,给大家带来了希望。下面就来介绍使用 AVOSCloud 给自己的 App 添加实时通讯功能。

AVOSCloud SDK 从 2.5.9 开始提供了实时通讯模块。本文主要基于 iOS SDK 2.6.2.1 实现,假设你已经具有一定的 iOS 开发基础,省略掉非实时通讯相关的代码,github 完整代码点此

概念

  • peerId
    唯一表示一个用户的标识,可以是用户名、用户 ID 或设备 ID 等等跟用户关联的东西
  • Session
    表示一个会话,处理底层网络连接,收发消息
  • Message
    消息,可以自己定义格式,如文本或 JSON 等,从而达到实现不同类型消息的目的
  • Signature
    签名,用于验证消息合法性
  • Group
    群组,一个用户集合的抽象,给一个群组发送消息,群组里面所有的人都将收到此消息

实现

此部分只列出了通讯相关的代码,省略了一些本地对话和消息保存的代码。完整代码可以查看 github 完整代码

继续阅读

Clojure 语言的设计

知乎 上的回答,转到这里。

基于 JVM 的决定

Clojure 能够吸引人的很重要一点是它是 JVM 之上的语言,这个决定非常关键。

  • 首先,因为根植于 JVM 之上,并且做到了跟 Java 语言的相互调用,它能吸引很多成熟的 Java 开发者。

  • 其次,它可以使用 Java 社区丰富的开源软件,不需要从头去构建一个社区,你可以看到很多 Clojure 开源代码都是简单地包装 Java 的开源包,但是通过 Clojure 高度抽象简单的语法提供更便利的使用的方式;


  • 第三,由于 JVM 平台本身的高度成熟和优化,clojure 的编译器生成的 byte code 跟 Java 编译器生成的 byte code 并无二致(不完全是),它的性能和稳定性也能马上得到保证,这比从头构建一个新平台成本低得多。

构建于 JVM 之上,Clojure 就是一门 严肃 的语言,而非很多人眼中的 LISP 家族中的 玩具 语言,你学习后可以马上使用并且实践。但是 Clojure 又是 LISP 方言,LISP 的神奇能力它还都保留,这样兼具美学和实用的语言如何让人不爱?我相信很多熟悉 Scheme 之类方言的童鞋,并且有 Java 背景的,都会对 Clojure 有相见恨晚的感觉。

设计原则

Clojure 的设计原则可以概括成 5 个词汇:简单、专注、实用、一致和清晰。这不是我概括的,而是《The joy of clojure》概括的。

  • 简单 : 鼓励纯函数,极简的语法(少数 special form),个人也认为 clojure 不能算是多范式的语言(有部分 OO 特性),为了支持多范式引入的复杂度,我们在 C++ 和 Scala 身上都看到了。

  • 专注 :前缀运算符不需要去考虑优先级,也没有什么菱形继承的问题,动态类型系统(有利有弊),REPL 提供的探索式编程方法(告别修改 / 编译 / 运行的死循环,所见即所得)。

  • 实用 :前面提到,构建在 JVM 之上,跟 Java 语言的互操作非常容易。直接调用 Java 方法,不去发明一套新的调用语法,努力规避 Java 语言中繁琐的地方 (doto, 箭头宏等等)。

  • 清晰:纯函数(前面提到),immutable var,immutable 数据结构,STM 避免锁问题。不可变减少了心智的负担,降低了多线程编程的难度,纯函数也更利于测试和调试。

  • 一致 :语法的一致性:例如 doseq 和 for 宏类似,都支持 destructring, 支持相同的 guard 语句(when,while)。数据结构的一致性:sequence 抽象之上的各种高阶函数。

  • 具体到 STM,我个人认为这个特性在日常编程中,其实你用到的机会不多。在 web 编程里,你的并发模型 Web Container 已经帮你处理(tomcat,jetty),事务也是数据库帮你处理,几乎找不到场合去使用 STM。这个特性在做一些中间件或者底层 framework 的时候才可能用到。这个特性的设计上面已经提到,跟 clojure 的设计目标是紧密相关的,跟 immutable 数据结构也是密不可分,同时它也不是没有代价,事务历史记录和慢事务频繁回滚的代价,有时候你还是需要退回去使用 Java 那套锁机制,庆幸的是 Clojure 不阻止你去使用,并且提供了类似 locking 这样的宏来方便你使用。

缺陷

Clojure 的设计缺陷不能说是缺陷,这是由于它设计的目标决定的,有得必有失。

  • 首先还是 JVM,基于 JVM 有种种好处,但是 JVM 的启动速度实在悲剧,因此用 Clojure 写一些小的 script 处理日常事务,显得还是不够得心应手,这样的工作我还是用 Ruby,Python 的脚本语言来搞定更便捷。不过目前 Clojure 有一些其他语言之上的实现,比如 clojure-pyjoxaclojureclr 这些实现应该会比 JVM 的启动快很多(抱歉,我没测试过)。

  • 不仅如此,因为 Clojure 跟 JVM 平台的绑定如此之深,并且为了真正发挥 Clojure 的威力,你还需要去熟悉 Java 平台的东西,熟悉 Java 语言、类库、内存模型、GC 优化、多线程和网络编程、开源类库等等。可以这样认为:想成为一个好的 Clojure 程序员,首先需要是一名好的 Java 程序员。这也一定程度上阻碍了 Clojure 的推广,提高了学习成本。

  • 其次,Clojure 的 API 设计上,有时候不符合你的直觉,而是符合 Clojure 的哲学,比如 contains? 函数对 vector 等数组型集合的调用上。关于这一点,Rich 的回答是 Elegance and familiarity are orthogonal.,也就是优雅和熟悉是正交关系的。保持 API 内在的一致性,比直觉的 熟悉 更重要,这是更深入思考、理性的直觉。

  • 第三,弱类型的好处足够多,灵活,减少声明代码,适合探索式编程;同样,坏处也不是没有,没有类型保障,错误可能要等到运行时才能发现,静态代码检查工具也没有办法帮你发现,这就需要你一定程度的测试代码来保证运行时行为。

  • 第四,性能上,虽然 clojure 生成的字节码已经很高效,也有 type hint 这样的技术来帮助提升性能,但是会有不少的转型 (checkcast)、装箱和拆箱(boxing and unboxing)以及类型判断分支跳转的多余指令,这在一些性能敏感的应用里可能会暴露出来。尽管我认为大多数网站型的应用瓶颈都会落在 IO 上。

总之, Clojure 是一门精心设计的、完全融入作者对编程的思考的、富有生产力的现代编程语言,值得每个对生产效率、函数式编程、并发编程有兴趣的朋友深入了解下。

2014 年 8 月上旬 AVOS Cloud 更新总结

Code-Cloud

(图片来自网络)

8 月以来,我们陆续发布了一些新功能,这里总结下。

首先是网站为统计功能添加了实时页面,在这里可以看到实时在线的用户数字、用户正在访问的 view 排行、用户地理分布等等实时信息,看到自己的应用如此火热,是不是很有成就感?

realtime_stats

其次,我们正式让云代码 2.0 进入 beta 阶段,基于 docker 容器,我们为云代码提供了更好的隔离和容错,并且开放了自定义类库功能,您可以随心所欲地应用自己想用的类库。在云代码的部署选项卡可以看到切换到云代码 2.0 的按钮,但是目前 我们仅限基于 git 仓库部署的云代码可以迁移到云代码 2.0,基于本地命令行文件打包部署的,暂不允许 。因为毕竟是 beta 阶段,服务可能还存在一些问题,我们也提供了回滚按钮。让您可以回到云代码 1.0 的运行(前提是没有用到超过白名单的类库)。关于云代码 2.0 详情请参考 《云代码开发指南》

第三,我们正式将 REST API 版本号升级到 1.1 版本,修正 Date 类型没有符合我们描述的 ISO 8601 标准格式 YYYY-MM-DDTHH:MM:SS.MMMMZhttps://cn.avoscloud.com/1.1 开头的新版本协议将会返回正确的基于 UTC 时区的时间格式。第一版本协议仍然正常运行,我们陆续会将 sdk 都升级到使用 1.1 版本。

第三,我们为上个月发布的聊天 SDK 发布了获取聊天记录的 REST API,具体见 《REST API 文档》,SDK 正在开发中。

其次,我们为上个月发布的短信服务添加了 API 统计,可以在 API 统计里看到单独的短信选项卡。再次说明下, 短信的收费是每个账户有 100 条的免费额度,超过就实时收费,一条 6 分钱 ,具体见 价格策略

Android 和 iOS SDK 都发布了 v2.6.2 版本,修复 v2.6.1 版本依赖发现的各种问题,特别是跟聊天相关的,推荐用户升级。 JavaScript SDK 发布 v0.4.1 版本,使用了 1.1 的 API,彻底修复时区问题。云代码命令行工具也升级到 0.4.8, 适应云代码 2.0,您可以通过下列命令升级:

sudo npm install -g  git+https://github.com/avoscloud/avoscloud-code-command

Unity 3D 和 WindowsPhone SDK 也都发布了新版本,升级 API 版本和修复 Bug 等。

SDK 更新请到 下载页面

完整的更新日志如下:

网站和 API 服务

  • 统计发布实时统计页面。
  • API 统计增加短信统计。
  • 我们为每个模块单独添加了特性介绍页面。
  • 云代码部署菜单新增云代码 2.0 迁移按钮等。
  • 发布 REST API 1.1 版本,修复时间类型的时区问题,更新 REST API 文档
  • 修复短信实时扣费失败描述信息错误
  • 短信实时扣费失败发送告警邮件
  • 修复短信统计数据不完整的 Bug
  • 改进协作者输入用户名模糊查询。
  • 大幅度改进了 技术支持系统 ,加入搜索、广场等功能。

云代码 2.0

  • 允许自定义类库列表,发布迁移按钮,更新 《云代码开发指南》
  • 正式开始 beta 尝试,欢迎大家测试,并及时反馈问题给我们。
  • 更新了 聊天 demo

聊天

  • 发布聊天记录获取接口,请看 《REST API 文档》,SDK API 正在开发中。
  • 修复实时通信离线消息倒序的 Bug,谢谢用户反馈。
  • 改进推送消息 ACK 机制,提升推送的可靠性。建议使用消息推送的朋友,升级 sdk。

iOS SDK v2.6.2

  • AVGroup 添加消息发送成功和失败通知
  • 修复 AVObject 关系保存不上的问题
  • 修复 AVGroup 收不到历史消息的问题
  • 修复 AVGroup 加入成功没有回调的问题
  • 修复用户注册过程初始信息没有保存的问题
  • 修改文件属性 metadata 为 metaData

Android SDK v2.6.2

  • 修正 saveEventually 可能存在的崩溃异常
  • 改变聊天的接口,增加 AVMessage 对象来添加时间戳数据。
  • 修正 AVObject.put 遇到 org.json.JSONArray 时无法保存的异常
  • 修正 SNS 登录时,用户绑定错乱问题
  • 修正聊天的部分用户出现重复消息问题
  • 修正在聊天中没有实现签名情况下的消息发送异常
  • 擦除本地缓存的 AVUser 密码

JavaScript SDK 0.4.1

  • 升级 REST API 到 1.1 版本,彻底修复时区问题。
  • 修复 AV.File 上传文件,可能 metaData 的 size 不准确的 Bug
  • 开源 JavaScript SDK 源代码 ,欢迎大家给我们提 PR。

Unity3D 和 WindowsPhone SDK

  • API 升级 1.1,修复时间类型的时区 Bug。
  • 修复子线程访问 Unity 缓存被拒绝的问题。
  • 修复小概率文件上传进度无法刷新的问题。

AVOS Cloud 实时通信服务架构:微服务和服务发现

「微服务」 (Microservice) 是今年特别热的一个概念,Martin Fowler 的文章 对微服务作了详细的介绍。简而言之,微服务鼓励用户把功能拆分以细粒度的服务接口暴露出来,并通过 REST 服务或轻量级消息队列集成。在微服务架构里,一个业务的实现,可能由不同的功能单元组合而实现。

在 AVOS Cloud,我们提供数据存储、统计、实时通信等不同功能的服务,在实现上,这些功能需要共用基础设施,有的服务本身也根据业务性质的不同拆分功能模块,我们目前就是以这种「微服务」架构思路来实现拆分。有句话说,if you cannot split, you cannot scale.

以实时通信服务为例,根据功能角色的不同,我们有这样一些模块:

  • Push 服务:处理推送的订阅关系,触发推送
  • 长连接服务器:维持设备与服务的长连接
  • Router:应用层的 lookup,负责分配合适的长连接服务器给新设备
  • WatchDog:从多台长连接服务器收集运行和统计数据,对异常情况发起报警
  • 数据存储:群组数据,用户可以通过 API 访问
  • HBase:消息记录存储

模块间的集成,根据业务的特性分别使用 Slacker 远程调用框架和 Kestrel 消息队列。
对于可能耗时较大的任务,我们通过 Kestrel 队列放到后台执行,避免阻塞前台服务,影响吞吐量。而另一些需要实时的集成,则使用 Slacker 远程调用实现多个进程间的通信。

Slacker 是一个专门为 Clojure 语言设计的远程调用框架,利用 Slacker 你可以暴露一个 或多个 Clojure 的 namespace 供远程调用。在客户端,Slacker 利用 Clojure 宏 的特性,保持远程调用和本地调用的代码完全一致,这样本地和远程调用的切换只要更改一个 (require) 即可实现,把框架对业务代码的侵入降到最低。此外,Slacker 使用二进制序列化 nippy,在网络连接层面使用异步复用,同时在超时方面也做了良好的控制。

以上的基础设施帮助我们良好地拆分模块,为下一步的扩展提供了可能。

服务发现

长连接服务器是实时通信的功能核心,它的瓶颈在内存和 CPU,可以通过增加部署来达到线性扩展。随着业务量的增加和硬件资源的整合,它可能会面临较频繁的部署变化,另外它也需要有能通过新增部署来快速平滑高峰压力的能力。基于 Pub/Sub 抽象 的消息队列对此有良好的支持,但这对我们以 RPC 为核心的集成方式提出了新的要求,依赖模块也能快速响应服务部署的变化:我们不可能在新增某个服务部署后修改每个依赖的配置再逐一重启。

在这方面,我们利用了 Slacker Cluster 框架 。他的核心思想是在部署和服务间增加一层抽象:对于服务的消费者而言,只需声明自己所依赖的服务,而无需静态地了解进程的地址。

所有的服务提供者将自己能够提供的服务注册在 Zookeeper 集群里,并将部署地址注册为 Ephemeral 节点。Ephemeral 节点在创建它的连接断后会自动删除,这样当一个部署下线后,它相应的节点也会自动删除。

# Zookeeper 目录结构
ls /slacker/example-cluster/namespaces/
[my.serviceA, my.serviceB]

ls /slacker/example-cluster/namespaces/my.serviceA
[192.168.1.100:2104, 192.168.1.101:2014...]

所有服务的客户端会 watch 自己感兴趣的 Zookeeper 节点,而部署变化时,所有的客户端都会得到通知,进而刷新服务列表,将流量引向新的节点。

在实时通信服务中,Router 服务会通过这个 RPC 机制轮询所有在线的长连接服务器,记录他们实时的运行状态。所有的用户设备并非直接连接到固定的长连接服务器,而是先询问 Router,由后者分配一台压力较轻的实例。当有新的长连接服务器部署后,Router 收到通知,新的连接将优先连接这个新进程。此外,监控和数据收集的服务也会自动地把新实例加入管理范围。

有了这样一套服务发现机制,我们就可以对整个架构中的任意模块随时增减部署,保证服务可以以健康的状态运行。未来,我们还会集成云主机的提供商的 API,来实现基础设施的自动化:当系统压力达到阀值时,云主机自动分配新的资源自动开机,jenkins 自动部署,加上现有的服务发现机制,实现 0 手工操作。这将是云服务运维的新篇。

2014 年 6 月份和 7 月份的明星 App:百姓网& 雷霆战机之太空突围

隆重地向大家介绍 AVOS Cloud 6 月份和 7 月份的明星 App —— 百姓网& 雷霆战机之太空突围。

应用名称

百姓网

简介

百姓生活,涵盖 350 个城市覆盖五千万人使用的生活信息发布平台。在这里你可以免费发布和查询二手闲置物品、优惠卡/电影票、征婚交友、二手汽车、房屋租售、招聘求职、宠物、票务卡券、装修家政等海量生活信息。

iTunes 下载链接

应用截图

应用名称

雷霆战机之太空突围

简介

雷霆战机之太空突围是一款把经典阶级飞机模式与跑酷玩法完美结合的全新飞行射击类游戏,挑战小伙伴们的极限操作意识。通过操作主角飞机,击落不断飞来的敌机,并收集敌机掉落的道具和金币,随着游戏时间的持续,敌机会越来越多,速度越来越快,等级越来越高,掉落的道具也越来越有价值。主角飞机死掉后,如果有复活道具,用户可以选择复活继续游戏,否则退出。游戏中以击毁敌机来计分,敌机等级越高,分数越高噢!

下载链接

应用截图