没有什么性能问题是加机器不能解决的,如果有,那就是机器加的不够~
如何设计好高并发接口?先看一张基本网络拓扑图:
以上面的网络拓扑图为准,如何设计好一个接口,能保证在高并发请求下的健壮性,我觉得会有以下几方面的考虑:
接口的职责单一:一个接口只做一件事,设计的接口尽可能简单,如果业务复杂了,就拆接口,只要满足业务,并且保证一定的合理性即可,能让前端做的事情就不要让后端去做,不要和我说前端同学不同意,在性能面前,一切都得让路;
尽可能减少接口的网络连接:每一次网络连接都是一次不小的开销,想想TCP的三次握手和四次挥手过程,还有网络数据传输的数据量大小,以及数据的序列化和反序列化;
缓存必加:数据库是每一个连接都很珍贵,在你的服务和数据库中间加一层缓存吧,良好的运用缓存可以将99%的流量阻挡在缓存层,把redis用好,你会发现再也不怕测试同学压测你的接口了。同样请求redis也是有网络连接开销的,那么在服务和缓存中间件中间再加一层JVM缓存,第三方的开源工具包也很多,比如Google Guava,JVM缓存一加,天下无敌;
大批量写数据先入队列:大批量的写库请求不要一股脑的塞给数据库,锁表、锁行、写索引,数据库的安全运行是第一要务,千万不能挂,千万不能挂,千万不能挂。可以把数据写到MQ中,然后消费端再慢慢消费。
持续的优化代码:集成APM性能工具如pinpoint进行链路跟踪,然后自己去压测,可以先压测20个并发跑10分钟,把机器跑热,触发JVM的JIT机制,然后继续加并发,看CPU、看内存、看连接数、看磁盘流量、看pinpoint看看哪一个环节慢了点,再各个击破,不断优化代码;
以上,是我个人认为需要考量的一些因素,在接口设计之初就应该考虑好这些,根据这些因素去做数据模型设计以及相关场景设计,便能在后期压测、优化时候能够更好的达到高并发的性能要求。
欢迎大家评论,积极建言献策,共同成长~