当前位置: 首页 > news >正文

网站建设文化方案吉林网站建设平台

网站建设文化方案,吉林网站建设平台,百度站长提交,软件工程排名一、背景 会员系统是一种基础系统#xff0c;跟公司所有业务线的下单主流程密切相关。如果会员系统出故障#xff0c;会导致用户无法下单#xff0c;影响范围是全公司所有业务线。所以#xff0c;会员系统必须保证高性能、高可用#xff0c;提供稳定、高效的基础服务。 …一、背景 会员系统是一种基础系统跟公司所有业务线的下单主流程密切相关。如果会员系统出故障会导致用户无法下单影响范围是全公司所有业务线。所以会员系统必须保证高性能、高可用提供稳定、高效的基础服务。 随着同程和艺龙两家公司的合并越来越多的系统需要打通同程APP、艺龙APP、同程微信小程序、艺龙微信小程序等多平台会员体系。例如微信小程序的交叉营销用户买了一张火车票此时想给他发酒店红包这就需要查询该用户的统一会员关系。因为火车票用的是同程会员体系酒店用的是艺龙会员体系只有查到对应的艺龙会员卡号后才能将红包挂载到该会员账号。除了上述讲的交叉营销还有许多场景需要查询统一会员关系例如订单中心、会员等级、里程、红包、常旅、实名以及各类营销活动等等。所以会员系统的请求量越来越大并发量越来越高今年五一小长假的秒并发tps甚至超过2万多。在如此大流量的冲击下会员系统是如何做到高性能和高可用的呢这就是本文着重要讲述的内容。 二、ES高可用方案 1. ES双中心主备集群架构 同程和艺龙两家公司融合后全平台所有体系的会员总量是十多亿。在这么大的数据体量下业务线的查询维度也比较复杂。有的业务线基于手机号有的基于微信unionid也有的基于艺龙卡号等查询会员信息。这么大的数据量又有这么多的查询维度基于此我们选择ES用来存储统一会员关系。ES集群在整个会员系统架构中非常重要那么如何保证ES的高可用呢 首先我们知道ES集群本身就是保证高可用的如下图所示 当ES集群有一个节点宕机了会将其他节点对应的Replica Shard升级为Primary Shard继续提供服务。但即使是这样还远远不够。例如ES集群都部署在机房A现在机房A突然断电了怎么办例如服务器硬件故障ES集群大部分机器宕机了怎么办或者突然有个非常热门的抢购秒杀活动带来了一波非常大的流量直接把ES集群打死了怎么办面对这些情况让运维兄弟冲到机房去解决这个非常不现实因为会员系统直接影响全公司所有业务线的下单主流程故障恢复的时间必须非常短如果需要运维兄弟人工介入那这个时间就太长了是绝对不能容忍的。那ES的高可用如何做呢我们的方案是ES双中心主备集群架构。 我们有两个机房分别是机房A和机房B。我们把ES主集群部署在机房A把ES备集群部署在机房B。会员系统的读写都在ES主集群通过MQ将数据同步到ES备集群。此时如果ES主集群崩了通过统一配置将会员系统的读写切到机房B的ES备集群上这样即使ES主集群挂了也能在很短的时间内实现故障转移确保会员系统的稳定运行。最后等ES主集群故障恢复后打开开关将故障期间的数据同步到ES主集群等数据同步一致后再将会员系统的读写切到ES主集群。 2. ES流量隔离三集群架构 双中心ES主备集群做到这一步感觉应该没啥大问题了但去年的一次恐怖流量冲击让我们改变了想法。那是一个节假日某个业务上线了一个营销活动在用户的一次请求中循环10多次调用了会员系统导致会员系统的tps暴涨差点把ES集群打爆。这件事让我们后怕不已它让我们意识到一定要对调用方进行优先级分类实施更精细的隔离、熔断、降级、限流策略。首先我们梳理了所有调用方分出两大类请求类型。第一类是跟用户的下单主流程密切相关的请求这类请求非常重要应该高优先级保障。第二类是营销活动相关的这类请求有个特点他们的请求量很大tps很高但不影响下单主流程。基于此我们又构建了一个ES集群专门用来应对高tps的营销秒杀类请求这样就跟ES主集群隔离开来不会因为某个营销活动的流量冲击而影响用户的下单主流程。如下图所示 3. ES集群深度优化提升 讲完了ES的双中心主备集群高可用架构接下来我们深入讲解一下ES主集群的优化工作。有一段时间我们特别痛苦就是每到饭点ES集群就开始报警搞得每次吃饭都心慌慌的生怕ES集群一个扛不住就全公司炸锅了。那为什么一到饭点就报警呢因为流量比较大 导致ES线程数飙高cpu直往上窜查询耗时增加并传导给所有调用方导致更大范围的延时。那么如何解决这个问题呢通过深入ES集群我们发现了以下几个问题 ES负载不合理热点问题严重。ES主集群一共有几十个节点有的节点上部署的shard数偏多有的节点部署的shard数很少导致某些服务器的负载很高每到流量高峰期就经常预警。ES线程池的大小设置得太高导致cpu飙高。我们知道设置ES的threadpool一般将线程数设置为服务器的cpu核数即使ES的查询压力很大需要增加线程数那最好也不要超过“cpu core * 3 / 2 1”。如果设置的线程数过多会导致cpu在多个线程上下文之间频繁来回切换浪费大量cpu资源。shard分配的内存太大100g导致查询变慢。我们知道ES的索引要合理分配shard数要控制一个shard的内存大小在50g以内。如果一个shard分配的内存过大会导致查询变慢耗时增加严重拖累性能。string类型的字段设置了双字段既是text又是keyword导致存储容量增大了一倍。会员信息的查询不需要关联度打分直接根据keyword查询就行所以完全可以将text字段去掉这样就能节省很大一部分存储空间提升性能。ES查询使用filter不使用query。因为query会对搜索结果进行相关度算分比较耗cpu而会员信息的查询是不需要算分的这部分的性能损耗完全可以避免。节约ES算力将ES的搜索结果排序放在会员系统的jvm内存中进行。增加routing key。我们知道一次ES查询会将请求分发给所有shard等所有shard返回结果后再聚合数据最后将结果返回给调用方。如果我们事先已经知道数据分布在哪些shard上那么就可以减少大量不必要的请求提升查询性能。 经过以上优化成果非常显著ES集群的cpu大幅下降查询性能大幅提升。ES集群的cpu使用率 会员系统的接口耗时 三、会员Redis缓存方案 一直以来会员系统是不做缓存的原因主要有两个第一个前面讲的ES集群性能很好秒并发3万多99线耗时5毫秒左右已经足够应付各种棘手的场景。第二个有的业务对会员的绑定关系要求实时一致而会员是一个发展了10多年的老系统是一个由好多接口、好多系统组成的分布式系统。所以只要有一个接口没有考虑到位没有及时去更新缓存就会导致脏数据进而引发一系列的问题例如用户在APP上看不到微信订单、APP和微信的会员等级、里程等没合并、微信和APP无法交叉营销等等。那后来为什么又要做缓存呢是因为今年机票的盲盒活动它带来的瞬时并发太高了。虽然会员系统安然无恙但还是有点心有余悸稳妥起见最终还是决定实施缓存方案。 1. ES近一秒延时导致的Redis缓存数据不一致问题的解决方案 在做会员缓存方案的过程中遇到一个ES引发的问题该问题会导致缓存数据的不一致。我们知道ES操作数据是近实时的往ES新增一个Document此时立即去查是查不到的需要等待1秒后才能查询到。如下图所示 ES的近实时机制为什么会导致redis缓存数据不一致呢具体来讲假设一个用户注销了自己的APP账号此时需要更新ES删除APP账号和微信账号的绑定关系。而ES的数据更新是近实时的也就是说1秒后你才能查询到更新后的数据。而就在这1秒内有个请求来查询该用户的会员绑定关系它先到redis缓存中查发现没有然后到ES查查到了但查到的是更新前的旧数据。最后该请求把查询到的旧数据更新到redis缓存并返回。就这样1秒后ES中该用户的会员数据更新了但redis缓存的数据还是旧数据导致了redis缓存跟ES的数据不一致。如下图所示 面对该问题如何解决呢我们的思路是在更新ES数据时加一个2秒的redis分布式并发锁为了保证缓存数据的一致性接着再删除redis中该会员的缓存数据。如果此时有请求来查询数据先获取分布式锁发现该会员ID已经上锁了说明ES刚刚更新的数据尚未生效那么此时查询完数据后就不更新redis缓存了直接返回这样就避免了缓存数据的不一致问题。如下图所示 上述方案乍一看似乎没什么问题了但仔细分析还是有可能导致缓存数据的不一致。例如在更新请求加分布式锁之前恰好有一个查询请求获取分布式锁而此时是没有锁的所以它可以继续更新缓存。但就在他更新缓存之前线程block了此时更新请求来了加了分布式锁并删除了缓存。当更新请求完成操作后查询请求的线程活过来了此时它再执行更新缓存就把脏数据写到缓存中了。发现没有主要的问题症结就在于“删除缓存”和“更新缓存”发生了并发冲突只要将它们互斥就能解决问题。如下图所示 实施了缓存方案后经统计缓存命中率90%极大缓解了ES的压力会员系统整体性能得到了很大提升。 2. Redis双中心多集群架构 接下来我们看一下如何保障Redis集群的高可用。如下图所示 关于Redis集群的高可用我们采用了双中心多集群的模式。在机房A和机房B各部署一套Redis集群。更新缓存数据时双写只有两个机房的redis集群都写成功了才返回成功。查询缓存数据时机房内就近查询降低延时。这样即使机房A整体故障机房B还能提供完整的会员服务。 四、高可用会员主库方案 上述讲到全平台会员的绑定关系数据存在ES而会员的注册明细数据存在关系型数据库。最早会员使用的数据库是SqlServer直到有一天DBA找到我们说单台SqlServer数据库已经存储了十多亿的会员数据服务器已达到物理极限不能再扩展了。按照现在的增长趋势过不了多久整个SqlServer数据库就崩了。你想想那是一种什么样的灾难场景会员数据库崩了会员系统就崩了会员系统崩了全公司所有业务线就崩了。想想就不寒而栗酸爽无比为此我们立刻开启了迁移DB的工作。 1. MySql双中心Partition集群方案 经过调研我们选择了双中心分库分表的MySql集群方案如下图所示 会员一共有十多亿的数据我们把会员主库分了1000多个分片平分到每个分片大概百万的量级足够使用了。MySql集群采用1主3从的架构主库放在机房A从库放在机房B两个机房之间通过专线同步数据延迟在1毫秒内。会员系统通过DBRoute读写数据写数据都路由到master节点所在的机房A读数据都路由到本地机房就近访问减少网络延迟。这样采用双中心的MySql集群架构极大提高了可用性即使机房A整体都崩了还可以将机房B的Slave升级为Master继续提供服务。 双中心MySql集群搭建好后我们进行了压测测试下来秒并发能达到2万多平均耗时在10毫秒内性能达标。 2. 会员主库平滑迁移方案 接下来的工作就是把会员系统的底层存储从SqlServer切到MySql上这是个风险极高的工作主要有以下几个难点 会员系统是一刻都不能停机的要在不停机的情况下完成SqlServer到MySql的切换就像是在给高速行驶的汽车换轮子。会员系统是由很多个系统和接口组成的毕竟发展了10多年由于历史原因遗留了大量老接口逻辑错综复杂。这么多系统必须一个不落的全部梳理清楚DAL层代码必须重写而且不能出任何问题否则将是灾难性的。数据的迁移要做到无缝迁移不仅是存量10多亿数据的迁移实时产生的数据也要无缝同步到mysql。另外除了要保障数据同步的实时性还要保证数据的正确性以及SqlServer和MySql数据的一致性。 基于以上痛点我们设计了“全量同步、增量同步、实时流量灰度切换”的技术方案。 首先为了保证数据的无缝切换采用实时双写的方案。因为业务逻辑的复杂以及SqlServer和MySql的技术差异性在双写mysql的过程中不一定会写成功而一旦写失败就会导致SqlServer和MySql的数据不一致这是绝不允许的。所以我们采取的策略是在试运行期间主写SqlServer然后通过线程池异步写MySql如果写失败了重试三次如果依然失败则记日志然后人工排查原因解决后继续双写直到运行一段时间没有双写失败的情况。通过上述策略可以确保在绝大部分情况下双写操作的正确性和稳定性即使在试运行期间出现了SqlServer和MySql的数据不一致的情况也可以基于SqlServer再次全量构建出MySql的数据因为我们在设计双写策略时会确保SqlServer一定能写成功也就是说SqlServer中的数据是全量最完整、最正确的。如下图所示 讲完了双写接下来我们看一下“读数据”如何灰度。整体思路是通过A/B平台逐步灰度流量刚开始100%的流量读取SqlServer数据库然后逐步切流量读取MySql数据库先1%如果没有问题再逐步放流量最终100%的流量都走MySql数据库。在逐步灰度流量的过程中需要有验证机制只有验证没问题了才能进一步放大流量。那么这个验证机制如何实施呢方案是在一次查询请求里通过异步线程比较SqlServer和 MySql的查询结果是否一致如果不一致记日志再人工检查不一致的原因直到彻底解决不一致的问题后再逐步灰度流量。如下图所示 所以整体的实施流程如下 首先在一个夜黑风高的深夜流量最小的时候完成SqlServer到MySql数据库的全量数据同步。接着开启双写此时如果有用户注册就会实时双写到两个数据库。那么在全量同步和实时双写开启之间两个数据库还相差这段时间的数据所以需要再次增量同步把数据补充完整以防数据的不一致。剩下的时间就是各种日志监控看双写是否有问题看数据比对是否一致等等。这段时间是耗时最长的也是最容易发生问题的如果有的问题比较严重导致数据不一致了就需要从头再来再次基于SqlServer全量构建MySql数据库然后重新灰度流量直到最后100%的流量全部灰度到MySql此时就大功告成了下线灰度逻辑所有读写都切到MySql集群。 3. MySql和ES主备集群方案 做到这一步感觉会员主库应该没问题了可dal组件的一次严重故障改变了我们的想法。那次故障很恐怖公司很多应用连接不上数据库了创单量直线往下掉这让我们意识到即使数据库是好的但dal组件异常依然能让会员系统挂掉。所以我们再次异构了会员主库的数据源双写数据到ES如下所示 如果dal组件故障或MySql数据库挂了可以把读写切到ES等MySql恢复了再把数据同步到MySql最后把读写再切回到MySql数据库。如下图所示 五、异常会员关系治理 会员系统不仅仅要保证系统的稳定和高可用数据的精准和正确也同样重要。举个例子一个分布式并发故障导致一名用户的APP账户绑定了别人的微信小程序账户这将会带来非常恶劣的影响。首先一旦这两个账号绑定了那么这两个用户下的酒店、机票、火车票订单是互相可以看到的。你想想别人能看到你订的酒店订单你火不火会不会投诉除了能看到别人的订单你还能操作订单。例如一个用户在APP的订单中心看到了别人订的机票订单他觉得不是自己的订单就把订单取消了。这将会带来非常严重的客诉大家知道机票退订费用是挺高的这不仅影响了该用户的正常出行还导致了比较大的经济损失非常糟糕。 针对这些异常会员账号我们进行了详细的梳理通过非常复杂烧脑的逻辑识别出这些账号并对会员接口进行了深度优化治理在代码逻辑层堵住了相关漏洞完成了异常会员的治理工作。如下图所示 六、展望更精细化的流控和降级策略 任何一个系统都不能保证百分之一百不出问题所以我们要有面向失败的设计那就是更精细化的流控和降级策略。 1. 更精细化的流控策略 热点控制。针对黑产刷单的场景同一个会员id会有大量重复的请求形成热点账号当这些账号的访问超过设定阈值时实施限流策略。 基于调用账号的流控规则。这个策略主要是防止调用方的代码bug导致的大流量。例如调用方在一次用户请求中循环很多次来调用会员接口导致会员系统流量暴增很多倍。所以要针对每个调用账号设置流控规则当超过阈值时实施限流策略。 全局流控规则。我们会员系统能抗下tps 3万多的秒并发请求量如果此时有个很恐怖的流量打过来tps高达10万与其让这波流量把会员数据库、es全部打死还不如把超过会员系统承受范围之外的流量快速失败至少tps 3万内的会员请求能正常响应不会让整个会员系统全部崩溃。 2. 更精细化的降级策略 基于平均响应时间的降级。会员接口也有依赖其他接口当调用其他接口的平均响应时间超过阈值进入准降级状态。如果接下来 1s 内进入的请求它们的平均响应时间都持续超过阈值那么在接下的时间窗口内自动地熔断。 基于异常数和异常比例的降级。当会员接口依赖的其他接口发生异常如果1分钟内的异常数超过阈值或者每秒异常总数占通过量的比值超过阈值进入降级状态在接下的时间窗口之内自动熔断。 目前我们最大的痛点是会员调用账号的治理。公司内想要调用会员接口必须申请一个调用账号我们会记录该账号的使用场景并设置流控、降级策略的规则。但在实际使用的过程中申请了该账号的同事可能异动到其他部门了此时他可能也会调用会员系统为了省事他不会再次申请会员账号而是直接沿用以前的账号过来调用这导致我们无法判断一个会员账号的具体使用场景是什么也就无法实施更精细的流控和降级策略。所以接下来我们将会对所有调用账号进行一个个的梳理这是个非常庞大且繁琐的工作但无路如何硬着头皮也要做好。
文章转载自:
http://www.morning.snccl.cn.gov.cn.snccl.cn
http://www.morning.qqrqb.cn.gov.cn.qqrqb.cn
http://www.morning.nwynx.cn.gov.cn.nwynx.cn
http://www.morning.qysnd.cn.gov.cn.qysnd.cn
http://www.morning.ljsxg.cn.gov.cn.ljsxg.cn
http://www.morning.ndxrm.cn.gov.cn.ndxrm.cn
http://www.morning.mzbyl.cn.gov.cn.mzbyl.cn
http://www.morning.rrxnz.cn.gov.cn.rrxnz.cn
http://www.morning.ynjhk.cn.gov.cn.ynjhk.cn
http://www.morning.nbqwr.cn.gov.cn.nbqwr.cn
http://www.morning.kdbcx.cn.gov.cn.kdbcx.cn
http://www.morning.grwgw.cn.gov.cn.grwgw.cn
http://www.morning.skql.cn.gov.cn.skql.cn
http://www.morning.fwnqq.cn.gov.cn.fwnqq.cn
http://www.morning.mjxgs.cn.gov.cn.mjxgs.cn
http://www.morning.roymf.cn.gov.cn.roymf.cn
http://www.morning.tdgwg.cn.gov.cn.tdgwg.cn
http://www.morning.psdbf.cn.gov.cn.psdbf.cn
http://www.morning.kncrc.cn.gov.cn.kncrc.cn
http://www.morning.rjkfj.cn.gov.cn.rjkfj.cn
http://www.morning.tgtwy.cn.gov.cn.tgtwy.cn
http://www.morning.wjhdn.cn.gov.cn.wjhdn.cn
http://www.morning.bpp999.com.gov.cn.bpp999.com
http://www.morning.szzxqc.com.gov.cn.szzxqc.com
http://www.morning.nlysd.cn.gov.cn.nlysd.cn
http://www.morning.qwfq.cn.gov.cn.qwfq.cn
http://www.morning.krfpj.cn.gov.cn.krfpj.cn
http://www.morning.nlglm.cn.gov.cn.nlglm.cn
http://www.morning.wjhqd.cn.gov.cn.wjhqd.cn
http://www.morning.gctgc.cn.gov.cn.gctgc.cn
http://www.morning.ccpnz.cn.gov.cn.ccpnz.cn
http://www.morning.dyxlm.cn.gov.cn.dyxlm.cn
http://www.morning.wktbz.cn.gov.cn.wktbz.cn
http://www.morning.hdzty.cn.gov.cn.hdzty.cn
http://www.morning.xqwq.cn.gov.cn.xqwq.cn
http://www.morning.rmtmk.cn.gov.cn.rmtmk.cn
http://www.morning.yydeq.cn.gov.cn.yydeq.cn
http://www.morning.jnhhc.cn.gov.cn.jnhhc.cn
http://www.morning.ykxnp.cn.gov.cn.ykxnp.cn
http://www.morning.kqyyq.cn.gov.cn.kqyyq.cn
http://www.morning.rwjfs.cn.gov.cn.rwjfs.cn
http://www.morning.xpqsk.cn.gov.cn.xpqsk.cn
http://www.morning.nshhf.cn.gov.cn.nshhf.cn
http://www.morning.fhsgw.cn.gov.cn.fhsgw.cn
http://www.morning.nxzsd.cn.gov.cn.nxzsd.cn
http://www.morning.dskmq.cn.gov.cn.dskmq.cn
http://www.morning.ljzqb.cn.gov.cn.ljzqb.cn
http://www.morning.byshd.cn.gov.cn.byshd.cn
http://www.morning.qkzdc.cn.gov.cn.qkzdc.cn
http://www.morning.qqhfc.cn.gov.cn.qqhfc.cn
http://www.morning.ndlww.cn.gov.cn.ndlww.cn
http://www.morning.ymwny.cn.gov.cn.ymwny.cn
http://www.morning.kyctc.cn.gov.cn.kyctc.cn
http://www.morning.kdlzz.cn.gov.cn.kdlzz.cn
http://www.morning.snnkt.cn.gov.cn.snnkt.cn
http://www.morning.zzgtdz.cn.gov.cn.zzgtdz.cn
http://www.morning.mxxsq.cn.gov.cn.mxxsq.cn
http://www.morning.cyyhy.cn.gov.cn.cyyhy.cn
http://www.morning.qkcyk.cn.gov.cn.qkcyk.cn
http://www.morning.ysqb.cn.gov.cn.ysqb.cn
http://www.morning.yqrgq.cn.gov.cn.yqrgq.cn
http://www.morning.kwrzg.cn.gov.cn.kwrzg.cn
http://www.morning.wplbs.cn.gov.cn.wplbs.cn
http://www.morning.mcfjq.cn.gov.cn.mcfjq.cn
http://www.morning.hxxzp.cn.gov.cn.hxxzp.cn
http://www.morning.fphbz.cn.gov.cn.fphbz.cn
http://www.morning.spghj.cn.gov.cn.spghj.cn
http://www.morning.sqdjn.cn.gov.cn.sqdjn.cn
http://www.morning.qbfs.cn.gov.cn.qbfs.cn
http://www.morning.brqjs.cn.gov.cn.brqjs.cn
http://www.morning.rtpw.cn.gov.cn.rtpw.cn
http://www.morning.kjmcq.cn.gov.cn.kjmcq.cn
http://www.morning.mpbgy.cn.gov.cn.mpbgy.cn
http://www.morning.hrnrx.cn.gov.cn.hrnrx.cn
http://www.morning.fwcjy.cn.gov.cn.fwcjy.cn
http://www.morning.fpqq.cn.gov.cn.fpqq.cn
http://www.morning.xnlj.cn.gov.cn.xnlj.cn
http://www.morning.sqnrz.cn.gov.cn.sqnrz.cn
http://www.morning.nmhpq.cn.gov.cn.nmhpq.cn
http://www.morning.phzrq.cn.gov.cn.phzrq.cn
http://www.tj-hxxt.cn/news/259193.html

相关文章:

  • 陕西锦宇建设有限公司网站谷歌seo难吗
  • 怎么利用婚庆网站做营销省运会官方网站建设
  • 新手学seo免费seo网站
  • 新网站建设特色品牌名字大全
  • asp 通过ftp 网站搬家查询做导员的网站
  • 网上购物网站开发开题报告境外网站开发
  • 怎样建立自己网站难吗潍坊高新建设局网站
  • 公司网站建设流程图海南手机网站建设公司哪家好
  • 做网站费用是什么做响应式网站设计做图怎么搞
  • 衡水阿里巴巴网站建设flash网站模板下载
  • 卓越职业院校建设专题网站网页游戏排行榜前十名评论
  • 台州市建站公司西安关键词排名推广
  • 微友说是做网站维护让帮忙投注做律师网站推广优化哪家好
  • 商务网站开发作业住房和城乡建设部网站加装电梯
  • 河北响应式网站企业网站快速推广排名技巧
  • 企业网站的建设 摘要个人开发的软件能卖吗
  • 程序员自己做网站怎么赚钱南昌网站维护制作
  • 虹口专业网站建设杭州网站推广优化公司
  • 鼓楼网站开发网站代备案公司名称
  • 金融直播室网站建设wordpress 全文搜索
  • 网站会员注册系统男女做污视频网站
  • 雕刻机做外贸都是哪些网站wordpress主题包含
  • 国外虚拟币网站开发wordpress 艺术主题
  • 什么网站可以做高数搜索seo神器
  • 建设网站要服务器html商品页面代码
  • 网站开发教程 布局企业建设网站的主要作用
  • dede网站源码wordpress 域名分离
  • 网站建设及解析流程网站建设成本多少
  • 个人或主题网站建设网站建设与管理实践收获怎么写
  • 嘉兴市建设工程监理协会网站爱尔眼科医院集团