CSDN首页>

云巴:稳定的服务没有捷径

发表于2015-10-22 10:52| 次阅读| 来源未知| 0 条评论| 作者莫日根

摘要:服务已经成为现在软硬件产品的最重要的组成,也是形成壁垒的重要手段,文中将展示产品如何保证服务的稳定,云巴有哪些确保服务稳定的策略。

服务已经成为现在软硬件产品的最重要的组成,也是形成壁垒的重要手段,试想一下下面的场景:

你迎接着清晨的阳光早早来到公司,作为一个软件或硬件的开发者,兴奋地对产品做最后的调试。辛苦大半年的产品今天上线,心想这或许会是个改变世界的机会,不免心生自豪。产品上线后开始数据飘红,但没过几天你便被频繁告警弄得焦头烂额,用户不停的投诉应用连接有问题,收不到信息,控制不了设备,用户大量流失,最后你所做的项目不得不被停掉。而你也陷入反思,我的UI、产品创意和功能如此强大为什么还是会失败?

看好的产品为什么会失败?

一个优秀的产品不应该只有强大的功能和外表,你应该反问自己,我的产品服务足够稳定么?在人们对互联网和物联网逐依赖的今天,这样的案例每天都在上演,甚至会造成巨大的损失。比如Google快讯订阅问题以及Gmail全球性事件,Azure服务停止事故,Terremark宕机事件,澳大利亚清洁机器人自杀事件,哈尔滨K7034脱线事故,杭州智能设备电梯事故等。

如何解决问题?

影响一个产品服务稳定性的因素有很多,其中一个最重要的因素是产品的消息的传输,消息传输不仅存在人与产品之间,也存在于产品与产品之间。信息传输直接决定了用户体验和产品功能实现。再好的产品,没有稳定可靠的信息传输系统,它也只是一堆花哨的外壳。与其花大量时间和金钱去打造一个自己的后端系统,越来越多公司更倾向于选择一个安全稳定的第三方后端云服务。

云巴,就是在这种需求下顺势而生的后端云服务产品。它提供跨平台、跨设备的实时消息交换的服务,主要面向智能硬件和应用,以打造极致服务为目标,产品对高并发下的稳定性要求非常之高。

云巴如何保证服务稳定?

多集群

投资行业有一句经典的话:不要把鸡蛋放在一个篮子里。多集群就是给你的服务提供多个篮子,把服务器按照业务逻辑分成若干集群,当一个集群由于压力或者其他一些因素导致服务出现问题,那么另一个对等的集群就可以替代顶上,使服务稳定下来。

多集群避免了最近很多报道的服务器宕机、崩溃的问题,这也是为什么我们在谍战电影中往往会看到有plan ABC的情景。

云巴目前使用的Cache集群是 Couchbase 集群和 Redis 集群。Redis集群是一个分布式、容错的Redis实现。Redis有很大的用户群,是一个比较成熟的解决方案,但在一些情形下,Redis还是有不少的短板,如Cluster支持不够,持久化不够好等。于是我们又引进了Couchbase,不仅可以实现Redis的缓存功能同时还可以对数据进行持久化。

Couchbase拥有以下的优点:

1、 数据自动在多个节点备份,单节点小,不会影响业务

2、 支持自动分片(autosharing),很容易在线维护集群,不影响业务。

3、 有一个非常专业的web管理页面,集群统一管理。并且还提供RESTful API,方便跟其他自动化系统集成。

通过多集群系统可以保证我们的服务不会遇到大范围的服务停止的问题,对于服务器软硬件和人为故障也有很好的解决手段。这提高了服务的稳定性,如果一条重要的信息错过了最佳接收时间,那也会导致不良的后果。那要怎么解决这个问题呢?

异地跨机房

事实消息交换就好比消息的快递的服务,消息就是一个个的快递,相信大家都会有这个体验:通常同城的快递很快,一天就可以送到。远一点的地方就需要2到3天甚至更久。要解决这个问题,很多人也明白,那就是在不同的地域建立单独的物流集散中心,当初京东就是以这种方式迅速地打开市场。

同样,消息传输也是如此。在不同的地方建立主机房可以大大提高产品可用性,提高服务速度,降低信息传输延迟。但与物流集散中心不同的是,物流集散中心只需要与总部信息系统联系,而彼此之间的联系不需要没有很强的要求,相对的我们机房之间就要保持高度的一致性同步。这也是这项技术说起来容易,但实际上需要很强大的技术支持和运维能力的原因。

云巴目前正在着手这个项目,并且进展很顺利,不久后会正式投入使用。相信那个时候对于服务质量将会有进一步的提升。

以上的两者都可以经过后天开发人员的努力来完成,云巴有自己独特的天然优势。

Erlang/OTP 内在支持的容错机制

云巴依赖于Erlang/OTP,Erlang/OTP是一门并行程序设计语言,它拥有一套完善的通讯体系框架,使用它能够高效地实现通讯方面的程序,并且能够同时兼顾程序的健壮性。这就相当于强大的交通信息系统,为快递快速准确的送达奠定了坚实的基础,想必你也见识过大城市高峰期的“盛况”,Erlang/OTP就是专门为此而生的,它有具体以下的特性

1. Erlang 语言原生支持生成大量轻量并发进程,进程间相互隔离;

Erlang是一种面向并发和消息的函数式编程语言。在Erlang编程语言中,Erlang进程是并发并且独立执行的,轻量并且有自己的堆栈空间。也就是说,每一个Erlang进程完全是私有的,两个Erlang进程之间的堆栈空间不会被共享。这就好比高架桥和并行的车道,相互是独立的,不能窜道,这样很大程度的提高了运输的效率和速度。

2. OTP 的 Supervisor / Worker 模式可以让挂掉的进程被重新拉起;

光有好的道路规划还不能称之为一个好的交通系统,你需要有一个系统的监管和事故的处理机制来及时疏通事故路段交通并维持秩序,Erlang/OTP 就给你提供了这样一个天然的系统。每一个OTP应用启动的时候,都是启动监督者(Supervisor)和工作者(Worker)。 他们之间的关系就如公司上下级一样,工作者上面有监督者,监督者上有另外的监督者。工作者出现异常,监督者会根据相应的参数决定是否对工作者进行重启。如果重启失败,监督者也会退出,而更加上层的监督者收到信号后会对他们进行重启等处理。 这个监督者机制非常好理解,其实就是 OOP 编程里面的 try ... catch 异常处理机制。 当出现异常的时候一层一层的往上抛出,直到有人重启(参考Erlang初学)。

3. Let it crash 的设计哲学让错误能被及早发现和补救;

在Erlang的设计哲学里,有一个重要的概念就是“let it crash”。Erlang不提倡防御式编程,它认为程序既然遇到错误就应该让它崩溃,这样一旦出现错误就可以第一时间被发现,加以补救措施,可以将损失降到最小。

稳定的服务没有捷径

优秀的产品光有好的创意,伟大的情怀是远远不够的,重要的是能够为给用户稳定地输出价值,这才是一个有生命的产品。稳定的服务是没有捷径可以走的,但你可以选择如何去走,这是值得产品人或开发者去考虑去追求的。

0
0