工作中经常遇到接口响应慢、超过阈值触发告警,甚至会导致网关超时、App无响应、以及用户投诉等情况。虽然可能部分场景是业务本身逻辑较为复杂造成的,但终究还是要程序员来抗下所有。
今天我们聊一下工作中常用的接口性能优化方式:异步
。
说到异步
,可能会很容易想到同步、阻塞、非阻塞
。
- 同步异步:当在调用一个方法或服务时,在被调用服务还未完成处理时,是否有返回或响应为区分。当服务处理完成后,再进行返回响应称为
同步
;当接收到请求还未处理完时,立即有返回响应则称为异步
。 - 阻塞非阻塞:当在调用一个方法或服务时,在方法服务未有返回时,当前线程是否能做其他任务(被挂起)未区分。
1 通过多线程方式将调用异步化
主要利用线程池将部分操作并发化,以缩减整体响应耗时。可以直接使用线程池、@Async异步任务、CompletableFuture等来实现。
关于线程池
、@Async
、CompletableFuture
后续会详细的讲一下使用及注意事项。
具体场景如,最近业务中的商机
相关的后台管理。需要关联查询家长
、学生
、销售
等名称。这些数据是在其他系统中存储,本地冗余的话会造成数据不一致的情况。一般情况下会根据查询结果动态查询相应数据再进行补齐。
当然这块最好跟缓存配合,如果数据量不是太大的话,如销售
数据甚至可以全量缓存。当然关于缓存
相关,后续也会单独讲一下。
2 通过队列等方式将任务异步化
这种方式其实就是利用MQ来削峰填谷
、任务异步
。其实削峰填谷
也可以认为是异步处理
的一个场景,只不过他的目的是为了缓冲瞬时的请求。而任务异步
的目的是将部分任务异步,不阻塞主任务的执行,提高响应速度。
2.1 削峰填谷
还是针对最近的业务来讲。在做用户增长业务相关,用户由落地页提交数据至内部系统,内部系统会将数据简单处理后推送到外部CRM系统,销售在跟客户沟通后,会将线索转换为商机。在这个转换过程中,会由CRM向内部系统推送数据。内部系统会根据传递过来的数据进行各种操作,如创建、更新家长,创建、更新学生,以及各种附加业务信息等。整个操作涉及多个系统,有时甚至是不可控的。
外部CRM系统可以通过脚本函数的方式进行扩展功能,根据业务需要新增了推送到内部体系
按钮。这个按钮操作是同步阻塞。在调用函数(接口)未返回时,整个页面是不可操作的,这是很不友好的交互方式。
2.2 任务异步化
这个场景是最早在做商城项目时。用户下单付款后先更新本地订单记录,然后再向第三方物流系统推送待发货消息、向用户发放订单相关站内信、并可能触发积分赠送及推荐人的返利计算、以及可能触发相关营销规则发放优惠券等操作。
3 后记
本想好好讲一下,发现涉及到的内容太多了。等后面将本文中留下的坑都填补完,再好好更新下本文。
echo '5Y6f5Yib5paH56ugOiDmjpjph5Eo5L2g5oCO5LmI5Zad5aW26Iy25ZWKWzkyMzI0NTQ5NzU1NTA4MF0pL+aAneWQpihscGUyMzQp' | base64 -d
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。