首页 > 其他分享 >面试官:系统需求多变时如何设计?

面试官:系统需求多变时如何设计?

时间:2022-12-31 21:31:19浏览次数:51  
标签:候选者 脚本 面试官 可以 逻辑 责任 多变 设计


面试官:我想问个问题哈,项目里比较常见的问题

面试官我现在有个系统会根据请求的入参,做出不同动作。但是,这块不同的动作很有可能是会发生需求变动的,这块系统你会怎么样设计?

面试官实际的例子:现在有多个第三方渠道,系统需要对各种渠道进行订单归因。但是归因的逻辑很有可能会发生变化,不同的渠道归因的逻辑也不太一样,此时系统里的逻辑相对比较复杂。

面试官如果让你优化,你会怎么设计?

候选者:我理解你的意思了

候选者:归根到底,就是处理的逻辑相对复杂,if else的判断太多了

候选者:虽然新的需求来了,都可以添加if else进行解决

候选者:但你想要的就是,系统的可扩展性和可维护性更强

候选者:想要我这边出一个方案,来解决类似的问题

候选者:对吧?

面试官:嗯…

候选者:在这之前,一般上网搜如何解决 if else ,大多数都说是 策略模式

候选者:但是举的例子又没感同身受,很多时候看完就过去了

候选者:实际上,在项目里边,用策略模式还是蛮多的,可能无意间就已经用上了(毕竟面向接口编程嘛)

候选者:而我认为,策略模式不是解决if else的关键

面试官:系统需求多变时如何设计?_策略模式

候选者:这个问题,我的项目里的做法是:责任链模式

候选者:把每个流程单独抽取成一个Process(可以理解为一个模块或节点),然后请求都会塞进Context中

候选者:比如,之前维护过一个项目,也是类似于不同的渠道走不同的逻辑

候选者:我们这边的做法是:抽取相关的逻辑到Process中,为不同的渠道分配不同的责任链

候选者:比如渠道A的责任链是:WhiteListProcess->DataAssembleProcess->ChannelAProcess->SendProcess

候选者:而渠道B的责任链是:WhiteListProcess->DataAssembleProcess->ChannelBProcess->SendProcess

面试官:系统需求多变时如何设计?_java_02

候选者:在责任链基础之上,又可以在代码里内嵌「脚本」

候选者:比如在SendProcess上,内置发送消息的脚本(脚本可以选择不同的运营商进行发送消息)。有了「脚本」以后,那就可以做到对逻辑的改动不需要重启就可以生效。

候选者:有人把这一套东西叫做「规则引擎」。比如,规则引擎中比较出名的实现框架「Drools」就可以做到类似的事

候选者:把易改动的逻辑写在「脚本」上(至少我们认为,脚本和我们的应用真实逻辑是分离)

候选者:(脚本我这里指的是规则集,它可以是Drools的dsl,也可以是Groovy,也可以是aviator等等)

面试官:嗯…

候选者:在我之前的公司,使用的是Groovy脚本。大致的实现逻辑就是:有专门后台对脚本进行管理,然后会把脚本写到「分布式配置中心」(实时刷新),客户端监听「分布式配置中心」所存储的脚本是否有改动

候选者:如果存在改动,则通过Groovy类加载器重新编译并加载脚本,最后放到Spring容器对外使用

面试官:系统需求多变时如何设计?_java_03

候选者:我目前所负责的系统就是这样处理 多变 以及需求变更频繁的业务(责任链+规则引擎)

候选者:不过据我了解,我们的玩法业务又在「责任链」多做了些事情

候选者:「责任链」不再从代码里编写,而是下沉到平台去做「服务编排」,就是由程序员去「服务编排后台」上配置信息(配置责任链的每一个节点)

候选者:在业务系统里使用「服务编排」的客户端,请求时只要传入「服务编排」的ID,就可以按「服务编排」的流程执行代码

候选者:这样做的好处就是:业务链是在后台配置的,不用在系统业务上维护链,灵活性更高(写好的责任链节点可以随意组合)

面试官:系统需求多变时如何设计?_java_04

面试官:那我懂了

面试官:系统需求多变时如何设计?_责任链模式_05

推荐项目

如果想学Java项目的,我还是强烈推荐我的开源项目消息推送平台Austin,可以用作毕业设计,可以用作校招,可以看看生产环境是怎么推送消息的。

标签:候选者,脚本,面试官,可以,逻辑,责任,多变,设计
From: https://blog.51cto.com/u_12206475/5982305

相关文章

  • 面试官问我JVM调优,我忍不住了,哈哈哈哈
    面试官:今天要不来聊聊JVM调优相关的吧?面试官:你曾经在生产环境下有过调优JVM的经历吗?候选者:没有面试官:…候选者:嗯…是这样的,我们一般优化系统的思路是这样的候选者:1.一般来......
  • 2022年总结--自动化测试框架设计
     一、自动化测试没那么简单简而言之,自动化测试就是利用脚本来完成重复、机械、繁重的手工测试。从使用功能的角度而言,自动化测试脚本既是一个工具,也是一款软件。因......
  • VUE3 全局共享数据方案之一 VUEX企业级模块化设计(详细流程)
    Vue3,webpack,vite通用适用于中大型项目中1.安装vuexnpmivuex 2.创建仓库与文件结构(核心)一,创建入口在src目录下创建store文件夹,store文件夹下创建下面文件结......
  • Envoy的负载均衡与限流设计
    负载均衡是高性能和高并发的基础,通过负载均衡,可以将流量均匀分布到集群的多个节点上,Envoy负载均衡的设计和实现如下。1.优先级Envoy集群管理也是以优先级为基础进行组织的,单......
  • 代码随想录算法训练营第一天| LeetCode203.移除链表元素、707. 设计链表、206.反转链
    203.移除链表元素https://leetcode.cn/problems/remove-linked-list-elements/structListNode{intval;ListNode*next;ListNode(){val=0;......
  • 文件系统设计与实现
    文章目录​​文件系统的设计和实现​​​​背景知识​​​​实验设计相关的定义​​​​文件管理数据结构设计​​​​基本思路​​​​实验目标​​​​物理磁盘设计​​​......
  • 基于FPGA状态机设计实现EtherCAT从站
    0引言EtherCAT是由BECKHOFF提出的在工业控制领域获得广泛应用的现场总线之一,该总线具备全双工工作模式,可基于主站(Master)和从站(Slave)连接的模式实现数据传递,且具有低延时、......
  • 【面试题】面试官:为什么Promise中的错误不能被try/catch?
    大厂面试题分享面试题库前端面试题库(面试必备) 地址:​​前端面试题库​​前言之前我写过一篇文章,讨论了为什么​​asyncawait​​​中的错误可以被​​trycatch​​​......
  • 面试官:ui组件可以自动加载,那么业务组件可以吗?
    大厂面试题分享面试题库前端面试题库(面试必备) 地址:​​前端面试题库​​背景笔者在最近在公司接手了一个老的对内使用的项目,接手后体验了下发现首屏加载比较慢。分析......
  • Selenium59-设计conftest
    pytest的conftest文件conftest文件的作用:一个专门存放fixture的配置文件。多个测试用例文件(test_*.py)的所有用例都需要用到一个前置/后置操作,如登陆退出,浏览器......