优秀的移动 App 是怎样炼成的?



  • 优秀的移动 App 是怎样炼成的?

    本篇文章会向读者展示 App架构设计的中的几个关键点,从而使一个社交应用能够成为一个优秀的 App,其中包括以下几个将会影响到架构设计的关键属性:

    • 数据层的设计与选型
    • 高可扩展的移动应用架构设计
    • 高可用的多区域架构部署

    目标

    • 确保用户的内容数据能够很方便的被其他用户发现和获取。
    • 确保内容推送是相关的,而不仅仅在语义上,也是从用户设备的角度。
    • 确保实时更新生成、推送和分析。
    • 尽可能地节省用户的资源。
    • 不论服务器负载变化如何,用户体验应保持不变。
    • 确保应用整体上是安全的。

    总之,面临用户的不断增长带来的海量数据与高并发,除了保证数据存储的稳定、安全还需要在安全和性能上满足用户的需求。

    数据层的设计与选型

    **数据和数据模型的选型和设计是一个好架构的关键设计之一。**一个社交产品应该能够处理多种类型的数据,因此首先得充分分析数据并透彻理解,之后再设计数据模型和数据存储。

    第一步要确定哪些数据是经常查询的热点数据,哪些是冷数据(如归档数据用于分析)。高频访问的数据必须是可用, 能够快速读写和水平可扩展的。

    举个例子,某公司所有业务场景使用的都是 MySQL,随着数据的增长,读写将成为应用程序性能瓶颈。我们应该为每秒钟数十亿的查询做好准备。

    首先对数据进行分类:

    • 静态数据
    • 语义数据
    • 用户产生的内容数据
    • 会话数据

    找到一个高效的数据存储方式,满足所有的数据类型,真的很难。因此,需要为每个数据类型选择特定的数据存储方式。

    静态数据

    对于静态数据,最好选择基于文档的存储方式,其中键和值都是可查询的。例如 MongoDB 这种文档型数据库,选择 MongoDB 最大的优势是它提供了在文档级别的 ACID。

    MongoDB 可以在多个分布式数据中心的范围内进行缩放。它将允许企业使用副本集来保持冗余,从而解决可用性问题。另外 MongoDB 支持数据分片,可以确保数据的扩展与查询速度。

    关联的或关系数据(核心数据)

    对于一个应用来说,大部分数据本质上是关联的。例如,A 是 B 的朋友,C 是 A 和 B 的朋友,这样高度语义相关的数据最适合图处理模型。应将这样的数据存储在图形数据库,如 Neo4j。

    这样做的优势很明显:首先可以存储所有关联数据的节点,从而节省了计算数据之间连接关系的额外步骤。当试图探索关联数据时,丰富的属性关系绝对是关键,图形数据模型也将有助于企业捕捉到属性之间的关系。另外,图数据库支持 ACID 规则以及自动索引。

    Neo4j 已经被设计为可水平扩展,并且有数据冗余功能来保证可用性。但到目前为止,它还不支持数据分片。其他可供选择的图数据库有 FlockDB、AllegroGraph 和 InfiniteGraph。

    二进制数据(UGC)

    考虑到大量与用户相关的二进制数据,处理起来并不太容易。传统使用磁盘文件系统来存储二进制数据时通常会带来可扩展性以及性能上的问题,比如说消耗大量的 CPU 等等。所以我们应该选择一个高可用并且性能优秀的存储系统 – 云存储。例如,青云QingCloud 提供的 QingStor™ 对象存储存储。在大量公有云用户多样化的应用场景中, QingStor™ 对象存储在性能(高并发)、可用性、稳定性等方面得到了充分的验证。

    高可扩展的移动应用架构设计

    App 经常会在高峰期服务响应超时甚至不可用,低峰期请求处理缓慢,这给用户的直观感受就是经常刷新不了页面。所以需要从业务、网络、数据等层面进行扩展,以保证用户体验。

    业务层面的扩展

    利用云的弹性,制作自有映像和部署脚本,快速创建新的主机,从而实现高峰期业务层面的快速扩展。

    网络层面的扩展

    引入公网 LB (负载均衡器)将流量从入口处就分担到多个私有网络的多台服务器上;将处理比较慢的请求调用隔离到单独的服务器上处理。

    数据层面的扩展

    构建数据库 Slave 集群,从单节点 MySQL 数据库转变为一主多从的数据库集群;创建内网 LB,对 Slave 集群做负载均衡,将数据库读请求分散到多个 Slave 节点上;根据功能做数据库读写分离。

    高可用的多区域架构部署

    为了让后端架构更可靠和业务更稳定,就需要实施多机房部署和混合组网。具体原因有以下三点:

    • **异地容灾:**在中国复杂的网络环境下,机房可能会出现网络状况,导致一些比较关键性的业务的可用性降低,备份机房后可保证服务不会出现明显的长时间中断;
    • **负载分摊:**单独一个机房可能不足以支撑全部的请求,这时可以把一部分的请求压力分担到另一个机房;
    • **加速区域访问:**在中国网络环境下,南方和北方相互之间网络访问时有较高的延迟。通过做多机房部署实现加速区域用户的访问。

    上图以青云QingCloud 跨区部署为例。有三个机房,中间是 QingCloud 北京 1 区机房,负责主营业务。左边是亚太 1 区机房,主要服务亚太和海外的客户。这两个机房都使用了 QingCloud 私有网络部署,利用路由器,通过 GRE 隧道或者 IPsec 加密隧道的方式进行互通。如果对数据传输过程的安全性要求较高,可以用 IPsec 的方式把两个机房相互打通,这时的访问只能通过内网 IP 进行访问。右边是办公室机房,工程师在这个环境下进行开发。

    在实现混合组网时,只要机房路由器或者网宽设备支持标准的 GRE 隧道协议、IP 隧道协议,就可以将传统物理世界的机房,不管是办公室还是其他曾经原有的物理机房设备,都能够跟 QingCloud 上面的路由器进行连通,最终打通 QingCloud 公有云环境,好比上图中的办公室机房就不属 QingCloud 也可实现连通,通过这种多区域部署方案保证 App 的高可用。

    最后

    明天就国庆节了,提前祝福大家国庆快乐。另外,再给大家发放一波福利,偷偷分享几个架构在青云QingCloud 上优秀的 App 架构供大家参考。(点击查看高清大图)

    • FIN -


登录后回复
 

与 青云QingCloud 社区 的连接断开,我们正在尝试重连,请耐心等待