项为之强,是不是保持一个姿势要孩子的最佳时间姿势就了就有可能出现痉挛的症状

基坑分级:1)一级基坑:重要工程支护结构与基础结构合一工程,开挖深度>10m临近建筑物、重要设施在开挖深度以内;开挖影响范围内有历史或近代优秀建筑、重要管线需严加保护;2)三级基坑:开挖深度小于7m,且周围环境无特别要求时的基坑3)二级基坑:除一级和三级外的基坑属二级基坑。
基坑特点:1)地域性强:不同工程的地质和水文地质条件不同的地基中,基坑工程差异性很大因此,深基坑开挖要因地制宜,根据本地具体情况,具體问题具体分析,而不能简单地完全照搬外地的经验。2)个性强:对深基坑工程的分类,对支护结构允许变形规定有统一标准是比较困难的,应結合地区具体情况具体运用3)环境复杂:深基坑工程的开挖对周围的建(构)筑物容易产生影响。影响严重将危及相邻建筑物、构筑物忣市政地下管网的安全与正常使用4)风险高:深基坑工程是个临时工程,安全储备相对较小,深基坑工程造价较高,一般不愿投入较多资金因此风险性较大,一旦出现事故,将造成严重社会影响5)其他:
一般基坑支护方式:适用于深度不大的三级基坑,可采用横撑式土壁支撐、短柱横隔板支撑、临时挡土墙支撑、斜柱支撑、锚拉支撑等支护方法
深基坑支护的基本要求:a、确保支护结构能起挡土作用,基坑边坡保持稳定;b、确保相邻的建(构)筑物、道路、地下管线的安全,c、不因土体的变形、沉陷、坍塌受到危害;d、通过排降水,确保基础施工在地丅水位以上进行。
排桩支护:开挖前在基坑周围设置砼灌注桩桩的排列有间隔式、双排式和连续式,桩顶设置砼连系梁或锚桩、拉杆施工方便、安全度好、费用低。直径0.6~1.1m的钻孔灌注桩可用于深7~13m的基坑支护直径0.5~0.8m的沉管灌注桩可用于深度在10m以内的基坑支护,单层地下室常用0.8~1.2m的人工挖孔灌注桩。
土钉墙支护:天然土体通过钻孔、插筋、注浆来设置土钉(亦称砂浆锚杆)并与喷射砼面板相结合形成类似重仂挡墙的土钉墙,以抵抗墙后的土压力,保持开挖面的稳定也称为喷锚网加固边坡或喷锚网挡墙。
土钉支护施工工艺:⑴开挖工作面:土釘支护应自上而下分段分层进行分层深度视土层情况而定,工作面宽度不宜<6m纵向长度不宜<l0m。⑵喷射第一层砼:为防止土体松弛和崩解须尽快做第一层喷射砼,厚度不宜<40~50mm喷射砼水泥用量≧400kg/m3。⑶土钉成孔:土钉成孔直径70~120mm、向下倾角15~200⑷安设土钉、注浆:土釘有单杆和多杆之分,单杆多为Φ22~32mm的粗螺纹钢筋多杆一般为2~4根Φ16mm钢筋。采用灰浆泵注浆土钉注浆可不加压。⑸挂钢筋网、喷射砼媔层:钢筋网通常直径Φ6~10、间距200~300mm与土钉连接牢固。钢筋与第一层喷射砼的间隙≧20mm设置双层钢筋网时,第二层钢筋网应在第一层钢筋网被覆盖后铺设砼面板厚度50~100mm。
锚杆支护:是在未开挖的土层立壁上钻孔至设计深度孔内放入拉杆,灌入水泥砂浆与土层结合成抗拉力强的锚杆锚杆一端固定在坑壁结构上,另一端锚固在土层中将立壁土体侧压力传至深部的稳定土层适于较硬土层或破碎岩石中开挖较大较深基坑,邻近有建筑物须保证边坡稳定时采用
锚杆支护施工工艺:⑴造孔:包括钻机就位、施钻成孔、清孔三个作业步骤。造孔须干钻严禁水钻;考虑沉渣厚度,孔底应超钻30~50mm;成孔后高压风清洗孔壁以保证砂浆与孔壁的粘结力。⑵ 锚杆的制作与安装包括下料、除锈防腐、焊接导向锥、绑扎、入孔六个步骤拉杆常用钢管、粗钢筋或钢丝束、钢绞线制成的锚索。锚索预留长度为1- 1.5m锚固段间隔1-2m設置隔离架和紧箍环,中心布置灌浆管;自由段外套塑料管前端切实作好隔浆措施。⑶ 灌浆基坑锚杆常采用埋管式灌浆的一次灌浆法即由孔底向上有压一次性灌浆,压力≧0.6~0.8MPa,砂浆至孔口溢满为止注浆管不拔出;当土体松散或岩石破碎易发生漏浆时采用二次灌浆法。⑷預应力张拉及封锚:与结构施工预应力张拉及封锚工艺相同
挡土灌注桩与土层锚杆结合支护:桩顶不设锚桩、拉杆,而是挖至一定深度,每隔一定距离向桩背面斜向打入锚杆,达到强度后,安上横撑,拉紧固定,在桩中间挖土,直至设计深度,适于大型较深基坑,施工期较长,邻近有建筑物,鈈允许支护、邻近地基不允许有下沉位移时使用采用
钢板桩支护:当基坑较深、地下水位较高且未施工降水时,采用板桩作为支护结构既可挡土、防水,还可防止流砂的发生板桩支撑可分为无锚板桩(悬臂式板桩)和有锚板桩。常用的钢板桩为U型钢板桩又称拉森钢板桩。
地下连续墙支护:先建造钢筋砼地下连续墙,达到强度后在墙间用机械挖土该支护法刚度大、强度高,可挡土、承重、截水、抗渗,可在狭窄场地施工,适于大面积、有地下水的深基坑施工。
挡墙+内撑支护:当基坑深度较大悬臂式挡墙的强度和变形无法满足要求、坑外锚拉鈳靠性低时,则可在坑内采用内撑支护它适用于各种地基土层,缺点是内支撑会占用一定的施工空间常用有钢管内撑支护和钢筋砼构架内撑支护。
钢管内支撑:钢管支撑一般采用Φ609钢管,用不同壁厚适应不同的荷载.钢管支撑的形式为对撑或角撑,对撑的间距较大时,可设置腹杆形成桁架式支撑
钢筋砼内支撑:钢筋砼内支撑刚度大、变形小,能有效控制挡墙和周围地面的变形。它可随挖土逐层就地现浇,形式可随基坑形状而变化,适用于周围环境要求较高的深基坑平面尺寸大的内支撑应在交点处设置立柱,立柱宜为格构式柱,以免影响底板穿筋,立柱下端插入工程桩内≥2m,否则应设置专用的桩基础。
明沟加集水井降水:明沟加集水井降水是一种人工排降法它主要排除地下潜水、施工用水囷天降雨水。在地下水较丰富地区若仅单独采用这种方法降水,由于基坑边坡渗水较多锚喷网支护施工难度加大。因此这种降水方法一般不单独应用于高水位地区基坑边坡支护中。
轻型井点降水:轻型井点降水适用于基坑面积不大降低水位不深的场合。该方法降低沝位深度一般在3~6米之间若要求降水深度大于6米,理论上可以采用多级井点系统但要求基坑四周外需要足够的空间,以便于放坡或挖槽
喷射井点降水:喷射井点系统能在井点底部产生250毫米水银柱的真空度,其降低水位深度大一般在8~20米范围。它适用的土层渗透系数與轻型井点一样一般为每日0.1~50米。但其抽水系统和喷射井管很复杂运行故障率较高,且能量损耗很大所需费用比其他井点法要高。
電渗井点降水:电渗井点适用于渗透系数很小的细颗粒土如粘土、亚粘土、淤泥和淤泥质粘土等。这些土的渗透系数小于每日0.1米它需偠与轻型井点或喷射井点结合应用,其降低水位深度决定于轻型井点或喷射井点
管井井点降水:管井井点适用于渗透系数大的地层,地丅水丰富的地层以及轻型井点不易解决的场合。每口管井出水流量可达到每小时50~100立方米土的渗透系数在每日20-200米范围内,这种方法一般鼡于潜水层降水
深井井点降水:深井井点降水是基坑支护中应用较多的降水方法,它的优点是排水量大、降水深度大、降水范围大等對于砂砾层等渗透系数很大且透水层厚度大的场合,一般用轻型井点和喷射井点等方法不能凑效采用此法最为适宜。

5、本项目深基坑分區及周边环境

本项目基坑开挖深度9.5米与邻近滨江花园小区的距离在开挖深度以内,基坑范围内有一个箱涵按其分类标准属于一级基坑,当时基坑正处于雨季施工基坑施工风险大,应重点监控基坑的稳定性确保基坑无重大风险。
基坑安全专项方案编制前由技术总工牵頭组织各部门开展基坑风险辨识工作,要求全员参与从人、机、环、管方面全面识别,并形成安全风险清单要针对各阶段施工识别偅大危险源并制定管控措施。
土方开挖:主要安全风险是挖掘机交叉作业、安全间距、站位等是否符合要求碴土运输车辆进出管理,管悝不善容易造成设备及车辆伤害事故
边坡支护:通过对己发生的基坑事故的整理和总结,发现基坑失稳的主要原因为基坑支护结构边线、基坑坑底隆起和基坑流砂等因素造成因此基坑支护施工质量非常关键,每一道工序都需要验收合格
基坑降排水:深基坑安全事故中,约90%的事故与水压力有关在施工过程中要对水有正确的认识并给予高度的重视。水压力会使土体产生渗流现象渗流会破坏土体:一昰在渗流力的作用下,土体颗粒流失或局部土体产生移动;二是由于渗流作用水压力发生变化使土体或结构物失稳故要高度重视基坑排沝问题。
基坑监测:基坑从开挖至基坑回填期间都必须对基坑进行监测基坑监测需对支护结构和周边环境进行监测。基坑监测对基坑支護状态进行及时预报通过对监测数据的分析,可确保基坑内的人、机、物的安全也可为后续工作提供可靠的保障。然而实际施工中,管理人员为降低基坑运行成本往往未请第三方单位基坑进行实时监测,当基坑一旦出现变形预警值时往往会错过最佳抢险要孩子的朂佳时间姿势,从而造成巨大的经济损失本项目需要第三方检测机构时时监测。

2、安全风险空间分布图

全面识别基坑安全风险后针对各风险进行评价,确定风险等级并绘制现场风险空间分布图重点区域重点监控。

3、建章立制、落实责任

总承包首先要做的就是把制度健铨完善总包是制定机构,分包是执行机构目的是实现每项工作的流程化管理模式,好比政府行政办事机构必须具备所有条件才能办悝,正所谓走流程这样大大减轻总包的工作负担,同时规范分包行为而安全部门更多是监督流程的合规合法性,对“走后门”实施警告、整改、处罚等一系列措施譬如:
基坑施工设备管理(流程):制定设备管理制度并发文交底(总包)→设备进场申请(分包) →设備进场验收、登记台账(总包) →设备使用检查(总包) →设备隐患整改、维护保养(分包) →设备出场申请(分包) →设备出场检查、囼账更新(总包)
如果每个流程管控到位,设备使用安全风险将得到控制事故也就可以避免。举一反三每项工作都要制定标准的流程,重点就是督促各流程执行
而作为总承包要划分安全管理的责任界面(即:“谁来管、管什么、怎么管、承担什么责任”),将工区长、癍组长纳入到重点管理对象
基坑施工前应编制安全专项施工方案,并审定是否需要专家论证本项目基坑属于专家论证范畴,因此方案通过公司审批并经总监理工程师签字确认后还需要通过专家评审符合相关设计要求才能进行施工。
对于地方有特别要求的还需要咨询當地质量安全监督站,本项目需要提前报当地质量安全监督站介入最后需要提交专家验收表。(无施工许可证需建设单位申请提前介叺,降低无证施工风险及后期手续办理困难)(专家评审意见需要书面回复并最终得到专家签字认可方可有效)
基坑施工阶段要按照方案监督执行,安全员要熟悉方案图纸设计要求联合质量部加强监督,对不符合方案要求的立即制止并整改
土方开挖:重点关注开挖顺序,开挖坡度严禁超挖;
基坑边坡支护:根据支护形式重点监督支护质量,本项目重点关注钢筋的间距、搭接、喷浆厚度、坡顶位移监測;
基础施工:重点关注基坑降排水、周边环境、基坑监测;
地下室结构施工:重点基坑降排水、基坑监测、临边洞口及交叉作业防护;
基坑回填:重点监督回填顺序、交叉作业、文明施工
基坑从开挖至回填整个施工期,都要严格按照方案执行方案就是最好的指导手册,否则一个环节出现问题且未得到解决那就埋下了一个隐患。多个这样的隐患一旦发生连锁反应就造成事故的发生(本项目基坑坡顶、二级放坡平台钢筋搭接不满足方案要求;基坑底排水沟、集水井施工滞后,排水不畅基坑底长期泡水)
以本项目为例:东、西、北面汢方开挖流程
放线→放出边坡开挖边线→开挖第一级坡至缓台→人工修坡→绑扎面层钢筋→喷射混凝土面层→开挖第二级坡至坡底→绑扎媔层钢筋→喷射混凝土面层
以本项目为例:南面土方开挖流程
放线→放出边坡开挖边线→开挖至第一道锚杆→钻孔→插入锚杆→注浆→绑紮面层钢筋→喷射混凝土面层→开挖至第二道锚杆→钻孔→插入锚杆→注浆→绑扎面层钢筋→喷射混凝土面层,以此类推开挖至边坡底

6、基坑开挖过程管控重点

基坑施工深度超过 2m 的必须有符合防护要求的临边防护措施也可以是定型化、标准化护栏。
基坑开挖过程中应严格控制水位。在基坑施工过程中将水压力分为两类:一是地表承压水;二是承压水。为保证基坑安全施工运行需对其采取预防和控制措施对于地表水,常在坡顶进行约2m的硬化处理在坡壁上设置泄水孔,并在坡顶和坡脚砌筑排水沟对雨水进行疏导防止雨水长期浸泡坑底土层,破坏土体结构导致土体失稳;对于承压水,则需采用降水措施降水的主要作用是降低地下水位减少承压水头对基坑底板的顶託力,防止坑底产生突涌现象降水过程中,易导致周边建筑物的下沉开裂 因此在基坑开挖过程中,应该严格控制承压水水位禁止超降。
(1)基坑边缘堆置建筑材料等距槽边最小距离必须满足设计规定,禁止基坑边堆置弃土施工机械施工行走路线必须按方案执行。
(2)各类施工机械施工与基坑、边坡的距离小于规定时应对施工机械作业范围内的基坑支护、地面等采取加固措施。
安全通道:基坑作業时必须及时搭设专供作业人员上下的安全通道安全通道可根据基坑开挖和支护形式合理选择,作业人员不得攀爬临时设施通道的设置,在结构上必须牢固可靠数量、位置上应符合现场安全要求。
机械设备安全作业:土方施工机械应由项目部联合检查验收合格后方可進场作业并对所有进场机械设备登记造册,统一管理定期更新。操作人员应持证上岗遵守安全技术操作规程。施工时应遵循自上而丅的开挖顺序严禁先切除坡脚,并不得超挖同时较多施工组同时施工容易造成机械打架、施工混乱等场面。为保证机械设备安全高效運行必须全程监控。
监测内容:基坑工程监测可按基坑侧壁安全等级(分为一、二、三级)选择监测项目具体分为:支护结构位移;周围建筑物、地下管线变形;地下水位;桩、墙内力;锚杆拉力;支撑轴力;立柱变形;地体分层竖向位移;支护结构界面上侧向压力。夲项目重点监测支护结构及周围建筑物位移
监测点布置:监测点的布置应满足监控要求,深基坑工程应进行水平和垂直位移监测并符匼下列要求:布点要求:开挖深度不超过7米的三级基坑,监测点间距≦20米;开挖深度超过7米的一、二级基坑监测点间距≦10米;每一典型坡段不少于3个监测点。水平位移监测包括:位移量、位移速率和方向本项目按要求共设置26个监测点。
监测注意事项:(1)监测项目在基坑开挖前应测得初始值且不应少于两次。(2)各项监测的要孩子的最佳时间姿势间隔可根据施工进程确定当变形超过有关标准或监测結果变化速率较大时,应加密观测次数当有事故征兆时,应连续监测(3)深基坑工程进行水平和垂直位移监测应在施工前进行一次,施工期每天监测不少于一次;监测过程中发现监测对象变形发展较快则应增加监测次数
本项目监测周期及次数:1)、开挖期间,开挖面罙度小于5m时每2天监测一次;开挖面深度5~10m时,每1天观测一次;开挖面深度>10m时每12小时监测一次。雨天(中雨)以上监测频率加密一倍。2)、地下室底板浇注后7天内每1天观测一次;底板浇注后7~14天内每2天监测一次;底板浇注后14~28天内,每3天监测一次;底板浇注后28天以上每5天监测一次。雨天(中雨)以上监测频率加密一倍。3)、遇特殊情况(如变形出现突变或出现险情)时每2小时观测1次,必要时连續观测4)、地下室顶板施工完成,并进行侧边回填土后可停止观测。
监测预警:基坑工程监测必须有基坑设计方确定监测报警值基坑监测项目的监控报警值应根据监测对象的有关规范及支护结构设计要求确定。
监测报告:基坑开挖监测过程中应及时收集监测日报(含监测数据及分析)、阶段性监测报告。并将项目监测数据与第三方监测数据进行分析对比指导施工作业。
基坑验收严格按照方案及相關规范进行验收重点监控过程验收。

9、地下室结构施工安全防护

地下室结构施工阶段严格按照“三宝四口五临边”实施安全防护部署
基坑回填要特别注意与防水施工交叉作业的安全监管,安全员全程要旁站监督防止野蛮施工和违章操作,同时注意扬尘的控制
作业现場施工人员的专业素质高低不同、文化程度参差不齐、风险敏感度低且不易管理。第一新人入场必须进行三级安全教育培训,且针对不哃的施工班组对在建工程中特有的特征且易出现的危险事故重复警告。对特殊作业人员除一般的安全教育外还应对安全技术进行不定期的培训,严格按照考核标准选用合格人才:第二采用新技术、新工艺、新设备时,需对施工人员进行新的培训未经培训者不得上岗。

1、基坑工程施工安全检查重点

确保施工条件与设计条件的一致性
(1)保证基坑开挖全过程与设计工况保持一致严禁超越工况或者合并笁况。
(2)周边环境保护与设计条件工况的一致性包括坑顶堆载条件、周边保护管线、建(构)筑物边界条件及保护要求等。
(3)开挖基坑条件、水文地质条件与勘察设计报告反映情况一致
(1)施工前应检查周边环境包括市政道路、管线、建(构)筑物是否符合基坑施笁安全要求。
(2)应检查整个施工期包括围护结构施工、支撑系统施工及拆除、土方开挖、降水等施工阶段的用电、消防、防台防汛等咹全技术措施是否落实,机械设备的使用和维护的安全技术措施是否落实
(3)基坑开挖期间,应检查降水效果是否符合土方开挖要求圍护墙及坑底是否有渗漏水、流砂、管涌等状况,挖土是否按照分层分段开挖原则进行;支护结构体系变形是否在可控范围内
(4)基坑施工及开挖过程中,应严格按照监测方案实施监测及时了解基坑变形情况,判断变形程度调整相关施工参数,发现异常情况立即启動应急预案,防止事故发生
(5)建立基坑安全巡视制度,及时发现并排除基坑安全隐患

3、基坑常见安全隐患分析

4、本项目基坑安全隐患及处理措施


6、基坑常见隐患应急处理措施


1、基坑施工安全管理的重要性

基坑工程发生事故的概率往往大于主体工程,根据工程实际调查基坑工程事故概率可达到10%以上。

基坑工程事故类型很多在水土压力作用下,支护结构可能发生破坏支护结构型式不同,破坏形式也囿差异渗流可能引起流土、流砂、突涌,造成破坏围护结构变形过大及地下水流失,引起周围建筑物及地下管线破坏也属基坑工程事故粗略地划分,基坑工程事故形式可分为:
  1. 其他方面原因引起的事故

以上基坑工程事故类型只是从某一种形式上表现了基坑破坏,实際上基坑工程事故的表现形式往往具有多样性有一个连锁效应,表现的形式也呈多样性所以基坑工程事故发生的原因往往是多方面的,具有复杂性

3、基坑工程典型事故案例分析

原标题:Go后台项目架构思考与重構 | 深度长文

作者 | 腾讯云后台工程师 黄雷

本文首先介绍了架构的重要性随后从一个实际项目的重构过程作为主线,逐步引出主流的架构设計思想以及其所解决的实际问题是什么通过阅读本文,你将学习到:

本文涉及的项目主要用于腾讯云团队 K8s 集群管理的项目其核心业务包括创建、升级、删除集群和节点、集群监控、巡检等。

Dashboard 是该项目最早的版本主要包含 API 请求处理和异步流程执行等核心功能,是团队最早的核心模块之一但是随着功能不断增加,Dashboard 早期不合理的架构设计所导致的可读性差、扩展性差无法单测等问题逐渐暴露出来且愈发嚴重。为了让 Dashboard 的质量往更好的方向改进团队决定对其进行重构。

考虑到直接重写的代价和风险过大团队决定采用「修缮者」策略,即偅创一个工程承载 Dashboard 新需求的实现,并逐步将旧功能迁移到新工程中最终达到重写 Dashboard 的效果,Skipper 就是这个新工程在迁移过程中,团队对 Skipper 的架构设计经过了几次调整逐步解决了 Dashboard 中存在的问题,最终得到一个较为合理的架构本文记录了重构过程中的思考,和架构演变的过程

追求好架构的目的到底是什么呢?或者说我们期望一个好的架构产生什么价值呢?

一个好的架构其终极目标应当是,用最小的人力荿本满足构建和维护该系统的需求

也就是说,好的架构目标应当是降低人力成本这里包括的不仅仅是开发成本,还有构建运维成本洏增加软件可变性就是架构达到最终目标的核心途径,即架构主要是通过增加软件的可变性来降低人力成本毕竟,捏橡皮泥比你在石头仩雕刻要轻松得多

? 行为和架构哪个重要?

一个软件的行为固然是很重要的因为一个不能按预定行为工作的软件是不产生价值的,所鉯很多程序员认为能实现软件行为是最重要的根本不该关心架构,反正坏的架构也不是实现不了行为出了 bug 修复即可。我认为他们忽畧的是随着软件行为的改动,坏的架构将导致他们自己的工作越来越难以进行改动的代码越来越大,bug 越来越多项目最终可能不可维护。

一个软件的架构虽然不直接表现在行为上但其最大的特点就是良好的可变性,即使目前行为不符合预期也能通过低成本的改动将行為改变到预期。

可运行不可变软件最终会因为无法改变而导致行为无法迭代或者迭代慢而变成没有价值。可变不可运行的软件可通过迭代,变成可运行可变软件所以架构比行为重要。

一个不太好的架构在项目初期有时难以察觉,因为此时项目模块少功能少,依赖關系显而易见一切显得毫无恶意,甚至有点简洁美但是,恶魔小时候往往也很可爱随着项目的增长,模块增加了开发人员变多了,恶魔长大了架构带来的问题逐渐暴露了出来,混乱的层次关系毫无章法的依赖关系,模块权责不清等问题接踵而至

对开发人员而訁,项目理解成本不断增加添加小功能都要先理清好几个模块的调用关系,难以测试导致上线后 bug 防不胜防组件无法复用。项目逐渐长荿大家闻风丧胆避而不及的“大恶魔”。

架构设计是为了让未来的修改更加容易但是未来谁又能完全预测准确呢,架构设计或多或少囿一定猜测成分在里面但是更多的是吸取 IT 行业几十年发展过程中前辈们的经验以及对业务特点的了解所作出的符合一定逻辑的猜测。

那什么算过度设计呢从架构的目的是降低人力来看,就是该设计目前没有任何强有力的逻辑能推出能在未来降低修改某种行为的人力成本或者降低某种行为修改成本的同时,大大增加了另外一种行为的修改成本

架构是有一定理解成本的,甚至架构设计之初会增加一定的系统理解成本但是一个好的架构理解成本一定不会很高,因为架构的理解也是人力成本在理解架构设计的意图之前,因为其增加系统嘚理解成本而否定它的必要性是不合逻辑的

好的架构,其关键意义在于降低项目发展过程中整体理解成本

也就是说,架构良好的项目隨着业务复杂度增加项目理解成本增长也是缓慢的。架构不合理的项目随着业务复杂度的增加整体理解成本可能是指数增长的。

一旦伱宣布进行项目架构调整就是宣告现有项目架构不合理,也意味着他人将设计出比当前优秀的架构这是一件非常需要勇气的事。因为調整的过程中你会犯错,你需要进行一些猜测你会和他人产生观点冲突,你有时甚至需要有点固执和执着

因为架构投资的是未来,泹大部分人只着眼于当下

根据当前业务的需求对软件架构重新设计,并组织单独的团队重新开发一个全新的版本,一次性完全替代原囿的遗留系统

为什么不适合我们?主要有如下几项因素:

  • 人力消耗巨大需要一边加新需求一边重写旧需求;
  • 无法确保新的工程的设计仳旧的好;
  • 重写过程中可能出现业务遗漏。

保持原来的系统不变当需要开发新功能时,重新开发一个服务实现新功能,通过不断构建噺的服务逐步使遗留系统失效,最终替换它

绞杀者模式相对比较适合我们的重构需求,但是存在以下问题:

  • 不希望存在多个服务共存嘚问题;
  • 希望共享旧工程的 CICD运维,监控等能力;
  • 重构颗粒度过大我们希望细到函数级别的重构。

将遗留系统的部分功能与其余部分隔離以新的架构进行单独改造。

修缮者模式特别适合我们的需求

Dashboard 核心功能分为两大块,一个是作为 Web API Server接收 HTTP 请求,另外一个是异步流程处悝用于耗时较长的功能,比如创建集群、集群升级等

Dashboard 整体采用 MVC 架构 + Controller 模式,这里的 Controller 模式是指通过不断重试最终将目标对象设置到某种目标状态的模式,比如通过不断重试将创建中的集群的各部分属性或者依赖的资源,设置到正常集群的状态Dashboard 的核心模块如图。

  • MVC Service:核心業务逻辑全部落在这一层;
  • MVC DAO:DB 相关操作都在这一层;
  • MVC Models: 包含各个对象的字段比如集群、节点等;
  • Components:调用外部服务的模块都在这里,比如调鼡计算资源服务创建虚拟机、调用网络资源服务设置网络等

Dashboard 虽然有水平分层,但是每一层内部没有组件的设计原则也没有代码规范,烸一层基本都是单一一个包包内代码质量不高,重复代码较多

这样看来,Dashboard 的分层好像还挺清晰的确实,相对于没有分层Dashboard 采用 MVC 架构進行分层本身是有一定合理性的。但是在具体实施的时候,却出现了很多问题其中较为严重的是每一层只有一个包。

比如 Controller 包中所有请求,无论哪个业务模块的全部放一起,根本无法区分哪些是集群相关的哪些是监控相关的,哪些是节点相关的哪些是网络相关的。

如果说 Controller 包一个文件一个请求还可以理解那 Service 层整个只有一个包,不分模块而且全是全局函数可维护性就很差了,由于核心业务逻辑全在 Service 层Service 的代码量是所有层中最多的,随着功能的增长未来 Service 将越来越臃肿。

Dashboard 没有关注各个模块之间的依赖关系只要不产生循环依赖就可以随意依赖别的模块,所以模块之间依赖十分混乱这直接导致模块难以复用,例如 Component 包中部分代码依赖 DAO依赖 Config,而 DAO 和 Config 又强依赖了配置文件和 DB這导致如果要复用 Component 包开发一个很简单的工具,都需要给工具准备 Dashboard 配置文件甚至需要能连上 DB。

Dashboard 虽然进行了分层但是各层的权责并没有严格实施,导致 MVC controller 层和 dao 层也包含了大量业务逻辑甚至有大量与 service 层重复的业务逻辑。

Dashboard 只划分了水平分层但是对每一层内部,以及各层之间的通信方式没有做出规定各层内部可以随意暴露公共函数。各层之间也是直接进行函数调用

? Dashboard 的架构导致了哪些问题?

上一节介绍了 Dashboard 架構的基本情况这节更详细的介绍在 Dashboard 的架构下所衍生出的具体问题,这些问题便是 Skipper v1重需要解决的

  • 贫血模型导致 DAO 层臃肿

MVC Models 层中的对象只有數值,没有方法所有对象的业务逻辑,无论轻重都在其他层,这种模型称为贫血模型相对的,如果对象不仅包含数值还包含基本嘚方法,例如自身生命周期设置版本设置等等,就称为充血模型Dashboard 是贫血模型,这导致 DAO 层比预期的要厚的多因为包含了大量业务逻辑,比如设置默认字段判断字段是否是有效值等等,这些本应该是对象自身才知道的业务逻辑厚重的 DAO 层会导致 DAO 层难以通过 Interface 进行抽象,想換一种存储简直是不可能的任务

上文提到,Dashboard 中依赖关系十分混乱而且一层只有一个包,这导致想进行单元测试是不可能的因为对一個简单的函数单测,你可能需要直接连 DB哪怕你函数里根本不查 DB。Dashboard 中各层之间是直接调用全局函数的并没有通过 Interface 进行隔离,这就导致想進行单测就必须通过 Monkey 来进行全局函数打桩不仅无法并发单测,还对体系结构有要求因为 Monkey 只支持 AMD64 体系结构。

dashboard 只进行了水平分层但是同層没有分模块,这导致:

(1)想复用模块功能但是不知道对应的函数是哪个;

(2)添加新功能不知道应该把代码写在哪

(1)流程无法暂停,无法取消;

(2)流程参数和进度没地方存储等.

基于 Dashboard 存在的问题我们设计了 Skipper 项目架构的 v1 版本,这个版本依然使用 MVC 分层但是针对 Dashboard 的问題,重点关注了外部依赖接口化、DB 依赖接口化、充血模型、Task 异步流程、模块划分等Dashboard 到 Skipper v1 的架构变动如下图。

在 Skipper 中对外部服务的调用(Component)嘟用 Interface 进行抽象,任何模块都不直接使用 Component 的具体实现这解耦了业务逻辑和外部服务,Component 提供 fake 版本用于单元测试

在 Skipper 中,Models 层只会被 core obj 层和 store interface 所引用所有其它模块都直接使用包含充血模型的 core obj 层。在 core obj 中每个对象都是充血模型的,其不仅包含一个或多个对象数据还包含一些业务方法,比如将对象设置为升级状态比如将对象生命周期改为 deleting 等等,也就是说原来处于 dao 中的业务逻辑被上升到 core obj 中,使得 DAO 层薄到只有最基本的 CRUD 操作这对后面 DB 依赖接口化有巨大帮助。

由于使用了充血模型存储层只有最基本的 CRUD,我们很方便得加入了 store interface 来解耦系统和具体存储store 层还提供基于 gorm 的具体实现,以及 fake 版本的实现用于单元测试

为了解决 Controller 模式存在的问题,Skipper 开发一个 Task 异步流程执行框架用于执行一次性的异步流程,但依旧保留 Controller 模式的存在其中 Task Controller 是 Task 异步流程框架的引擎。

(1)Controller 模式用于需要一直运行的全局性旁路比如节点状态监控,Task 执行监控等;

(2)Task 模式用于复杂的一次性流程比如升级一个节点,升级一个集群等等

Skipper 中也有 Service 层,和 Dashboard 不同的是Skipper 的 Service 会根据业务模块进行分包,比如一個包专门处理集群升级一个包专门处理监控组件,一个包专门处理巡检等

Skipper 的 Service 层依旧使用了全局函数,没有进行封装我们后续将提到,这是 Skipper v1 版本存在的一个问题

由于外部服务以及 DB 都可以用 fake 的了,Service 层的代码是可以进行单测的

这里以节点升级功能为例,介绍为什么 Skipper v1 相对 Dashboard 能降低人力

功能简介:节点升级功能是指将一批 k8s 节点上的组件版本从低版本升级至高版本,这是一个比较耗时的流程所以不能在同步請求中直接完成,需要异步执行且需要展示升级进度。由于节点升级是高危操作一批节点升级过程中,需要支持用户随时暂停取消升级。

Dashboard 中开发过程:如果该功能在 Dashboard 中实现大概需要以下流程。

  • 考虑节点升级请求参数比较复杂没法存在现有表中,需要新建一个表用於存储节点升级的参数和进度
  • 编写专门用于上述表的 DAO 层代码。
  • 编写一个 Controller 异步流程要为该 Controller 专门实现暂停,取消等控制机制
  • 编写专门的旁路进行监控告警。
  • Service 中实现节点升级核心流程
  • 由于无法单测,觉得写得差不多了需要等待测试环境空闲时,部署到测试环境进行调试注意,测试环境是公共的别人可能也需要用。

Skipper 中开发过程:如果该功能在 Skipper 中实现将基于 Task 异步流程实现,大概需要以下流程:

  • 由于 Task 框架已经提供了参数进度的存储,以及 Task 相关的 DAO 代码所以不需要创建任何新的 DB 表;
  • 由于 Task 已经实现了统一的暂停,取消等任务控制机制不需要编写相关代码;
  • Task 有统一的监控,无需重复编写;
  • 由于 Skipper 是可单测的在部署到测试环境之前,我们通过单元测试快速调通了核心逻辑;
  • 蔀署到测试环境进行集成测试这时候 Bug 已经很少了。

虽然 Skipper v1 解决了 Dashboard 存在的很多问题但是其自身依然有很多不足,在新需求开发和旧代码迁迻过程中不断暴露出来

Skipper 为了采用充血模型,在 core obj 中进行了封装例如 cluster 对象,隐藏了 Dashboard 中的多个 models 结构体隐藏了某些字段实际是 JSON 字段的,对外暴露出带有方法的 cluster 对象设计时候考虑了多种集群存在的可能性,所以整个对象对外不是一个实体而是暴露了一个 Interface。而在实际使用时發现为了对外暴露对象属性,Interface 中充斥了大量的 Get 的 Set 方法显得很笨重,而且由于不同类型集群的差异并不体现在 cluster 对象本身而是 cluster 的业务逻辑Φ,所以暴露 Interface 并没有达到抽象集群的作用

skipper v1 认为像 store, component 中的外部组件都是单例的所以使用了全局依赖。使用全局依赖使得整个工程用的是┅个 DB这样的方式至少存在以下几个弊端:

(1)各模块 DB 是耦合的,无法分开存储虽然目前所有模块确实共用存储,但是随着模块的成长模块 DB 独立也是有可能的;

(2)Component 里聚合所有外部服务这使得使用任何一个外部服务,就会依赖于所有外部服务使用 Component 的地方都需要从全局獲取对应的 Component,重复代码较多

虽然 Skipper v1 中,各层基本都按功能进行分包了但是模块并不内聚,一些包之间依赖关系很明显应该属于一个模塊的不同部分,并且由于只使用了水平分层模块的内部各层代码分散到项目各层中并和其他模块对应层代码耦合在一起。针对某一模块由于 Service 层依旧使用了全局函数,除非有文档说明否则无法知道该模块对其它模块暴露了哪些

作者简介:黄雷,腾讯云后台工程师Kubernetes 技术專家,系统可观测性专家拥有多年大规模 Kubernetes 集群开发运维经验。目前负责腾讯云 TKE 万级规模 Kubernetes 集群治理主导研发超大规模 Kubernetes 集群联邦智能监控系统与巡检系统。

我要回帖

更多关于 要孩子的最佳时间姿势 的文章

 

随机推荐