当前位置: 首页 > news >正文

from中烟科技翼支付 面试题1

一、项目经验(主要看沟通、思考能力)

  1. 你的项目是做什么的,有哪些功能

我们项目是一个toC的拥有完整商城交易链路的交易小程序,主要支持京东家电家居品类线上和线下的交易,主要功能模块包括售前售中售后三大部分,售前主要是首页商品推荐、商品搜索、商品详情、领券、门店活动、购物车、提单结算这些功能;售中主要包括订单支付、订单列表、订单详情、门店自提、用户收货等功能;售后包括取消订单、申请售后、调研问卷等功能;还包括一个营销运营后台,主要做调研问卷的、门店信息的维护和用户营销比如给用户发送营销短信和客服回访;还有相关线下门店配套的系统比如门店大屏系统、门店导视系统、停车场系统。使用的主要技术栈是java、spring、springboot、mysql、es、redis。

  1. 你做的模块在整个项目中所处的位置及作用,要能清晰的描述模块间的关联关系

我做了很多功能,拿订单中心模块来讲,分为两部分,一部分是C端订单中心,主要功能是在用户购物车结算模块之后的订单流程,正向包括订单列表、订单详情、订单搜索、订单支付、确认收货、门店自提等功能,逆向包括取消订单、申请售后等功能;

另外一部分是B端的订单消息中心,会接收订单状态变更消息、订单拆单消息、订单对账等消息,任务中心会判断消费任务的完成情况给用户发送任务奖励、会员中心会根据订单消费金额提升用户消费等级并发放消费奖励、问卷调研系统会更具订单类型给用户发送不同类型的问卷。

  1. 你的项目的整体架构是怎样的

我们项目主要进行的分层架构
1)面向用户的展示层分为moblie端pc端,m端分为微信小程序、京东小程序和导购app
2)下面是接口网关,统一将接口封装为网关接口,这层主要做一些授权(授权哪些应用可以调用接口)、限流(超过限流可配置熔断)、防刷、黑白名单的操作
3)网关的请求会调用核心业务层,核心业务层就是我们开发的一些controller和对外的服务,这里我们分为applet(C端)、oper(营销后台)、trigger(消息服务)
4)最下层就是基础数据层,包括数据库服务data和调用外部接口服务among

  1. 使用了哪些中间件

用的挺多的,常用的比如mq,我们公司封装的kafka消息队列,比如任务中心、会员消费等级、问卷系统对订单状态的处理逻辑是通过监听消息队列实现的,使用消息队列的好处是可以对高并发的数据进行削峰和限流处理;比如缓存封装的是redis,C端接口基本都需要使用缓存降低数据库的压力;比如数据库常用的mybatis,可以更方便的使用数据库;比如基于ngnix实现的负载均衡,可以将流量均衡的打到不同的服务器上;

  1. 中间件的原理是什么

kafka消息队列主要包括消费者broker和消费者,传递消息主要靠消费者生产消息后将消息存储到broker的消息队列上,再由消费者拉取队列中的消息;
kafka的最大特点就是使用的分区存储,将消息体拆分存储在多个分区上,多个分区可以同步消费消息,提高了消费的性能;并且会对每个分区创建副本,副本中分成leader和follower两部分,follower同步leader的数据,存储在不同节点上,当某个节点的leader主数据因为系统宕机找不到时,其他节点follower就可以通过选举成为新的leader

  1. 在项目中遇到了哪些比较复杂的问题

开发订单中心开发过程中遇见过一个问题,在订单支付的时候出现了重复支付的情况

我们订单提单支付的基本流程,是用户点击支付后,会首选弹出京东收银台,收银台底层对接的支付服务(微信、各类型银行卡、白条、E卡),选择支付方式,点击支付,订单状态更新为支付中,再调用支付服务进行支付,支付完成更新台账信息,订单中心接收对账完成消息后更新订单状态为待打印/待出库等后续状态

我们在测试机上发现如果是弱网环境,订单状态更新不及时,订单支付后瞬间还是待支付状态,仍可以再次点击支付,出现重复支付的情况,订单底层支付其实调用了包括订单中台、促销中台、优惠券中台、商品中台的许多服务判断各种促销状态、促销价格,重复点击会触发这些服务的防重机制,反馈在页面上就只一直点击,一直提示提交失败

解决是使用了基于缓存的分布式锁,将订单id+用户pin作为缓存key存在缓存中,超时时间设置为5s,每次请求判断缓存key是否存在,存在则返回文案正在处理中,请勿重复点击;其实如果是自己的数据表还可以根据数据库唯一索引进行幂等性判断,但是其实我们是调用的中台的支付服务,中台有做自己的判断,我们只需要根据返回code码做对应处理就可以。

二、java基础知识

  1. 栈和队列的区别

队列是先进先出,栈是先进后出后进先出

  1. 接口和抽象类的区别

抽象类和接口都是为了将方法进行抽象,然后让子类去实现。
区别是接口抽象的更纯粹,接口内只有方法,而抽象类除了方法还有内部属性;
如果想用子类去扩展父类,如果是接口需要用implements实现,如果是抽象类需要用extends继承;一个类只能继承一个父类,但是可以实现多个接口,所以我们一般使用接口让类的使用更灵活。

  1. int 和 Integer 的区别

int是java的基本数据类型,Integer是它的封装类,int是一个变量,而Integer是一个对象,所以Integer还有一些内部方法可以使用比如Intger.valueOf(),Integer和int在java中可以自由转换,但是在某些数据结构比如HashMap中只能存储对象所以只能使用Integer,Integer的初始值为null,而int为0;

至于为什么要设计为封装类型,我认为java就是一个面向对象的语音,其中许多数据结果比如集合arrayList和hashMap都只能存储对象,所以要给基础的数据类型封装成对应的封装类进行处理。

自动拆箱/装箱的相关问题

至于包装类型的自动装箱和自动拆箱,就是在Integer和int互相转换时,不需要new对象或者使用intValue()方法,java会自动将基础类和它对应的封装类进行自动的转换,直接进行赋值就可以了。

常量池相关问题
int是基本数据类型,不存在常量池,而Integer是一个封装对象,为了节省内存会在较小的数据范围内,-128-127,将数据存为内部缓存,这就是常量池。

Integer a = 100; Integer b = 100; ab 为true (都指向了缓存中同一个对象)
Integer a = 200; Integer b = 200; a
b 为false 超出常量池范围,为两个对象
Integer a = new int(100); Integer b = new int(100); ab 为false: new了就是不同对象
Integer a = new int(100); Integer b = 100; a
b 为true;自动拆装箱,比较的不是对象

  1. ==和 equals 的区别
    ==如果比较值就是比较两个值是否相同,如果比较引用就是比较引用的是否是一个对象;equals只能比较引用;

  2. 重载和重写的区别
    在同一个方法内,如果想用一个方法根据参数不同有不同的实现,就会使用重载,方法名相同参数不同,返回结果可以相同也可以不同。
    重写是子类继承父类时,对父类的方法进行重写,子类的方法名修饰符和出入参都必须和父类相同,否则无法重写。

  3. String 和 StringBuilder、StringBuffer 的区别
    String是不可变的对象,任何修改都会生成新对象,所以是线程安全的;
    StringBuilder是可变的字符对象,修改不会产生新对象,是线程不安全的;
    StringBuffer是可变的字符对象,修改不会产生新对象,但是方法上用synchronized修饰,是线程安全的。

http://www.dtcms.com/a/352071.html

相关文章:

  • 红黑树下探玄机:C++ mapmultimap 的幕后之旅
  • deer-flow自定义DeepResearch流程实践经历
  • 《信息检索与论文写作》实验报告二 引文索引数据库检索
  • [pilot智驾系统] 纵向规划器(LongitudinalPlanner) | 模型预测控制(MPC)
  • jdk9安装步骤及下载(附小白详细教程)
  • 在Linux系统文件上次及下载
  • 《2025年最新IDE激活码永久破解教程 – 支持JetBrain全家桶2099年授权》
  • UE5安全架构审视:创造者的伊甸园与黑客的游乐场
  • pytorch入门4:cnn卷积神经网络
  • 《UE5_C++多人TPS完整教程》学习笔记44 ——《P45 倾斜与侧向移动(Leaning And Strafing)》
  • MoonBit Pearls Vol.06: MoonBit C-FFI 开发指南
  • 【新启航】现场逆向抄数实战:手持 3D 扫描仪 + 移动建模 APP 的轻量化工具组合与快速响应能力
  • 三款音乐生成工具,你更喜欢哪一个?
  • 如何在pixel上验证webview的功能
  • 服务初始化
  • 基于单张图像的深度估计方法研究:利用 Hugging Face 与 FiftyOne 实现单目深度估计模型的运行与评估
  • 从零开始学MCP(7) | 实战:用 MCP 构建论文分析智能体
  • 零基础从头教学Linux(Day 20)
  • javascript 基础知识- 字面量/内置对象
  • LVGL学习
  • 【设计模式】 面向对象基础
  • K8S-Service资源对象
  • 虚拟机中kubeadim部署的k8s集群,虚拟机关机了,重新开机后集群状态能否正常恢复的两种可能(详解)
  • 114、【OS】【Nuttx】【周边】效果呈现方案解析:-print0 补充(下)
  • WeakAuras Lua Script ICC (BarneyICC) Simplified Chinese [Mini]
  • WeakAuras Lua Script (My Version)
  • 【数据分享】各地级市当年实际使用外商外资金额(2003-2021)-有缺失值
  • 【AI Agent三】工具使用设计模式
  • 系统设计(数据库/微服务)
  • 基于Python+AlphaBot 实现红外遥控且自动避障的嵌入式智能小车系统