高并发业务接口开发思路(实战)

标签: 高并发 接口 接口设计 | 发表时间:2017-05-21 04:00 | 作者:
出处:http://sflaqiu.github.io/

高并发业务除了需要有支撑高并发的服务器架构,还需要根据业务需求和架构体系,设计出合理的开发方案, 这里根据一个实践过业务场景分析开发思路,罗列出高并发接口需要注意的点,以及设计上的巧思,共勉之,望共鸣


业务场景

  • 业务:
    • 今日好货
  • 交互端:
    • IOS/Andorid
  • 需求点:(实际业务会复杂些,为了容易理解,这里简化需求点)
    • 提供最新的好货商品信息列表,支持分页
    • 需要时时获取最新的商品数据列表,以下情况商品信息会发生变化
      • 商品数据字段更新(人为编辑,热度字段更新,等)
      • 商品不定时上新,在固定时段会有大量商品更新(目前 10点/20点上新量大)
      • 商品在会在规律时间里重新排序(根据:销量,曝光量,点击量 等计算排序)
    • 商品加载过程中不能出现重复商品
    • 客户端和服务端需要考虑加载商品的交互体验
  • 终极目标:
    • 支持高并发下业务稳定

设计思路

前提:

  • 【商品服务API】:通过商品服务提供的API获取商品数据,当商品有上新、字段更新、排序有更新时,通过API都可以获取到最新的数据(db查询,支持获取未来时间里的商品数据)
  • 缓存使用 Redis

缓存更新分析:

  • 商品数据缓存到Redis:支撑高并发的查询业务,数据需要进行缓存
  • 提供商品缓存刷新接口:商品显示需要即时性,需要时时展示最新数据,当商品发生变化的时候,我们需要刷新商品缓存数据
  • 支持未来时间缓存提前更新:为了更好支撑即时性,尤其在固定时段商品的大量上新,缓存更新会比较慢,所以我们需要提前备好未来时间的缓存数据
  • 缓存刷新需要注意点:缓存更新的过程中不能出现前台无数据展示的情况
  • 商品缓存支持版本号区分:每次缓存更新都要生成一个新的数据版本号缓存Key,数据存储在对应的缓存版本Key里
  • 缓存版本Key存储到列表 :列表可以用来筛选出当前时间可以使用的最新版本号

商品缓存更新设计:

  • 接口参数:updatetime 【更新时间】(可空),默认等于当前时间,可以传未来时间
  • 每次刷新缓存都会生成新的数据版本号作为 【商品缓存Key名】,将数据存到版本号对应的缓存Key中,所以需要生成一个唯一字符串,这里我们把 【更新时间】的时间戳作为缓存的Key名,为何这么设计,后面会介绍到
  • 首先请求 【商品服务API】获取 【更新时间】对应的商品数据,接着对数据进行字段处理、排序,最后把最终商品数据更新到 【商品缓存Key名】的Redis SortedSet中
  • 商品缓存成功后,把 【商品缓存Key名】存到 【版本号集合】Redis SortedSet中,同时把 【更新时间】的时间戳作为排序的值
  • 【商品缓存Key名】= 【更新时间】的时间戳,这个设计的目的是可以支持未来时间版本数据的提前更新,并且可以通过SortedSet排序,过滤出当前时间最新的版本号

缓存结构图

image


今日好货API设计:

  • 接口参数:version:数据版本号(可空),pageindex:页码
  • 响应JSON数据:Datas:商品数据集合,CurrentVersion:当前数据版本号
  • 【当前最新版本号】【版本号集合】通过SortedSet机制,获取当前时间能够使用的数据版本号, 如:取[当前时间戳]-[(当前时间-1h)时间戳]区间的版本号,排序后获取离当前时间最近的版本号作为最新版本号 <这里为何取区间,而不是直接取最新版本号,会有个容错处理,后面会说到>
  • 用户在浏览商品的时候客户端请求 【今日好货API】需要上传版本号和页数,如果是第一次(pageindex=1,首页),会获取 【当前最新版本号】,然后返回最新商品数据
  • 客户端本地缓存首页数据返回的版本号,后续翻页需要客户端上报缓存的版本号,API返回版本号对应的商品分页数据,这样设计的目的是当用户继续加载后面页数数据的时候不会出现重复的数据(数据会不定时更新,避免用户加载到重复的数据,如:商品A原来是第一页数据,数据更新后变成第二页数据)
  • 当请求首页数据,客户端上报的版本号= 【当前最新版本号】,就不进行数据缓存查询,直接返回空数据(数据不变),客服端无需重新渲染商品列表,同时可以避免无限下拉刷新带来的服务器压力
  • 如果version参数没有上传,获取 【当前最新版本号】和当前最新数据返回,数据版本号参数有上传,就获取对应版本号的分页数据

其他注意点:

  • 版本号无限累加
    • 【版本号集合】随着时间增长,版本号数据会不断累加,需要在每次更新的时候删除掉最近一天的版本,操作 SortedSet 过滤掉比(当前时间-1天)的时间戳小的版本号
  • 容错处理
    • 获取 【当前最新版本号】的时候,操作 【版本号集合】集合,获取最近一个小时的,即操作SortedSet[当前时间戳]至[(当前时间-1h)时间戳]范围内的版本号,然后从大到小排序版本号,过滤出版本号,并且有版本号相对于的商品数据,如果不存在商品数据,就往下遍历,直到有符合规则的版本号返回

双11模式:

  • 一级缓存
    • 将商品数据短暂的缓存到站点服务区Cache中

降级方案:

  • 资源监控,自动降级
  • 开启降级方案后,客服端会从cdn中拉取商品数据
  • 商品分页数据生成JSON数据文件存储到cdn中

架构图

image


总结

  • 以上举例的高并发接口设计的实践方案,有些设计可能比较针对此业务场景,但是思路是有共性的,重点在于理解设计上的思路
  • 高并发接口的开发需要考虑因素:
    • 接口性能
    • 接口的稳定
    • 容错机制
    • 服务端压力:竟可能减少服务端压力,可以与客户端交互配合
    • 服务降级:资源高压力的情况下进行降级

相关 [业务 接口 开发] 推荐:

高并发业务接口开发思路(实战)

- - SFLYQ
高并发业务除了需要有支撑高并发的服务器架构,还需要根据业务需求和架构体系,设计出合理的开发方案, 这里根据一个实践过业务场景分析开发思路,罗列出高并发接口需要注意的点,以及设计上的巧思,共勉之,望共鸣. 需求点:(实际业务会复杂些,为了容易理解,这里简化需求点). 提供最新的好货商品信息列表,支持分页.

微信公众平台接口开发

- - CSDN博客互联网推荐文章
随着微信公众平台的开放,微信营销推广也越发受到重视. 现在企业越来越注重求职者是否拥有“微信公众平台接口开发”的经验. 现在参考资料介绍下微信公众平台接口开发模式:. 首先你得有个微信公众平台账号,注册地址:http://mp.weixin.qq.com/. 开发者提交信息后,微信服务器将发送GET请求到填写的URL上,GET请求携带四个参数:.

HTC 将向开发者提供 Beats OpenSense 的音效 API 接口

- SINCERE - Engadget 中国版
在 8 月份的时候,HTC 和 Beats Electronics 走在了一起,之后我们看到了搭配 Beats Audio 技术的机型推出,在这之前,HTC 提供了众多的 SDK 给开发者. 现在是时候端出 Beats Audio 的 API 开发工具了,HTC 官方确认即将推出,这个工具允许第三方开发者挖掘 Beats Audio 的潜力,用以增强应用软件的音效体验.

ios开发-分享一些免费的接口

- - CSDN博客编程语言推荐文章
分享一些免费的接口.无意中查找资料发现,. http://kuang.xiami.com/app/nineteen/search/key/歌曲名称/diandian/1/page/歌曲当前页?_=当前毫秒&callback=getXiamiData . http://qzone-music.qq.com/fcg-bin/cgi_playlist_xml.fcg?uin=QQ号码&json=1&g_tk=1916754934.

如何基于微信开放接口开发企业的微信 CRM?

- - 极客公园-GeekPark
我是极客公园黑板报认证值日生. [核心提示]企业要开发微信 CRM,首先要从业务架构上进行设计清楚. 微信 CRM 的本质,是在微信渠道上利用微信的特点和接口而扩展的 CRM 系统. 业内一直都在传说 微信是天生的 CRM,可是没有人看到过微信 CRM 的真容. 随着微信最新公众平台的改版和开放接口的微信认证开放,微信 CRM 离企业越来越近.

大规模业务服务器开发总结

- - 五四陈科学院
以下内容由 [五四陈科学院]提供. 开发阶段,服务不稳定,一个大服务不如一堆小服务; 运维阶段,服务都稳定了,一堆小服务又不如一个大服务. 大规模的时候了,如果能够一个进程搞定的,尽量不要拆两个进程. 如果都是大服务,自然而然地,服务数量就少. 服务数量少,运维成本就相应低. 一个进程,跑得越快,qps越高,所能使用的资源越多,越能“物尽其用”.

iOS 免费接口

- - ITeye博客
京东获取单个商品价格接口:. http://p.3.cn/prices/mgets?skuIds=J_商品ID&type=1. ps:商品ID这么获取:http://item.jd.com/954086.html. http://www.kuaidi100.com/query?type=快递公司代号&postid=快递单号.

雷电接口(Thunderbolt)问答

- Richard - Apple4.us
这次的 MacBook Pro 更新带来了一种新的接口 Thunderbolt(雷电),不但速度比火线 800 和 eSATA 都快得多,更可同时担当数据、视频、音频传输之重任. 这里是 Dan Frakes 和 Dan Moren 为 Macworld.com 写的雷电基础指南,译出供大家参考. 雷电(旧称「光峰」Light Peak)是 Intel 与苹果合作研发的一种新的外设接口技术,它能把数据、视频、音频和电力的传输集合到一个单独的接口上.

各个IP API接口

- - 谁主沉浮
腾讯的IP地址API接口地址: http://fw.qq.com/ipaddress. 返回的是数据格式为:var IPData = new Array(“114.218.183.139″,””,”江苏省”,”苏州市”);. <script language=”javascript” type=”text/javascript” src=”http://fw.qq.com/ipaddress”></script> <script>document.write(“你的IP是:”+IPData[0]+”,来自:”+IPData[2]);</script>.

Android异步接口测试

- - 百度质量部 | 软件测试 | 测试技术 | 百度测试
    基于Android的C/S移动应用中访问后端数据的场景是非常多的,异步接口测试主要是在单元测试完成的基础上检查接口级访问是否正确,主要保证对外请求的组装与发送是否符合后端的约定. 现在项目的异步接口访问都遵循一个特定的访问模式:前台的Activity获取到触发事件后将接受到的参数传给一个异步任务,这些任务大都是AsyncTask的实现——即启动一个新的线程访问后台接口数据,完毕后调用回调函数更新UI展示,示意图如下:.