2025年軟考真題中級軟件設(shè)計師上半年下午考試真題及答案解析案例_第1頁
2025年軟考真題中級軟件設(shè)計師上半年下午考試真題及答案解析案例_第2頁
2025年軟考真題中級軟件設(shè)計師上半年下午考試真題及答案解析案例_第3頁
2025年軟考真題中級軟件設(shè)計師上半年下午考試真題及答案解析案例_第4頁
2025年軟考真題中級軟件設(shè)計師上半年下午考試真題及答案解析案例_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

2025年軟考練習(xí)題中級軟件設(shè)計師上半年下午考試練習(xí)題及答案解析案例一、試題一(數(shù)據(jù)流圖與結(jié)構(gòu)化分析)【說明】某市“智慧停車”平臺擬升級,新增“車位共享”功能:個人或商業(yè)車場可將空閑車位發(fā)布到平臺,駕駛員可預(yù)約并導(dǎo)航至共享車位,離場時平臺自動結(jié)算。升級后系統(tǒng)邊界不變,仍與市政交通平臺、支付網(wǎng)關(guān)、地圖服務(wù)商交互。項目組已完成0層圖,要求考生補充1層DFD并回答相關(guān)問題?!?層圖要素】外部實體:駕駛員、車位發(fā)布者、市政交通平臺、支付網(wǎng)關(guān)、地圖服務(wù)商。主要加工:P1注冊登錄、P2發(fā)布車位、P3預(yù)約車位、P4導(dǎo)航、P5進場記錄、P6離場結(jié)算、P7信用管理。數(shù)據(jù)存儲:D1用戶檔案、D2車位檔案、D3訂單檔案、D4信用檔案、D5計費規(guī)則?!締栴}1】(6分)在1層DFD中,P3“預(yù)約車位”需要分解為哪三個子加工?請用“加工編號+名稱”形式給出,并簡述每個子加工的核心職能?!敬鸢浮縋3.1檢查車位實時狀態(tài):讀取D2,校驗?zāi)繕?biāo)車位在預(yù)約時段是否仍空閑。P3.2生成預(yù)訂單:向D3寫入預(yù)訂單,狀態(tài)=“已預(yù)約”,并凍結(jié)車位30分鐘。P3.3推送預(yù)約結(jié)果:向駕駛員APP返回預(yù)約成功/失敗,同時向車位發(fā)布者推送提醒消息?!締栴}2】(5分)0層圖中缺少一條外部實體“市政交通平臺”到加工P7的數(shù)據(jù)流,請給出該數(shù)據(jù)流名稱并說明必要性。【答案】數(shù)據(jù)流名稱:交通違章事件。必要性:當(dāng)駕駛員在共享車位路段出現(xiàn)違停、逆行等違章時,市政交通平臺將違章信息推送至P7,用于扣減信用分,確保信用檔案閉環(huán)。【問題3】(4分)D5“計費規(guī)則”在0層圖中僅與P6關(guān)聯(lián)。請指出1層圖中還有哪些子加工必須讀取D5,并說明原因。【答案】P3.2生成預(yù)訂單:需讀取D5獲取“預(yù)約超時罰金規(guī)則”,在預(yù)訂單中寫入潛在罰金,用于提醒駕駛員。P5.1記錄進場:需讀取D5獲取“免費時長”,決定計費起點。原因:計費規(guī)則是平臺核心資產(chǎn),任何涉及費用計算的加工都需實時同步,避免前后端不一致導(dǎo)致糾紛?!締栴}4】(5分)項目組擬將“導(dǎo)航”加工P4整體外包給地圖服務(wù)商,僅在平臺保留“導(dǎo)航請求接口”。這種外包方式對DFD產(chǎn)生何種影響?請從數(shù)據(jù)流、加工、外部實體三個角度各答一點。【答案】數(shù)據(jù)流:原P4→駕駛員的“導(dǎo)航路徑”數(shù)據(jù)流消失,改為地圖服務(wù)商→駕駛員。加工:P4不再出現(xiàn),平臺側(cè)新增接口加工“P4.0導(dǎo)航網(wǎng)關(guān)”,僅負(fù)責(zé)轉(zhuǎn)發(fā)請求。外部實體:地圖服務(wù)商由“外部實體”升級為“外部系統(tǒng)+加工”混合形態(tài),DFD需用虛線框標(biāo)注其不在平臺控制范圍內(nèi)。二、試題二(數(shù)據(jù)庫設(shè)計)【說明】繼續(xù)“智慧停車”平臺,需設(shè)計車位共享核心表。初始需求如下:1.用戶分為“發(fā)布者”與“駕駛員”,兩者屬性重疊度80%。2.車位必須綁定“產(chǎn)權(quán)證明”圖片,一張圖片≤5MB。3.訂單支持“預(yù)約金”與“離場補差”兩筆支付,需記錄各自狀態(tài)。4.平臺采用MySQL8.0,InnoDB引擎,全球部署,日均訂單百萬級?!締栴}1】(6分)設(shè)計用戶表,要求可區(qū)分角色且避免冗余,請給出DDL,并說明主鍵與索引策略?!敬鸢浮緾REATETABLEt_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,全局自增,確保分布式環(huán)境下唯一(使用雪花算法兼容)。索引:status+role聯(lián)合索引用于后臺多角色分頁查詢,避免全表掃描?!締栴}2】(5分)車位表需存儲高清產(chǎn)權(quán)圖片,請給出兩種可行方案并對比優(yōu)劣。【答案】方案A:垂直分表,t_parking_space存結(jié)構(gòu)化字段,t_space_certificate單獨存圖片BLOB。優(yōu)點:InnoDB行格式不變,主表體積小,查詢列表時不加載大字段。缺點:一次查詢需JOIN,事務(wù)邊界擴大,代碼復(fù)雜。方案B:圖片存對象存儲OSS,表里只存HTTPSURL。優(yōu)點:數(shù)據(jù)庫體積恒定,無限水平擴展,CDN加速。缺點:額外一次網(wǎng)絡(luò)I/O,需處理OSS404與緩存失效。結(jié)論:訂單百萬級,方案B綜合成本更低,推薦采用?!締栴}3】(4分)訂單支付需記錄兩筆款項,請設(shè)計表結(jié)構(gòu),要求支持冪等回調(diào),并說明如何防止重復(fù)通知導(dǎo)致金額重復(fù)累加?!敬鸢浮緾REATETABLEt_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保證同一訂單同一類型僅一條記錄;回調(diào)時先SELECTFORUPDATE,若status=SUCCESS直接返回SUCCESS,不再修改金額?!締栴}4】(5分)平臺計劃按“市+區(qū)+街道”三級區(qū)域做分區(qū)統(tǒng)計,但區(qū)域編碼會隨政策調(diào)整,請給出區(qū)域表設(shè)計,確保歷史訂單能正確關(guān)聯(lián)到當(dāng)時的區(qū)域名稱。【答案】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;區(qū)域調(diào)整后新增版本,舊版本end_date截止,歷史訂單無需更新,仍指向舊版本,保證統(tǒng)計一致。三、試題三(面向?qū)ο笤O(shè)計)【說明】升級后的平臺需支持“信用分”動態(tài)計算,規(guī)則如下:1.基礎(chǔ)分600,上限900,下限300。2.駕駛員完成1次正常訂單+5分;發(fā)布者完成1次共享+5分。3.違章被市政交通平臺推送1次?50分。4.分?jǐn)?shù)每日凌晨2點批量更新,實時性要求不高。5.規(guī)則可能每月調(diào)整,系統(tǒng)需支持熱插拔?!締栴}1】(6分)采用策略模式實現(xiàn)信用計算,請給出類圖核心部分(文字描述即可),并說明各策略類職責(zé)?!敬鸢浮款悎D核心:Context:CreditCalculator,持有ICreditStrategy接口引用。接口:ICreditStrategy,方法intcalculate(Useruser,Eventevent)。具體策略:NormalOrderStrategy:正常訂單+5。TrafficViolationStrategy:違章?50。ManualAdjustStrategy:人工調(diào)整,可±任意值,受上下限約束。DailyBatchStrategy:每日凌晨匯總所有事件,批量計算,避免單次寫庫。職責(zé):每個策略只處理一種事件類型,策略內(nèi)部調(diào)用CreditRuleConfig讀取當(dāng)前規(guī)則版本,實現(xiàn)熱插拔?!締栴}2】(5分)為避免每日批處理時內(nèi)存溢出,系統(tǒng)采用“分頁+異步”方案,請給出偽代碼并指出潛在陷阱?!敬鸢浮總未a: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.異步線程池隊列積壓,需配置拒絕策略為“調(diào)用者運行”防止丟失。2.同一用戶并發(fā)更新信用分導(dǎo)致臟寫,需在數(shù)據(jù)庫層使用樂觀鎖(version字段)?!締栴}3】(4分)規(guī)則熱插拔要求不重啟應(yīng)用,請給出兩種技術(shù)方案并對比?!敬鸢浮糠桨窤:Spring@RefreshScope+配置中心(Nacos),將分值參數(shù)外置。優(yōu)點:簡單,支持動態(tài)刷新。缺點:只能調(diào)整數(shù)值,無法新增算法。方案B:Groovy腳本引擎,策略類以腳本形式存儲在數(shù)據(jù)庫,變更后即時編譯加載。優(yōu)點:可新增算法,無需上線。缺點:腳本錯誤會導(dǎo)致運行時異常,需沙箱與單元測試保護。結(jié)論:數(shù)值變更用A,算法變更用B,兩者可共存。【問題4】(5分)信用分變動后需通知用戶APP,但消息不能重復(fù),請設(shè)計消息去重機制?!敬鸢浮肯⒈韙_credit_message:msg_idBIGINTPRIMARYKEY,user_idBIGINT,score_changeINT,event_idBIGINTUNIQUE,statusENUM('NEW','SENT')DEFAULT'NEW',create_timeDATETIME,INDEXidx_status_user(status,user_id)發(fā)送邏輯:1.事務(wù)內(nèi)先插入t_credit_message,event_id做唯一約束,保證重復(fù)事件僅一條消息。2.本地事務(wù)提交后,異步線程掃描status=NEW,調(diào)用推送網(wǎng)關(guān),成功則更新status=SENT。3.推送網(wǎng)關(guān)返回失敗,線程指數(shù)退避重試,最多5次,仍失敗則報警人工介入。四、試題四(算法與程序設(shè)計)【說明】平臺需提供“最優(yōu)車位推薦”接口,輸入:駕駛員經(jīng)緯度(x,y),預(yù)計停車時長t(分鐘),輸出:Top5車位列表,按綜合得分降序。得分公式:score=w1distScore+w2priceScore+w3availScore其中distScore=1000/(1+d),d為駕駛距離(米);priceScore=50?p,p為每小時費用(元);availScore=剩余可預(yù)約時長(分鐘)。權(quán)重w1=0.5,w2=0.3,w3=0.2。車位數(shù)據(jù)存儲在MySQL,量級100萬,接口平均QPS500,要求RT≤200ms?!締栴}1】(6分)請給出距離計算SQL函數(shù),并說明為何放棄MySQL內(nèi)置ST_Distance?!敬鸢浮亢瘮?shù):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地理計算默認(rèn)使用平面坐標(biāo),精度低;且無法使用普通B+樹索引,需SPATIAL索引,而SPATIAL在阿里云RDS只支持InnoDB的POINT格式,現(xiàn)有表結(jié)構(gòu)為單獨lat/lng字段,改造成本高?!締栴}2】(5分)為降低計算量,系統(tǒng)先按“矩形+索引”粗篩,再精確排序。請給出粗篩SQL,并說明如何確定矩形邊長?!敬鸢浮縎QL: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;δ確定:根據(jù)歷史95分位駕駛距離,取δ=3km,可過濾掉99%以上無效數(shù)據(jù),實測索引掃描行數(shù)<500?!締栴}3】(4分)粗篩后仍需計算score,請用Java偽代碼給出Top5算法,要求O(nlog5)復(fù)雜度?!敬鸢浮縋riorityQueue<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);復(fù)雜度:維護大小為5的小頂堆,插入n次,每次log5,總O(nlog5)。【問題4】(5分】系統(tǒng)高峰期QPS500,MySQLCPU占用飆升,請給出兩級緩存方案并說明一致性策略?!敬鸢浮糠桨福篖1本地caffeine,容量5000,過期30秒,存儲(lat0,lng0)柵格化key,value為Top5列表JSON。L2Redis,過期5分鐘,key格式“space:top:{geohash_5}:{t}”,value為protobuf序列化。一致性:1.車位狀態(tài)變更時,先寫MySQL,再發(fā)canalbinlog消息到MQ,消費者按geohash失效對應(yīng)Rediskey;本地緩存依靠短TTL自然過期。2.對同一geohash并發(fā)請求,在Redis層使用SETNX實現(xiàn)單飛,防止緩存擊穿。3.駕駛員下單成功立即減少avail_minutes,采用“緩存預(yù)減”策略:先減Redis庫存,異步扣MySQL,失敗則回滾Redis,保證最終一致。五、試題五(系統(tǒng)設(shè)計)【說明】平臺擬上線“車位預(yù)約排隊”功能:當(dāng)車位被預(yù)約滿,用戶可加入排隊,一旦有人取消,系統(tǒng)自動將車位分配給隊首用戶,并給用戶推送5分鐘支付窗口,超時則順延。該功能預(yù)計峰值隊列長度10萬,平均取消率5%/分鐘?!締栴}1】(6分】請給出排隊系統(tǒng)整體架構(gòu)文字描述,要求包括接入層、隊列層、調(diào)度層、通知層,并指出各層關(guān)鍵技術(shù)選型?!敬鸢浮拷尤雽樱篈PI網(wǎng)關(guān)+SpringBoot,接收“加入排隊”請求,返回排隊號。隊列層:RedisStream,每個車位對應(yīng)一個streamkey,如“queue:space:123”,利用stream的單調(diào)遞增ID作為排隊號,保證全局有序。調(diào)度層:Quartz集群+分布式鎖,每10秒掃描“即將取消”的訂單,將釋放車位插入“待分配”stream;調(diào)度器消費“待分配”stream,使用XREADGROUP阻塞讀取隊首,生成待支付訂單。通知層:MQ(RocketMQ)異步發(fā)送APP推送與短信,消息延遲等級5分鐘,用于觸發(fā)“支付窗口超時”事件?!締栴}2】(5分】RedisStream消費采用消費者組,請給出XGROUPCREATE命令并說明為何使用消費者組而非簡單LPOP。【答案】命令:XGROUPCREATEqueue:space:123scheduler_group$MKSTREAM原因:1.消費者組支持ACK機制,若調(diào)度器崩潰,未ACK的消息會重新分配給存活節(jié)點,實現(xiàn)故障轉(zhuǎn)移。2.組內(nèi)可橫向擴展多個scheduler實例,均攤壓力,而LPOP無法多消費者安全并發(fā)?!締栴}3】(4分】系統(tǒng)需保證“同一用戶不能重復(fù)排隊”,請給出Lua腳本,實現(xiàn)原子性判斷與入隊?!敬鸢浮縧ocalexists=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并記錄,確保并發(fā)安全?!締栴}4】(5分】調(diào)度器分配成功后需創(chuàng)建訂單,但訂單服務(wù)可能超時,請給出Saga事務(wù)模式實現(xiàn)思路?!敬鸢浮?.調(diào)度器生成“預(yù)訂單”,狀態(tài)=CREATED,持有車位樂觀鎖version。2.發(fā)送“創(chuàng)建訂單”命令到訂單服務(wù),訂單服務(wù)成功后回復(fù)“訂單已創(chuàng)建”事件。3.調(diào)度器收到事件,更新預(yù)訂單狀態(tài)=CONFIRMED,并ACKRedisStream。4.若訂單服務(wù)返回失敗或超時,調(diào)度器發(fā)送“補償釋放車位”命令,將version回滾,并XDEL排隊消息,實現(xiàn)最終一致。5.所有步驟記錄到t_saga_log,支持人工干預(yù)重試。六、試題六(Web安全與性能)【說明】平臺上線后遭遇“惡意占坑”攻擊:攻擊者用大量賬號預(yù)約車位但不進場,導(dǎo)致真實用戶無法預(yù)約。攻擊特征:同一IP短時并發(fā)請求>100,UserAgent為腳本,預(yù)約后30分鐘內(nèi)取消率>90%?!締栴}1】(6分】請在WAF層給出兩條正則規(guī)則,分別攔截異常UserAgent與異常取消率請求,并說明誤傷風(fēng)險?!敬鸢浮恳?guī)則1:UserAgent匹配^Python|Gohttp|curl|Wget攔截腳本請求,誤傷:部分開發(fā)者使用官方SDK封裝底層libcurl,可能誤殺,需配合頻率閾值。規(guī)則2:URI路徑=/api/reserve且請求參數(shù)cancel_rate>0.9該規(guī)則需應(yīng)用層回傳cancel_rate,WAF無法直接計算,實際不可行;修正為:URI=/api/cancel,且同一個session_id5分鐘內(nèi)取消次數(shù)>5,則攔截。誤傷:用戶因填寫錯誤車牌反復(fù)取消,可能命中,需加入“會員等級”白名單?!締栴}2】(5分】后端采用令牌桶限流,請給出GuavaRateLimiter的SpringAOP環(huán)繞通知偽代碼,要求針對“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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論