APP后台基础技术
1.从业务逻辑中提炼API
六个阶段:
业务逻辑思维导图(结构关系列出来、整理相同的元素)
功能—业务逻辑思维导图(业务逻辑、功能模块,功能模块实现一对多)
基本功能模块关系(任何事之间的关系)
功能模块接口UML(整理业务和工能模块确保耦合度正确)
在设计稿标注API(APP后台开发人员标注那个界面调用哪个API)
编写API文档(API接口管理网站:www.sosoapi.com)
2.设计API的要点
根据对象设计API,防止UI一直改变,API随之改变。维护成本太高。
API命名需要:望名知意。
API的安全性要保证
APP后台API返回数据的正确值和空值的数据类型必须一致,APP客户端必须使用全局函数处理返回的数据,缺少的数据自动补全,减少APP闪退次数。同样,数据库中的数据不允许使用NULL,所有字段都有默认值。
图片处理:APP客户端本地缓存图片,缓存不存在时请求API。APP客户端通知服务器所需要的尺寸,服务器动态生成并缓存。
(CDN机制:eg:http://www.baidu.com/img/bdlogo.gif?w=70&h=70)
通常的返回信息只返回信息码,提示文字由客户端决定。如果要返回文字信息,则提示用户:信息友好,提示程序员:信息专业。
APP客户端一般启动时都要调用API获取必要的初始化信息。
若API版本升级,一般会全部升级API版本,为了避免同一个APP客户端调用不同版本API,新版本的API的Controller必须继承前一版本。只需重写部分API。仍需要在API测试文档中详细标明返回内容。
3.选择合适的数据库
Redis、MongoDB、MySql
读写数据之间的区别:
Redis:存放在服务器内存,内存满了只能使用Redis的分布式方案。调整Redis的配置文件把数据持久化到硬盘。
MongoDB:同时使用了硬盘和内存,使用操作系统提供的MMAP(内存文件映射)机制进行数据读写。
MySQL:MySql缓存的是查询结果而不是缓存数据。
查找数据的区别:
Redis:数据基于键值对,查找速度十分高。
MongoDB&&MySql:每组数据都有一个Id或者索引。知道Id或者索引,直奔目标,速度十分快;不知道Id或者索引,需要逐个查找,效率较低。
适用的场景:
Redis:键值对(Key-Value)放在内存。So,存储数据成本高。读写数据时,必须知道数据的键。(eg:API中附带了用户身份信息,身份信息适合存放在Redis,因为验证用户信息是频率非常高的操作)
MongoDB:适用于网站数据、大尺寸低价值数据、高伸缩性场景、存储地理坐标的数据(LBS应用)。不适用于高度事务性系统(MongoDB不支持事物)、传统的商业智能应用、需要SQL的问题。
MySql:事务性系统、需要复杂的Sql的问题。
4.选择消息队列软件
后台系统发现完成某些小任务需要花费很多时间,迟点完成并不影响整个任务的完成进度,就把这些小任务交给消息队列。消息队列能把大量的并发请求变成串行的请求,减轻服务器的负担。例如:发送邮件、发送短信、推送消息等任务。
三个角色:队列服务端、队列生产者、队列消费者。
工作流程:充当生产者的APP后台把消息推入到消息队列,充当消费者的守护进程检测是否有消息,没有就休息一会,一会再检测(防止消耗太多资源)。有新消息,用新的线程处理相关的业务,主进程继续检测是否有消息
常见消息队列的产品:RabbitMQ(企业级),Redis(广泛使用),ZeroMQ(最快的消息队列),ActiveMQ(代理人、点对点实现队列)
5.使用分布式服务实现业务的复用
系统中聚合了大量的应用和服务,模块间有很多功能重复实现,开发、运维、部署很麻烦。
巨无霸系统的危害:维护麻烦、代码管理不便、数据库链接资源耗尽。
远程服务的优点:把重复实现的模块独立部署为远程服务,新增业务调用远程服务,不依赖具体代码实现相应功能。业务发生变化保持传入接口和返回值不变。
实现远程服务:REST、RPC、开源RPC库
REST:(REpresentational State Transfer,表现层状态转化),每一个URL代表一种资源,客户端和后台之间传递这种资源的某种表现层:(GET、POST、PUT、DELETE),通过这4个HTTP动词,对APP后台资源进行操作。
RPC:(Remote Procedure Call Protocol):远程过程调用协议,是一种通过网络从远程计算机程序请求服务,不需要了解底层网络技术的协议。
过程:客户端通过接口传送参数至网-->服务端通过对外接口通过网络接受参数-->服务端把参数传递到实现函数-->实现相关功能、返回数据返回到对外接口并传至网络-->客户端接受网络返回的数据。
开源RPC库:
Hprose(http://hprose.com/)简单功能强大
Dubbo:分布式服务框架,提供高性能和透明化的RPC远程调用服务和SOA服务治理方案。
6.初识搜索技术
数据太多,很容易数据库就堵了。
搜索原理:实现搜索的关键,就是分词和倒序索引。
知道数据每行有多少关键字,并且建立映射表。查关键字时,只要查找这个映射表。
其中关键字要看使用者的需求。并且需要包含所有词语或者句子的所有词典,分析数据中的关键字。建立映射表,把每个关键字出现在哪一行记录下来就是建立倒序索引。详细参考《这就是搜索引擎:核心技术详解》
常见开源的搜索软件:(会使用搜索软件的API)
Lucene:一套用于全文检索和搜寻的开源程式库(为软件开发人员提供简单易用工具包)
Solr:比Lucene更为丰富的查询语言,实现可配置、可扩展、对查询进行优化。通过Http请求搜索引擎服务器并提交一定格式的Xml文件,生成索引。
ElasticSearch:分布式多用户的全文搜索引擎。
Sphinx:基于SQL的全文检索引擎。为PHP、Python、Perl、Ruby等脚本语言设计搜索API。为MySql设计了一个存储引擎插件。
CoreSeek:中文检索软件,配置简单。性能高效,整合了Sphinx和中文分词,可以快速完成搜索模块的开发。(两个核心模块:Indexer:负责从MySql拉取数据源,把数据源分词、建立索引;Search:搜索模块)
7.定时任务
Linux定时任务Crontab:
使用Crontab-e,创建定时任务。定时任务写入到文件中,用Crontab编辑能检查语法错误。
在后台管理各式各样的定时任务:
需要引入新的定时任务框架:Java下的Quartz或者Python下的APScheduler。
APSchedule实现功能:通过RAM、MySql、MongoDB文件,持久化存储定时任务。支持秒级的定时任务。支持基于日期,固定时间间隔和Crontab类型的定时任务。
easy-install安装: easy-install apscheduler