ealongDeng
这个问题我就结合着自己的项目来说一说。
我们现在的项目是没有前台页面的,只对外提供接口服务,甚至我们项目都没有交易类的服务,都是单纯的查询类服务。项目最初的建设目标就是为了缓解核心系统数据查询的压力,或者你们可以把我们项目看成几个核心项目的缓存层(因为有多个核心系统,我们项目还可以提供跨系统的查询,这一点也很重要)。
打铁还需自身硬,要提高接口的稳定性和响应速度,首先代码要写好:
我们项目采用了关系型数据库做中间库,数据经过加工后落地到MongoDB和Redis,对外的提供的服务,只会查询MongoDB和Redis;
数据加工很重要,关系型数据库中需要多表关联的查询,现在只查询MongoDB的一个collection就可以了。(因为要做数据加工,所以数据和生产库比,有一定的延迟,这个一定要看业务场景是否允许有延迟);
MongoDB采用副本集+分片的方式部署,副本集保证数据库的稳定性,挂掉一台,还有其他几台可以使用;分片保证数据量增大后,可以平行扩容。(现在数据量大概在亿级,个位数);
服务部署还采用比较传统的方式,N台服务器前面挂负载均衡;上各种监控,随时关注接口调用和资源使用情况;
严格的参数校验,避免做无用的查询;
大原则就是:【能查缓存就不要查数据库,能不查的话就更好】
除了自身架构之外,还有些非自身的控制:
内部系统在调用接口的时候,主要通过网络权限的控制,除此之外不做任何的限制,包括鉴权;
如果是互联网端的接入,还是需要依赖网关;由网关做鉴权、限流、降级、熔断等;
参与对方系统功能的设计(这一点很神奇),因为大多数时候都是公司内部的系统,所以在做需求讨论的时候,最好能看一下对方系统的调用场景;很有可能调整一下什么时候调用接口,就能大大减少接口的调用次数;
建议调用方设置合理的超时时间,并有合理的重试机制;
如果可以的话,最好可以采用异步调用的机制;
如果接口要依赖于另外系统的接口,也需要额外的做一些考虑(依赖的接口返回慢或者报错,自己的接口肯定会有问题);比如数据时效性要求不高的话,可以考虑把对方接口返回的数据缓存下来(设置失效时间,保证一段时间后能把最新的数据刷新回来),但如果数据时效性要求非常高,可以考虑使用熔断;不过说实话,还没见过谁敢用熔断的....
希望我的回答,能够帮助到你!我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。
会点代码的大叔
在日常的开发工作中,API随处可见,现在市面上也有专门的数据类公司提供各种各样的API服务。API的稳定性直接关系到应用的稳定,那该如何提高API接口的稳定性呢?下面我来逐步和大家讲解一下以供参考。
API是什么?
API是应用程序编程接口的简称,其实可以理解为是某种服务的一种封装形式,通过API就可以获得某种服务而不需要了解其内部实现原理,基本上每款软件应用都有自己的API,供内部或外部调用。
API本身也是属于应用软件(开发人员通过编程语言开发的),它的表现形式有很多种,主要的有:
RPC
SOAP
RESTful
API的稳定性会受哪些因素影响?
API性能会受到很多因素影响的,比如说:
API所在服务器的配置直接影响了API的性能(如:并发、响应速度);
API被调用的次数;
API受到黑客攻击;
不同网络环境下访问API时的速度存在差异等。
如何提高API接口的稳定性?
1、API的高可用方案
什么是高可用呢?高可用是指通过一些技术手段,避免服务出现异常、或减少异常导致的服务不可用时间。
API部署时也需要考虑高可用,我们推荐的方案是:
API多节点部署(同一个API服务部署多个),然后通过负载均衡进行分流;
API作好容错机制;
做好限流,避免某用户访问API次数过多导致API负载较高;
必要的熔断机制,如果API存在多级调用的情况,那熔断机制就很重要了,因为当某个API不可用时可能会导致请求阻塞,严重时会影响整台服务器的稳定;
做好权限认证,必须是合法用户才能访问API接口。
2、API的性能优化
API其实也是一种应用,同样是由开发人员开发的,因为API充当的是服务的核心,所以API的性能尤为重要,我们在开发API时需要注意以下几点:
API需要做好解耦,如果耦合度过高容易导致API性能下降、出现问题时不好定位;
API涉及到数据库操作时,SQL语句要做好优化,避免SQL查询效率低下;
对于及时性要求不高的数据,可在API层做一定缓存处理;
3、API访问速度优化
如果API是公司内部使用,建议以内网IP形式访问API服务;如果API也对外提供服务,可考虑将服务器部署在BGP机房,如果机房不在BGP机房建议在API层上方走CDN加速。
网络圈
看你的接口涉及哪些方面,比如数据库,缓存,或者依赖第三方接口,先从自身代码优化起,然后一步步优化下去,怎么减少变数,比如数据库挂了接口能不能正常,缓存挂了接口逻辑怎么处理,第三方接口老超时不稳定代码应该怎么走。