版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2025年软考练习题中级软件设计师上半年下午考试练习题及答案解析案例一、试题一(数据流图与结构化分析)【说明】某市“智慧停车”平台拟升级,新增“车位共享”功能:个人或商业车场可将空闲车位发布到平台,驾驶员可预约并导航至共享车位,离场时平台自动结算。升级后系统边界不变,仍与市政交通平台、支付网关、地图服务商交互。项目组已完成0层图,要求考生补充1层DFD并回答相关问题。【0层图要素】外部实体:驾驶员、车位发布者、市政交通平台、支付网关、地图服务商。主要加工:P1注册登录、P2发布车位、P3预约车位、P4导航、P5进场记录、P6离场结算、P7信用管理。数据存储:D1用户档案、D2车位档案、D3订单档案、D4信用档案、D5计费规则。【问题1】(6分)在1层DFD中,P3“预约车位”需要分解为哪三个子加工?请用“加工编号+名称”形式给出,并简述每个子加工的核心职能。【答案】P3.1检查车位实时状态:读取D2,校验目标车位在预约时段是否仍空闲。P3.2生成预订单:向D3写入预订单,状态=“已预约”,并冻结车位30分钟。P3.3推送预约结果:向驾驶员APP返回预约成功/失败,同时向车位发布者推送提醒消息。【问题2】(5分)0层图中缺少一条外部实体“市政交通平台”到加工P7的数据流,请给出该数据流名称并说明必要性。【答案】数据流名称:交通违章事件。必要性:当驾驶员在共享车位路段出现违停、逆行等违章时,市政交通平台将违章信息推送至P7,用于扣减信用分,确保信用档案闭环。【问题3】(4分)D5“计费规则”在0层图中仅与P6关联。请指出1层图中还有哪些子加工必须读取D5,并说明原因。【答案】P3.2生成预订单:需读取D5获取“预约超时罚金规则”,在预订单中写入潜在罚金,用于提醒驾驶员。P5.1记录进场:需读取D5获取“免费时长”,决定计费起点。原因:计费规则是平台核心资产,任何涉及费用计算的加工都需实时同步,避免前后端不一致导致纠纷。【问题4】(5分)项目组拟将“导航”加工P4整体外包给地图服务商,仅在平台保留“导航请求接口”。这种外包方式对DFD产生何种影响?请从数据流、加工、外部实体三个角度各答一点。【答案】数据流:原P4→驾驶员的“导航路径”数据流消失,改为地图服务商→驾驶员。加工:P4不再出现,平台侧新增接口加工“P4.0导航网关”,仅负责转发请求。外部实体:地图服务商由“外部实体”升级为“外部系统+加工”混合形态,DFD需用虚线框标注其不在平台控制范围内。二、试题二(数据库设计)【说明】继续“智慧停车”平台,需设计车位共享核心表。初始需求如下:1.用户分为“发布者”与“驾驶员”,两者属性重叠度80%。2.车位必须绑定“产权证明”图片,一张图片≤5MB。3.订单支持“预约金”与“离场补差”两笔支付,需记录各自状态。4.平台采用MySQL8.0,InnoDB引擎,全球部署,日均订单百万级。【问题1】(6分)设计用户表,要求可区分角色且避免冗余,请给出DDL,并说明主键与索引策略。【答案】CREATETABLEt_user(user_idBIGINTPRIMARYKEYAUTO_INCREMENT,phoneVARCHAR(20)NOTNULLUNIQUE,pwd_hashCHAR(60)NOTNULL,nicknameVARCHAR(40),roleENUM('PUBLISHER','DRIVER','BOTH')NOTNULL,statusTINYINTDEFAULT1,create_timeDATETIMEDEFAULTCURRENT_TIMESTAMP,update_timeDATETIMEDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,INDEXidx_phone(phone),INDEXidx_status_role(status,role))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;主键:user_id,全局自增,确保分布式环境下唯一(使用雪花算法兼容)。索引:status+role联合索引用于后台多角色分页查询,避免全表扫描。【问题2】(5分)车位表需存储高清产权图片,请给出两种可行方案并对比优劣。【答案】方案A:垂直分表,t_parking_space存结构化字段,t_space_certificate单独存图片BLOB。优点:InnoDB行格式不变,主表体积小,查询列表时不加载大字段。缺点:一次查询需JOIN,事务边界扩大,代码复杂。方案B:图片存对象存储OSS,表里只存HTTPSURL。优点:数据库体积恒定,无限水平扩展,CDN加速。缺点:额外一次网络I/O,需处理OSS404与缓存失效。结论:订单百万级,方案B综合成本更低,推荐采用。【问题3】(4分)订单支付需记录两笔款项,请设计表结构,要求支持幂等回调,并说明如何防止重复通知导致金额重复累加。【答案】CREATETABLEt_order_payment(payment_idBIGINTPRIMARYKEY,order_idBIGINTNOTNULL,pay_typeENUM('RESERVE','BALANCE')NOTNULL,amountINTNOTNULLCOMMENT'单位:分',statusENUM('WAIT','SUCCESS','FAIL','CLOSED')NOTNULL,third_serialVARCHAR(64)UNIQUECOMMENT'第三方支付单号',callback_timesTINYINTDEFAULT0,create_timeDATETIMEDEFAULTCURRENT_TIMESTAMP,update_timeDATETIMEDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,UNIQUEKEYuk_order_type(order_id,pay_type));幂等:利用uk_order_type保证同一订单同一类型仅一条记录;回调时先SELECTFORUPDATE,若status=SUCCESS直接返回SUCCESS,不再修改金额。【问题4】(5分)平台计划按“市+区+街道”三级区域做分区统计,但区域编码会随政策调整,请给出区域表设计,确保历史订单能正确关联到当时的区域名称。【答案】CREATETABLEt_region(region_idINTPRIMARYKEY,parent_idINT,region_nameVARCHAR(50)NOTNULL,region_levelTINYINTCHECK(region_levelBETWEEN1AND3),versionINTDEFAULT1,start_dateDATENOTNULL,end_dateDATEDEFAULT'99991231',INDEXidx_parent(parent_id),INDEXidx_version(region_id,version));订单表不直接存名称,只存region_id+version;区域调整后新增版本,旧版本end_date截止,历史订单无需更新,仍指向旧版本,保证统计一致。三、试题三(面向对象设计)【说明】升级后的平台需支持“信用分”动态计算,规则如下:1.基础分600,上限900,下限300。2.驾驶员完成1次正常订单+5分;发布者完成1次共享+5分。3.违章被市政交通平台推送1次−50分。4.分数每日凌晨2点批量更新,实时性要求不高。5.规则可能每月调整,系统需支持热插拔。【问题1】(6分)采用策略模式实现信用计算,请给出类图核心部分(文字描述即可),并说明各策略类职责。【答案】类图核心:Context:CreditCalculator,持有ICreditStrategy接口引用。接口:ICreditStrategy,方法intcalculate(Useruser,Eventevent)。具体策略:NormalOrderStrategy:正常订单+5。TrafficViolationStrategy:违章−50。ManualAdjustStrategy:人工调整,可±任意值,受上下限约束。DailyBatchStrategy:每日凌晨汇总所有事件,批量计算,避免单次写库。职责:每个策略只处理一种事件类型,策略内部调用CreditRuleConfig读取当前规则版本,实现热插拔。【问题2】(5分)为避免每日批处理时内存溢出,系统采用“分页+异步”方案,请给出伪代码并指出潜在陷阱。【答案】伪代码:intpageSize=1000;longmaxId=0;while(true){List<Event>list=eventDao.findByIdGreaterThan(maxId,pageSize);if(list.isEmpty())break;for(Evente:list){creditService.calculateAsync(e);maxId=e.getId();}}潜在陷阱:1.异步线程池队列积压,需配置拒绝策略为“调用者运行”防止丢失。2.同一用户并发更新信用分导致脏写,需在数据库层使用乐观锁(version字段)。【问题3】(4分)规则热插拔要求不重启应用,请给出两种技术方案并对比。【答案】方案A:Spring@RefreshScope+配置中心(Nacos),将分值参数外置。优点:简单,支持动态刷新。缺点:只能调整数值,无法新增算法。方案B:Groovy脚本引擎,策略类以脚本形式存储在数据库,变更后即时编译加载。优点:可新增算法,无需上线。缺点:脚本错误会导致运行时异常,需沙箱与单元测试保护。结论:数值变更用A,算法变更用B,两者可共存。【问题4】(5分)信用分变动后需通知用户APP,但消息不能重复,请设计消息去重机制。【答案】消息表t_credit_message:msg_idBIGINTPRIMARYKEY,user_idBIGINT,score_changeINT,event_idBIGINTUNIQUE,statusENUM('NEW','SENT')DEFAULT'NEW',create_timeDATETIME,INDEXidx_status_user(status,user_id)发送逻辑:1.事务内先插入t_credit_message,event_id做唯一约束,保证重复事件仅一条消息。2.本地事务提交后,异步线程扫描status=NEW,调用推送网关,成功则更新status=SENT。3.推送网关返回失败,线程指数退避重试,最多5次,仍失败则报警人工介入。四、试题四(算法与程序设计)【说明】平台需提供“最优车位推荐”接口,输入:驾驶员经纬度(x,y),预计停车时长t(分钟),输出:Top5车位列表,按综合得分降序。得分公式:score=w1distScore+w2priceScore+w3availScore其中distScore=1000/(1+d),d为驾驶距离(米);priceScore=50−p,p为每小时费用(元);availScore=剩余可预约时长(分钟)。权重w1=0.5,w2=0.3,w3=0.2。车位数据存储在MySQL,量级100万,接口平均QPS500,要求RT≤200ms。【问题1】(6分)请给出距离计算SQL函数,并说明为何放弃MySQL内置ST_Distance。【答案】函数:CREATEFUNCTIONdist_km(lat1DOUBLE,lng1DOUBLE,lat2DOUBLE,lng2DOUBLE)RETURNSDOUBLEDETERMINISTICREADSSQLDATABEGINDECLARErDOUBLEDEFAULT6371;DECLAREdlatDOUBLEDEFAULTRADIANS(lat2lat1);DECLAREdlngDOUBLERADIANS(lng2lng1);DECLAREaDOUBLEDEFAULTSIN(dlat/2)SIN(dlat/2)+COS(RADIANS(lat1))COS(RADIANS(lat2))SIN(dlng/2)SIN(dlng/2);DECLAREcDOUBLEDEFAULT2ATAN2(SQRT(a),SQRT(1a));RETURNrc;END;放弃ST_Distance原因:MySQL8.0地理计算默认使用平面坐标,精度低;且无法使用普通B+树索引,需SPATIAL索引,而SPATIAL在阿里云RDS只支持InnoDB的POINT格式,现有表结构为单独lat/lng字段,改造成本高。【问题2】(5分)为降低计算量,系统先按“矩形+索引”粗筛,再精确排序。请给出粗筛SQL,并说明如何确定矩形边长。【答案】SQL:SELECTspace_id,lat,lng,price,avail_minutesFROMt_spaceWHERElatBETWEEN{lat0}−δAND{lat0}+δANDlngBETWEEN{lng0}−δAND{lng0}+δANDstatus='FREE'ANDavail_minutes>={t}ORDERBYdist_km(lat,lng,{lat0},{lng0})LIMIT100;δ确定:根据历史95分位驾驶距离,取δ=3km,可过滤掉99%以上无效数据,实测索引扫描行数<500。【问题3】(4分)粗筛后仍需计算score,请用Java伪代码给出Top5算法,要求O(nlog5)复杂度。【答案】PriorityQueue<Space>queue=newPriorityQueue<>(CparingDouble(s>s.score));for(Spaces:list){doubled=dist_km(s.lat,s.lng,req.lat,req.lng)1000;doubledistScore=1000.0/(1+d);doublepriceScore=50s.price;doublescore=0.5distScore+0.3priceScore+0.2s.availMinutes;s.score=score;queue.offer(s);if(queue.size()>5)queue.poll();}List<Space>top=newArrayList<>();while(!queue.isEmpty())top.add(queue.poll());Collections.reverse(top);复杂度:维护大小为5的小顶堆,插入n次,每次log5,总O(nlog5)。【问题4】(5分】系统高峰期QPS500,MySQLCPU占用飙升,请给出两级缓存方案并说明一致性策略。【答案】方案:L1本地caffeine,容量5000,过期30秒,存储(lat0,lng0)栅格化key,value为Top5列表JSON。L2Redis,过期5分钟,key格式“space:top:{geohash_5}:{t}”,value为protobuf序列化。一致性:1.车位状态变更时,先写MySQL,再发canalbinlog消息到MQ,消费者按geohash失效对应Rediskey;本地缓存依靠短TTL自然过期。2.对同一geohash并发请求,在Redis层使用SETNX实现单飞,防止缓存击穿。3.驾驶员下单成功立即减少avail_minutes,采用“缓存预减”策略:先减Redis库存,异步扣MySQL,失败则回滚Redis,保证最终一致。五、试题五(系统设计)【说明】平台拟上线“车位预约排队”功能:当车位被预约满,用户可加入排队,一旦有人取消,系统自动将车位分配给队首用户,并给用户推送5分钟支付窗口,超时则顺延。该功能预计峰值队列长度10万,平均取消率5%/分钟。【问题1】(6分】请给出排队系统整体架构文字描述,要求包括接入层、队列层、调度层、通知层,并指出各层关键技术选型。【答案】接入层:API网关+SpringBoot,接收“加入排队”请求,返回排队号。队列层:RedisStream,每个车位对应一个streamkey,如“queue:space:123”,利用stream的单调递增ID作为排队号,保证全局有序。调度层:Quartz集群+分布式锁,每10秒扫描“即将取消”的订单,将释放车位插入“待分配”stream;调度器消费“待分配”stream,使用XREADGROUP阻塞读取队首,生成待支付订单。通知层:MQ(RocketMQ)异步发送APP推送与短信,消息延迟等级5分钟,用于触发“支付窗口超时”事件。【问题2】(5分】RedisStream消费采用消费者组,请给出XGROUPCREATE命令并说明为何使用消费者组而非简单LPOP。【答案】命令:XGROUPCREATEqueue:space:123scheduler_group$MKSTREAM原因:1.消费者组支持ACK机制,若调度器崩溃,未ACK的消息会重新分配给存活节点,实现故障转移。2.组内可横向扩展多个scheduler实例,均摊压力,而LPOP无法多消费者安全并发。【问题3】(4分】系统需保证“同一用户不能重复排队”,请给出Lua脚本,实现原子性判断与入队。【答案】localexists=redis.call('ZSCORE','user_in_queue:'..KEYS[1],ARGV[1])ifexiststhenreturn0endlocalid=redis.call('XADD','queue:space:'..KEYS[1],'','user',ARGV[1],'time',ARGV[2])redis.call('ZADD','user_in_queue:'..KEYS[1],0,ARGV[1])returnid脚本先检查用户是否已在集合,若不在则XADD并记录,确保并发安全。【问题4】(5分】调度器分配成功后需创建订单,但订单服务可能超时,请给出Saga事务模式实现思路。【答案】1.调度器生成“预订单”,状态=CREATED,持有车位乐观锁version。2.发送“创建订单”命令到订单服务,订单服务成功后回复“订单已创建”事件。3.调度器收到事件,更新预订单状态=CONFIRMED,并ACKRedisStream。4.若订单服务返回失败或超时,调度器发送“补偿释放车位”命令,将version回滚,并XDEL排队消息,实现最终一致。5.所有步骤记录到t_saga_log,支持人工干预重试。六、试题六(Web安全与性能)【说明】平台上线后遭遇“恶意占坑”攻击:攻击者用大量账号预约车位但不进场,导致真实用户无法预约。攻击特征:同一IP短时并发请求>100,UserAgent为脚本,预约后30分钟内取消率>90%。【问题1】(6分】请在WAF层给出两条正则规则,分别拦截异常UserAgent与异常取消率请求,并说明误伤风险。【答案】规则1:UserAgent匹配^Python|Gohttp|curl|Wget拦截脚本请求,误伤:部分开发者使用官方SDK封装底层libcurl,可能误杀,需配合频率阈值。规则2:URI路径=/api/reserve且请求参数cancel_rate>0.9该规则需应用层回传cancel_rate,WAF无法直接计算,实际不可行;修正为:URI=/api/cancel,且同一个session_id5分钟内取消次数>5,则拦截。误伤:用户因填写错误车牌反复取消,可能命中,需加入“会员等级”白名单。【问题2】(5分】后端采用令牌桶限流,请给出GuavaRateLimiter的SpringAOP环绕通知伪代码,要求针对“IP+用户”组合维度。【答案】@Aspect@ComponentpublicclassReserveLimitAspect{privatefinalLoadingCache<String,RateLimiter>cache=Caffeine.newBuilder().expireAfterAccess(1,TimeUnit.HOURS).build(k>RateLimiter.create(10));//每IP+用户10次/秒@Around("@annotation(ReserveRateLimit)")publicObjectlimit(ProceedingJoinPointpjp)throwsThrowable{HttpServletRequestrequest=((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();Stringip=getClientIp(request);Stringuser=SecurityContextHolder.getContext().getAuthentication().getName();Stringkey=ip+":"+user;RateLimiterlimiter=cache.get(key);if(!limiter.tryAcquire()){
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 吉鸿昌介绍教学课件
- 2026年航天航空知识竞赛题及答案(三)
- 2026年大学生爱我国防知识竞赛试卷及答案(七)
- 森林公安考试题及答案
- 入学规范考试题及答案
- 2026年政府职能转型与管理模式创新问题研究题目集
- 2026年新闻传播与媒体运营专业测试题库
- 远洋中学介绍
- 2026一季度重庆市属事业单位考核招聘310备考考试试题及答案解析
- 2026年安庆太湖县刘畈村工作人员考试参考试题及答案解析
- von frey丝K值表完整版
- 勾股定理复习导学案
- GB/T 22900-2022科学技术研究项目评价通则
- SB/T 11094-2014中药材仓储管理规范
- GB/T 6418-2008铜基钎料
- GB/T 3452.4-2020液压气动用O形橡胶密封圈第4部分:抗挤压环(挡环)
- GB/T 16621-1996母树林营建技术
- GB/T 14518-1993胶粘剂的pH值测定
- GB/T 14072-1993林木种质资源保存原则与方法
- GA/T 1310-2016法庭科学笔迹鉴定意见规范
- 垃圾分类科普指南课件(21张PPT)
评论
0/150
提交评论