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

news2025/1/12 13:33:52

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

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

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

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

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

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

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

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

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

候选者:对吧?

面试官:嗯…

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

面试官:嗯…

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

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

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

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

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

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

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

面试官:那我懂了

推荐项目

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

Gitee仓库地址:https://gitee.com/zhongfucheng/austin

GitHub仓库地址:https://github.com/ZhongFuCheng3y/austin

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/118004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FFmpeg简单使用:视频编码 ---- YUV转H264

基本流程 从本地读取YUV数据编码为h264格式的数据,然后再存⼊到本地,编码后的数据有带startcode。 与FFmpeg 示例⾳频编码的流程基本⼀致。 函数说明:avcodec_find_encoder_by_name:根据指定的编码器名称查找注册的编码器。 av…

第二十九章 数论——中国剩余定理与线性同余方程组

第二十九章 数论——中国剩余定理与线性同余方程组一、中国剩余定理1、作用:2、内容:3、证明:(1)逆元的存在性(2)验证定理的正确性4、代码实现:(1)步骤&#…

国产操作系统openEuler22.03配置yum源

作者:IT圈黎俊杰 本文选用的操作系统版本是openEuler22.03-LTS。openEuler是指操作系统的品牌英文名,中文名叫“欧拉”;22.03是指版本号(openEuler以年月为版本号,22.03表示2022年03月发布的版本)&#xff…

sonarqube——前端vue本地代码审查code review查看代码行数和注释率

目录一、环境二、操作1.启动2.中文3.使用三、过程踩坑1.sonarqube启动闪退2.解析报错 node 14.17一、环境 windows 64位 环境压缩包下载(sonar9.8,jdk11,sonar-scanner) 下载完成解压后,将 sonar-scanner-4.7.0.2747-…

curl 指令

勿以恶小而为之,勿以善小而不为---- 刘备 curl 是常用的命令行工具,用来请求 Web 服务器。 它的名字就是客户端(client)的 URL 工具的意思。 它的功能非常强大,命令行参数多达几十种 我们后端开发者, 可以…

MyISAM索引解析、InnoDB索引解析

我们经常说到的存储引擎是说数据库级别还是说表级别? 答:表级别。(数据库级别也可以设置,但是最终它的级别生效是在表级别) 1、MylSAM存储引擎索引实现 MylSAM索引文件和数据文件是分离的(非聚集&#xf…

大数据开发中级练习题目(python超详细)

给定长度为m的非重复数组p&#xff0c;以及从其中取n&#xff08;n<m&#xff09;个数字组成新的子数组q。现要对p进行排序&#xff0c;要求&#xff1a;q在数组的最前方&#xff0c;其余数字按从小到大的顺序依次排在后面 输入样例&#xff1a; q [3, 5, 4] p [5, 4, 3…

37. 解数独

37. 解数独 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff…

SAP 财务年结操作宝典

目录 一 、后台操作篇 1.1 维护会计凭证编号范围 2.2 维护CO版本 1.3 维护利润中心版本 1.4 维护物料分类账文档的编号范围 (如 1.5 复制合并凭证编号范围(如果公司没有这个业务的) 1.6 维护发票凭证的编号范围间隔 (如果不针对年度则不用维护) 1.7 维护发票凭证的编号范…

MCU-51:单片机串口详解

目录一、计算机通信简介二、串口通信简介2.1 同步通信2.2 异步通信三、串行通信的传输方式四、串口通信硬件电路五、常见接口介绍六、串口相关寄存器详解6.1 特殊功能寄存器SCON6.2 PCON寄存器6.3 TMOD寄存器七、代码演示-单片机和电脑通信7.1 串口向电脑发送数据7.2 电脑通过串…

YOLO-V5 算法和代码解析系列(二)—— 【train.py】核心内容

文章目录调试设置整体结构代码解析ModelTrainloader分布式训练FreezeOptimizerSchedulerEMA调试设置 调试平台&#xff1a;Ubuntu&#xff0c;VSCode 调试设置&#xff0c;打开【/home/slam/kxh-1/2DDection/yolov5/.vscode/launch.json】&#xff0c;操作如下图所示&#xff…

GNN基础知识

1. 泰勒公式 背景background 有一个很复杂的方程&#xff0c;我们直接计算方程本身的值可能非常麻烦。 所以我们希望能够找到一个近似的方法来获得一个足够近似的值 本质&#xff1a; 近似&#xff0c;求一个函数的近似值 one point is 近似的方法another point is 近似的…

【Java 数据结构】-优先级队列以及Java对象的比较

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【Java 数据结构】 分享&#xff1a;美妙人生的关键在于你能迷上什么东西。——《球状闪电》 主要内容&#xff1a;优先级队列底层的堆&#xff0c;大堆的创建&#xff0c;插入&a…

Openssl 生成自签名证书

最近在调试Ingress需要使用多份证书&#xff0c;对证书的生成和使用做了简单的整理。 不用翻垃圾桶一条过 #!/bin/sh output_dir"/opt/suops/k8s/ingress-files/certs/fanht-create-ssl/" read -p "Enter your domain [www.example.com]: " DOMAIN echo…

C++11特性-线程

并发 一个程序执行多个独立任务&#xff0c;提高性能 单核cpu是通过(任务切换)&#xff0c;即上下文切换&#xff0c;有时间开销 多核cpu(当核数>任务数)&#xff0c;硬件并发 进程 运行起来的一个可执行程序&#xff08;一段程序的运行过程&#xff09; 资源分配的最小单…

百数应用中心上新了——餐饮门店管理系统

随着智能化时代的来临&#xff0c;传统的餐饮门店管理方式逐渐暴露出缺陷。不少餐饮业的掌门人都纷纷对管理方式进行了转型&#xff0c;由传统模式转变为数字化系统的管理。然而数字化管理方式也没那么容易进行&#xff0c;想要百分百满足需求的系统耗时耗力耗钱&#xff0c;成…

不懂PO 设计模式?这篇实战文带你搞定 PO

1080442 73.1 KB 为UI页面写测试用例时&#xff08;比如web页面&#xff0c;移动端页面&#xff09;&#xff0c;测试用例会存在大量元素和操作细节。当UI变化时&#xff0c;测试用例也要跟着变化&#xff0c; PageObject 很好的解决了这个问题&#xff01; 使用UI自动化测试工…

钉钉 ANR 治理最佳实践 | 定位 ANR 不再雾里看花

作者&#xff1a;姜凡(步定) 本文为《钉钉 ANR 治理最佳实践》系列文章首篇《定位 ANR 不再雾里看花》&#xff0c;主要介绍了钉钉自研的 ANRCanary 通过监控主线程的执行情况&#xff0c;为定位 ANR 问题提供更加丰富的信息。 后续将在第二篇文章中讲述钉钉基于分析算法得出 …

【TuyaOS开发之旅】BK7231N GPIO的简单使用

接口讲解 GPIO初始化 /*** brief gpio 初始化* * param[in] pin_id: 需要初始化的GPIO编号&#xff0c; 对应TUYA_GPIO_NUM_E枚举* param[in] cfg: gpio 配置** return OPRT_OK on success. Others on error, please refer to tuya_error_code.h*/ OPERATE_RET tkl_gpio_ini…

基于SpringBoot工程开发Docker化微服务

目录 1. 微服务容器化治理的优缺点 1.1 微服务容器化的优点 1.2 微服务容器化的缺点 2. 微服务的两种模式 2.1 Microservice SDK 2.2 ServiceMesh 3. 微服务容器化治理的推荐模式 4.Windows下开发容器化微服务&#xff08;非K8S&#xff09; 4.1 开发环境 4.2 代码框架…