「非广告」支付宝面试系统设计真题分享

简介: Hello、早上好~最近阿粉的朋友出去面试了一下蚂蚁金服,一面的时候收到一道系统设计题,今天跟大家分享一下。ps:偷偷告诉你,这道题星球球友之前面试的时候也碰到了,这次相当于刚好押题了。

题目

用户有多种支付方式(余额、红包、优惠券,代金券等),假如每种支付方式需要通过实时调用远程服务获取可用性。在外部资源环境不变情况下,请设计程序以最短响应时间获得尽可能多的可用支付方式列表。

假定支付方式可用性咨询服务接口定义:PaymentRemoteSerivce接口方法:ConsultResult isEnabled(String paymentType);

public class ConsultResult {
  public ConsultResult (boolean isEnable,String errorCode){
    this.isEnable = isEnable;
    this.errorCode= errorCode;
  }
  /** 咨询结果是否可用*/
  private boolean isEnable;
  /** 错误码 */
  private String errorCode;
  public boolean getIsEnable(){
    return isEnable;
  }
  public String getErrorCode(){
    return errorCode;
  }
}

题目要求:

「尽可能展示你的编码能力(Java语法、编码风格等),java语言肯定比伪代码得分高」

看到这里的小伙伴的可以思考一会哦

解题

这道题,说难真的不难。

拿到题目之后,我们首先分析一下,切记直接上手写。

在我们的分析过程,梳理设计要点,并且可以向面试官确认这些设计点是否正确,最后我们才开始真正写代码。

我们来看下这道题的关键词:

  • 最短
  • 实时
  • 远程调用
  • 另外需要考虑高并发

结合这几个关键点,第一个很容易想到的方案,遍历查询所有支付方式的可用性,然后返回。

「这种做法响应时间就是多次调用远程服务的总和。」

不过显然不符合设计要求。

第二种,我们可以想象一下,支付方式可用性在一段时间内不怎么会变化的,所以我们可以在第一种的方式基础上,优化一下,增加缓存保存之前的调用结果。

「这种方案只在前面查询的时候耗时较长,后面查询直接走缓存,速度较快。」

但是引入缓存有一个弊端,就是某一支付方式如果突然不可用了或者不可用支付突然变成可用了,那在缓存还未失效的这段时间,将会获取不准确的结果。

所以我们需要引入刷新进制,定时查询支付方式可用性,然后更新缓存。

当然如果在定时任务还未刷新的间隔,支付方式突然不可用,依然还是会存这个问题。

这个问题,第一种解决方案,加快定时任务刷新频率。

第二种方案,需要其他服务配合。如果某一支付方式突然从可用变成不可用,或者不可用变成可用了,这种情况发送相应的消息,这边服务受到消息及时更新缓存结果。

第二种设计方案,我们已经在一定程度上优化设计,不过还是存在一些问题。

主要问题还是在于第一次查询遍历查询所有支付方式的可用性,速度较慢。

那这个问题,我们其实就可以引入多线程查询,这样的话,响应时间最大值等于单一支付最长调用那一次。

结合以上的分析,我们代码可以如下:

多线程查询代码:

16.jpg

缓存定时刷新的代码如下:

17.jpg

考虑接口会被高并发调用,在缓存为空的时候,可能会有多个线程并发调用 asyncQueryALLPaymentTypes 查询所有的支付方式的结果。

但是实际上这里只需要一个线程查询即可,其他线程等待结果就可以。

所以接口使用双重查询锁(DCL)的方式,同时只会有一个线程去查询所有支付方式。

18.jpg

上述 DCL 的方式只是解决同一个应用内多线程的问题,但是多个应用间被并发调用,还是可能会多线程去查询所有支付可用性。

假设现有 10 个应用,缓存为空,极端情况下,10 个应用都使用多线程去查询支付方式可用性。

假设现有 5 个支付方式,短时间内发起 10 *5=50 次调用,这种调用量还是很少,完全可以接受。

好了,今天分享就到这里了~

相关文章
|
7月前
|
数据采集 消息中间件 监控
Flume数据采集系统设计与配置实战:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入探讨Apache Flume的数据采集系统设计,涵盖Flume Agent、Source、Channel、Sink的核心概念及其配置实战。通过实例展示了文件日志收集、网络数据接收、命令行实时数据捕获等场景。此外,还讨论了Flume与同类工具的对比、实际项目挑战及解决方案,以及未来发展趋势。提供配置示例帮助理解Flume在数据集成、日志收集中的应用,为面试准备提供扎实的理论与实践支持。
297 1
|
7月前
|
XML 分布式计算 监控
Oozie工作流管理系统设计与实践:面试经验与必备知识点解析
【4月更文挑战第9天】本文详述了Oozie工作流管理系统的核心概念,包括安装配置、Workflow XML、Action、Coordinator和Bundle XML定义。此外,讨论了工作流设计实践,如监控调试、自动化运维,并对比了Oozie与其他工作流工具的差异。文中还分享了面试经验及解决实际项目挑战的方法,同时展望了Oozie的未来发展趋势。通过学习,读者能提升Oozie技术能力,为面试做好充分准备。
147 0
|
7天前
|
存储 消息中间件 缓存
面试的系统设计题,给我整懵了。。。
先赞后看,Java进阶一大半小明(化名)坐在密不透风的会议室里,手握着笔,放在桌面上的是满满的两页面试题。其中一道系统设计题是这样。。。微博或者短信都有单条发送字数的限制,如果需要分享一个长网址,很容易越出限制,短链服务可以将长网址变成短网址,方便传播。请设计一个短链服务,要求短网址尽可能短,且保证系统安全和并发能力。各位hao,我是南哥,相信对你通关面试、拿下Offer有所帮助。
40 14
面试的系统设计题,给我整懵了。。。
|
消息中间件 缓存 监控
GitHub上获赞上万的阿里亿级并发系统设计手册,让你吊打面试官
金九银十已经接近尾声,很多没有在这个时间段找到工作的小伙伴已经开始备战秋招了,在这里给大家分享一份阿里10亿级并发系统设计手册,专门给没有系统设计相关经验的小伙伴应对面试用的,下面将这么手册的内容以截图的形式展示给大家,有需要的小伙伴可以文末获取↓↓↓此份手册又份为六个部分,基础篇、数据库篇、缓存篇、消息队列篇、分布式服务篇、维护篇、实战篇共计328页 目录总览 基础篇 高并发代表着大流量,高并发系统设计的魅力就在于我们能够凭借自己的聪明才智设计巧妙的方案,从而抵抗巨大流量的冲击,带给用户更好的使用体验。这些方案好似能操纵流量,让流量更加平稳得被系统中的服务和组件处理。
GitHub上获赞上万的阿里亿级并发系统设计手册,让你吊打面试官
|
2月前
|
存储 消息中间件 缓存
系统设计面试参考-设计Spotify系统
【10月更文挑战第4天】支持用户将自己喜欢的音乐、专辑、播放列表等分享到社交媒体平台,如 Facebook、Twitter、Instagram 等。分享内容可以包括音乐链接、封面图片、简介等信息,吸引更多的用户来使用 Spotify 系统。同时,系统可以跟踪分享的效果,如点击量、转化率等,以便评估社交分享对系统推广的贡献。
|
4月前
|
负载均衡 前端开发 API
我希望在系统设计面试之前知道的 12 种微服务模式
我希望在系统设计面试之前知道的 12 种微服务模式
|
5月前
|
缓存 搜索推荐 Java
Java面试题:简述CAP理论及其在分布式系统设计中的应用。请提供一个具体的例子,说明在系统设计中如何取舍一致性和可用性
Java面试题:简述CAP理论及其在分布式系统设计中的应用。请提供一个具体的例子,说明在系统设计中如何取舍一致性和可用性
62 0
|
7月前
|
存储 缓存 算法
系统设计面试的行家指南(下)(2)
系统设计面试的行家指南(下)(2)
59 1
|
7月前
|
存储 缓存 算法
系统设计面试的行家指南(上)(2)
系统设计面试的行家指南(上)(2)
80 1
|
7月前
|
存储 缓存 数据库
系统设计面试的行家指南(上)(1)
系统设计面试的行家指南(上)(1)
98 0

热门文章

最新文章