一,图片体验的优化

在手机上显示图片,速度是一个非常重要的体验点,试想,如果您打开一个网站,发现里面的图片一直显示失败或者是x,稍微做得好一点的,可能是一个不消失的loading或者是菊花等等,但不管如何, 没能快速的拉取和展示图片对用户体验是一个极大的挑战。那么,手机上的图片体验如何做呢?这里笔者有些小总结:

1,减少图片的大小。在失真度和图片大小中做好折衷,尽量利用工具减少图片的size,也可以考虑利用不同的图片格式。

2,减少图片的请求数。可以考虑把多个图片利用类似css sprite的方式进行合并,这样可以加载一次即可;

3,考虑缓存。对图片在客户端进行一定的缓存,设置好缓存时长和更新机制;

4,考虑使用cdn进行加载图片,做到就近接入访问;

5,解决DSN劫持的问题。在手机业务上的经验告诉我们,很可能某些地区,某些运营商把我们的域名封掉或者劫持了,这样,图片的域名解释出来的IP却不是我们提供图片服务的IP,并且这种情况很难发现,  因为,如果运营商通过抽样随机劫持,就很难发现。

解决办法有几个思路:

.去掉dns,改成直接访问IP的方式,但需要解决根据用户的ip获取最近图片服务的ip地址,实现上:这里cgi在吐出访问图片的地址的时候,获取用户的来源网关IP,调用IP地址库判断来源IP所属地和运营商,然后下发对应的图片部署接入IP, 客户端使用IP直连图片服务器,快速的访问资源。问题是,有实现成本,得业务自己去实现类似一个dns解释的逻辑 ,特别是图片放到cdn的话,这样改造就无法使用cdn带来的加速服务能力。

.做好dns劫持的监控,实际上图片dns解释到的vip list肯定是在我们的一个白名单内,如果不是,则肯定属于dns劫持,客户端可以在某个时候拉取一下我们的viplist,作为监控和判断是否dns劫持的问题,如果dns的ip地址 不在白名单内,则替换使用白名单内的ip进行访问。

.考虑备用域名的方式,即如果一个域名拉取不到,改用备用域名进行访问,当然如果备用域名也被劫持,那就不行了。

二,优化后台的架构

后台返回越快,前端的体验就越好,因此,也需要对后台服务的调用链进行梳理,避免循环调用,快慢混杂等问题,基本的原则比较简单,都是一些设计方面的原则

1、轻重分离。服务中把访问量大,需要速度快的服务和访问量小,但业务逻辑复杂的流程从代码实现和物理部署上进行彻底分离,如用的接入cgi(甚至不同的域名),不同的后台server,不同的集群进行隔离。

如果放在一起,慢的会拖住快的,这就像木桶原理一样,最终的速度是由最慢的决定的,如果处理不好,可能导致整个服务堵塞不可用。

2、考虑异步化。异步化相比同步的实现来说稍微复杂一些,或者说需要做的工作可能多些,但异步化的好处也会非常明显,特别是需要高性能的业务流程。常见的异步化实现策略是借助mq作为各个系统的缓冲, 生产者进程或者子系统把消息写入mq即可立即返回,而消费者进程或者子系统则定时从mq读取消息继续处理,并且把处理的结果通过回调通知或者写入返回mq给到生产者查询。当然,如果生产者是不关注结果的,那 就更加简单了,丢到MQ后即可,这里的问题是整个mq是整个业务流程的关键,需要确保服务的高度可用和性能。

3.做好外部依赖的管理。一个业务流程可能往往要调用到外部的系统,并且这些系统可能不是你们团队维护的,如果该系统是非关键路径还好,如果是关键路径,那么做好对外部依赖的管理就显得更加重要了,那么如何做好外部依赖的管理呢?

这里有几个小的tips:

. 对外部调用的服务单独进行封装,如设计单独的proxy去调用外部的服务,这样的好处是方便集中监控和容灾逻辑等处理,在设计上把外部因素进行物理隔离的第一步,后续如果外部系统的协议或者ip地址得发生变化,则可以只修改该模块即可 快速修复;

. 严重建议对外部接口进行错误和超时的监控,一旦出问题,提前预警并快速解决,这里是有血的教训的,某业务和某平台提供者双方在纠结是谁的问题上吵得不可开交,不知道是谁的问题,业务说自己没问题,平台方说自己的服务也很快,如果 你能够拿出你的监控数据,接口超时设置是 1s, 超时的记录有n条,时间是ns,错误的记录有m条,主要错误类型是xxx,那对快速定位是非常有帮助的。

APP系统架构设计初探的更多相关文章

  1. Java生鲜电商平台-App系统架构开发与设计

    Java生鲜电商平台-App系统架构开发与设计 说明:阅读此文,你可以学习到以下的技术分享 1.Java生鲜电商平台-App架构设计经验谈:接口的设计2.Java生鲜电商平台-App架构设计经验谈:技 ...

  2. [转]Android App整体架构设计的思考

    1. 架构设计的目的 对程序进行架构设计的原因,归根到底是为了提高生产力.通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.这样做的好处是使得程序在开发的过程中,开发人员只需要专注于一点, ...

  3. PetShop的系统架构设计

    <解剖PetShop>系列 一.PetShop的系统架构设计 http://www.cnblogs.com/wayfarer/archive/2007/03/23/375382.html ...

  4. Android App的架构设计:从VM、MVC、MVP到MVVM

    随着Android应用开发规模的扩大,客户端业务逻辑也越来越复杂,已然不是简单的数据展示了.如同后端开发遇到瓶颈时采用的组件拆分思想,客户端也需要进行架构设计,拆分视图和数据,解除模块之间的耦合,提高 ...

  5. petshop4.0 具体解释之中的一个(系统架构设计)

    前言:PetShop是一个范例,微软用它来展示.Net企业系统开发的能力.业界有很多.Net与J2EE之争,很多数据是从微软的PetShop和Sun的PetStore而来.这样的争论不可避免带有浓厚的 ...

  6. NET ERP系统架构设计

    解析大型.NET ERP系统架构设计 Framework+ Application 设计模式 我对大型系统的理解,从数量上面来讲,源代码超过百万行以上,系统有超过300个以上的功能,从质量上来讲系统应 ...

  7. 基于Struts2,Spring4,Hibernate4框架的系统架构设计与示例系统实现

    笔者在大学中迷迷糊糊地度过了四年的光景,心中有那么一点目标,但总感觉找不到发力的方向. 在四年间,尝试写过代码结构糟糕,没有意义的课程设计,尝试捣鼓过Android开发,尝试探索过软件工程在实际开发中 ...

  8. Unity3D手游开发日记(2) - 技能系统架构设计

    我想把技能做的比较牛逼,所以项目一开始我就在思考,是否需要一个灵活自由的技能系统架构设计,传统的技能设计,做法都是填excel表,技能需要什么,都填表里,很死板,比如有的技能只需要1个特效,有的要10 ...

  9. 图数据库 Nebula Graph 的数据模型和系统架构设计

    Nebula Graph:一个开源的分布式图数据库.作为唯一能够存储万亿个带属性的节点和边的在线图数据库,Nebula Graph 不仅能够在高并发场景下满足毫秒级的低时延查询要求,而且能够提供极高的 ...

随机推荐

  1. 【全面解禁!真正的Expression Blend实战开发技巧】第八章 FluidMoveBehavior完全解析之一漂浮移动

    原文:[全面解禁!真正的Expression Blend实战开发技巧]第八章 FluidMoveBehavior完全解析之一漂浮移动 好久没更新博客了,今天如果没急事,准备连发三篇,完全讲解Blend ...

  2. Pytorch Code积累

    2017 Python最新面试题及答案16道题 15个重要Python面试题 测测你适不适合做Python? torch.squeeze() Returns a tensor with all the ...

  3. SEED缓冲区溢出实验笔记

    缓冲区溢出实验(Linux 32位) 参考教程与材料:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Buffer_Overflow/ (本 ...

  4. mysql的命令行安装,忘记密码,密码重置问题

    1.下载,安装msi 2.在MYSQL安装目录下,新建data目录 3.进入MYSQL的安装目录下,新建一个默认配置文件my.ini [mysql] # 设置mysql客户端默认字符集 default ...

  5. 职业规划 - DREAM START

    前言 最近面试了好多公司,得出一个结论:做一份详细的计划.一个程序员,不只是写写代码这么简单的事,一种更高的境界则是在代码中.系统的设计中,能找到人生的意义,简单说就是生活的道理.我一直认为:当你在一 ...

  6. WPF Textblock Run 空白问题

    消除Run之前的空白是将Run标签布局时头尾相连 如: <TextBlock > <Run Text="A"></Run> <Run Te ...

  7. Android零基础入门第45节:GridView简单使用

    原文:Android零基础入门第45节:GridView简单使用 前面一共用了8期来学习ListView列表的相关操作,其实学习的ListView的知识完全适用于AdapterView的其他子类,如G ...

  8. Android CTS Test failed to run to conmpletion 测试超时问题

    引用“Android cts all pass 全攻略”里面的一段话: ❀ testcase timeout 测试某个testcase的时候一直出现 “........”,迟迟没有pass或者fail ...

  9. 使用Boost的DLL库管理动态链接库

    Boost 1.61新增了一个DLL库,跟Qt中的QLibrary类似,提供了跨平台的动态库链接库加载.调用等功能.http://www.boost.org/users/history/version ...

  10. QtScript, QML, Quick1, Quick2, Declarative 之间的关系

    QtScript是基于 ECMAScript 的脚本语言 在脚本中可以访问原有C++代码中的QObject类型及其子类的实例,连接信号和槽:也可以创建QObject类型及其子类的实例. 但是QtScr ...