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

网站建设知识问答专业的河南网站建设价格低

网站建设知识问答,专业的河南网站建设价格低,品牌网站建设大概费用,上海公司注销的流程及需提供的材料2023美团外卖从2013年9月成交第一单以来#xff0c;已走过了三个年头。期间#xff0c;业务飞速发展#xff0c;美团外卖由日均几单发展为日均500万单#xff08;9月11日已突破600万#xff09;的大型O2O互联网外卖服务平台。平台支持的品类也由最初外卖单品拓展为全品类。 随… 美团外卖从2013年9月成交第一单以来已走过了三个年头。期间业务飞速发展美团外卖由日均几单发展为日均500万单9月11日已突破600万的大型O2O互联网外卖服务平台。平台支持的品类也由最初外卖单品拓展为全品类。 随着订单量的增长、业务复杂度的提升外卖订单系统也在不断演变进化从早期一个订单业务模块到现在分布式可扩展的高性能、高可用、高稳定订单系统。整个发展过程中订单系统经历了几个明显的阶段下面本篇文章将为大家介绍一下订单系统的演进过程重点关注各阶段的业务特征、挑战及应对之道。 为方便大家更好地了解整个演进过程我们首先看一下外卖业务。 外卖订单业务是一个需要即时送的业务对实时性要求很高。从用户订餐到最终送达用户一般在1小时内。如果最终送达用户时间变长会带来槽糕的用户体验。在1小时内订单会快速经过多个阶段直到最终送达用户。各个阶段需要紧密配合确保订单顺利完成。 下图是一个用户视角的订单流程图。 从普通用户的角度来看一个外卖订单从下单后会经历支付、商家接单、配送、用户收货、售后及订单完成多个阶段。以技术的视角来分解的话每个阶段依赖于多个子服务来共同完成比如下单会依赖于购物车、订单预览、确认订单服务这些子服务又会依赖于底层基础系统来完成其功能。 外卖业务另一个重要特征是一天内订单量会规律变化订单会集中在中午、晚上两个“饭点”附近而其它时间的订单量较少。这样饭点附近系统压力会相对较大。 下图是一天内的外卖订单量分布图 总结而言外卖业务具有如下特征 流程较长且实时性要求高订单量高且集中。 下面将按时间脉络为大家讲解订单系统经历的各个阶段、各阶段业务特征、挑战以及应对之道。 外卖业务发展早期第一目标是要能够快速验证业务的可行性。技术上我们需要保证架构足够灵活、快速迭代从而满足业务快速试错的需求。 在这个阶段我们将订单相关功能组织成模块与其它模块门店模块等一起形成公用jar包然后各个系统通过引入jar包来使用订单功能。 早期系统的整体架构图如下所示 早期外卖整体架构简单、灵活公共业务逻辑通过jar包实现后集成到各端应用应用开发部署相对简单。比较适合业务早期逻辑简单、业务量较小、需要快速迭代的情况。但是随着业务逻辑的复杂、业务量的增长单应用架构的弊端逐步暴露出来。系统复杂后大家共用一个大项目进行开发部署协调的成本变高业务之间相互影响的问题也逐渐增多。 早期业务处于不断试错、快速变化、快速迭代阶段通过上述架构我们能紧跟业务快速满足业务需求。随着业务的发展以及业务的逐步成熟我们对系统进行逐步升级从而更好地支持业务。 2014年4月外卖订单量达到了10万单/日而且订单量还在持续增长。这时候业务大框架基本成型业务在大框架基础上快速迭代。大家共用一个大项目进行开发部署相互影响协调成本变高多个业务部署于同一VM相互影响的情况也在增多。 为解决开发、部署、运行时相互影响的问题。我们将订单系统进行独立拆分从而独立开发、部署、运行避免受其它业务影响。 系统拆分主要有如下几个原则 相关业务拆分独立系统优先级一致的业务拆分独立系统拆分系统包括业务服务和数据。 基于以上原则我们将订单系统进行独立拆分所有订单服务通过RPC接口提供给外部使用。订单系统内部我们将功能按优先级拆分为不同子系统避免相互影响。订单系统通过MQ队列消息通知外部订单状态变更。 独立拆分后的订单系统架构如下所示 其中最底层是数据存储层订单相关数据独立存储。订单服务层我们按照优先级将订单服务划分为三个系统分别为交易系统、查询系统、异步处理系统。 独立拆分后可以避免业务间的相互影响。快速支持业务迭代需求的同时保障系统稳定性。 订单系统经过上述独立拆分后有效地避免了业务间的相互干扰保障迭代速度的同时保证了系统稳定性。这时我们的订单量突破百万而且还在持续增长。之前的一些小问题在订单量增加后被放大进而影响用户体验。比如用户支付成功后极端情况下比如网络、数据库问题会导致支付成功消息处理失败用户支付成功后依然显示未支付。订单量变大后问题订单相应增多。我们需要提高系统的可靠性保证订单功能稳定可用。 另外随着订单量的增长、订单业务的复杂对订单系统的性能、稳定性、可用性等提出了更高的要求。 为了提供更加稳定、可靠的订单服务我们对拆分后的订单系统进行进一步升级。下面将分别介绍升级涉及的主要内容。 性能优化 系统独立拆分后可以方便地对订单系统进行优化升级。我们对独立拆分后的订单系统进行了很多的性能优化工作提升服务整体性能优化工作主要涉及如下几个方面。 异步化 服务所需要处理的工作越少其性能自然越高。可以通过将部分操作异步化来减少需要同步进行的操作进而提升服务的性能。异步化有两种方案。 线程或线程池将异步操作放在单独线程中处理避免阻塞服务线程消息异步异步操作通过接收消息完成。异步化带来一个隐患如何保障异步操作的执行。这个场景主要发生在应用重启时对于通过线程或线程池进行的异步化JVM重启时后台执行的异步操作可能尚未完成。这时需要通过JVM优雅关闭来保证异步操作进行完成后JVM再关闭。通过消息来进行的消息本身已提供持久化不受应用重启影响。 具体到订单系统我们通过将部分不必同步进行的操作异步化来提升对外服务接口的性能。不需要立即生效的操作即可以异步进行比如发放红包、PUSH推送、统计等。 以订单配送PUSH推送为例将PUSH推送异步化后的处理流程变更如下所示 PUSH异步化后线程#1在更新订单状态、发送消息后立即返回而不用同步等待PUSH推送完成。而PUSH推送异步在线程#2中完成。 并行化 操作并行化也是提升性能的一大利器并行化将原本串行的工作并行执行降低整体处理时间。我们对所有订单服务进行分析将其中非相互依赖的操作并行化从而提升整体的响应时间。 以用户下单为例第一步是从各个依赖服务获取信息包括门店、菜品、用户信息等。获取这些信息并不需要相互依赖故可以将其并行化并行后的处理流程变更如下所示 通过将获取信息并行化可有效缩短下单时间提升下单接口性能。 缓存 通过将统计信息进行提前计算后缓存避免获取数据时进行实时计算从而提升获取统计数据的服务性能。比如对于首单、用户已减免配送费等通过提前计算后缓存可以简化实时获取数据逻辑节约时间。 以用户已减免配送费为例如果需要实时计算则需要取到用户所有订单后再进行计算这样实时计算成本较高。我们通过提前计算缓存用户已减免配送费。需要取用户已减免配送费时从缓存中取即可不必实时计算。具体来说包括如下几点 通过缓存保存用户已减免配送费用户下单时如果订单有减免配送费增加缓存中用户减免配送费金额异步进行订单取消时如果订单有减免配送费减少缓存中用户减免配送费金额异步进行一致性优化 订单系统涉及交易需要保证数据的一致性。否则一旦出现问题可能会导致订单不能及时配送、交易金额不对等。 交易一个很重要的特征是其操作具有事务性订单系统是一个复杂的分布式系统比如支付涉及订单系统、支付平台、支付宝/网银等第三方。仅通过传统的数据库事务来保障不太可行。对于订单交易系统的事务性并不要求严格满足传统数据库事务的ACID性质只需要最终结果一致即可。针对订单系统的特征我们通过如下种方式来保障最终结果的一致性。 重试/幂等 通过延时重试保证操作最终会最执行。比如退款操作如退款时遇到网络或支付平台故障等问题会延时进行重试保证退款最终会被完成。重试又会带来另一个问题即部分操作重复进行需要对操作进行幂等处理保证重试的正确性。 以退款操作为例加入重试/幂等后的处理流程如下所示 退款操作首先会检查是否已经退款如果已经退款直接返回。否则向支付平台发起退款从而保证操作幂等避免重复操作带来问题。如果发起退款失败比如网络或支付平台故障会将任务放入延时队列稍后重试。否则直接返回。 通过重试幂等可以保证退款操作最终一定会完成。 2PC 2PC是指分布式事务的两阶段提交通过2PC来保证多个系统的数据一致性。比如下单过程中涉及库存、优惠资格等多个资源下单时会首先预占资源对应2PC的第一阶段下单失败后会释放资源对应2PC的回滚阶段成功后会使用资源对应2PC的提交阶段。对于2PC网上有大量的说明这里不再继续展开。 高可用 分布式系统的可用性由其各个组件的可用性共同决定要提升分布式系统的可用性需要综合提升组成分布式系统的各个组件的可用性。 针对订单系统而言其主要组成组件包括三类存储层、中间件层、服务层。下面将分层说明订单系统的可用性。 存储层 存储层的组件如MySQL、ES等本身已经实现了高可用比如MySQL通过主从集群、ES通过分片复制来实现高可用。存储层的高可用依赖各个存储组件即可。 中间件层 分布式系统会大量用到各类中间件比如服务调用框架等这类中间件一般使用开源产品或由公司基础平台提供本身已具备高可用。 服务层 在分布式系统中服务间通过相互调用来完成业务功能一旦某个服务出现问题会级联影响调用方服务进而导致系统崩溃。分布式系统中的依赖容灾是影响服务高可用的一个重要方面。 依赖容灾主要有如下几个思路 依赖超时设置依赖灾备依赖降级限制依赖使用资源订单系统会依赖多个其它服务也存在这个问题。当前订单系统通过同时采用上述四种方法来避免底层服务出现问题时影响整体服务。具体实现上我们采用Hystrix框架来完成依赖容灾功能。Hystrix框架采用上述四种方法有效实现依赖容灾。订单系统依赖容灾示意图如下所示 通过为每个依赖服务设置独立的线程池、合理的超时时间及出错时回退方法有效避免服务出现问题时级联影响导致整体服务不可用从而实现服务高可用。 另外订单系统服务层都是无状态服务通过集群多机房部署可以避免单点问题及机房故障实现高可用。 小结 上面都是通过架构、技术实现层面来保障订单系统的性能、稳定性、可用性。实际中有很多的事故是人为原因导致的除了好的架构、技术实现外通过规范、制度来规避人为事故也是保障性能、稳定性、可用性的重要方面。订单系统通过完善需求review、方案评审、代码review、测试上线、后续跟进流程来避免人为因素影响订单系统稳定性。 通过以上措施我们将订单系统建设成了一个高性能、高稳定、高可用的分布式系统。其中交易系统tp99为150ms、查询系统tp99时间为40ms。整体系统可用性为6个9。 订单系统经过上面介绍的整体升级后已经是一个高性能、高稳定、高可用的分布式系统。但是系统的的可扩展性还存在一定问题部分服务只能通过垂直扩展增加服务器配置而不能通过水平扩展加机器来进行扩容。但是服务器配置有上限导致服务整体容量受到限制。 到2015年5月的时候这个问题就比较突出了。当时数据库服务器写接近单机上限。业务预期还会继续快速增长。为保障业务的快速增长我们对订单系统开始进行第二次升级。目标是保证系统有足够的扩展性从而支撑业务的快速发展。 分布式系统的扩展性依赖于分布式系统中各个组件的可扩展性针对订单系统而言其主要组成组件包括三类存储层、中间件层、服务层。下面将分层说明如何提高各层的可扩展性。 存储层 订单系统存储层主要依赖于MySQL持久化、tair/redis cluster缓存。tair/redis cluster缓存本身即提供了很好的扩展性。MySQL可以通过增加从库来解决读扩展问题。但是对于写MySQL存在单机容量的限制。另外数据库的整体容量受限于单机硬盘的限制。 存储层的可扩展性改造主要是对MySQL扩展性改造。 分库分表写容量限制是受限于MySQL数据库单机处理能力限制。如果能将数据拆为多份不同数据放在不同机器上就可以方便对容量进行扩展。 对数据进行拆分一般分为两步第一步是分库即将不同表放不同库不同机器上。经过第一步分库后容量得到一定提升。但是分库并不能解决单表容量超过单机限制的问题随着业务的发展订单系统中的订单表即遇到了这个问题。 针对订单表超过单库容量的问题需要进行分表操作即将订单表数据进行拆分。单表数据拆分后解决了写的问题但是如果查询数据不在同一个分片会带来查询效率的问题需要聚合多张表。由于外卖在线业务对实时性、性能要求较高。我们针对每个主要的查询维度均保存一份数据每份数据按查询维度进行分片方便查询。 具体来说外卖主要涉及三个查询维度订单ID、用户ID、门店ID。对订单表分表时对于一个订单我们存三份分别按照订单ID、用户ID、 门店ID以一定规则存储在每个维度不同分片中。这样可以分散写压力同时按照订单ID、用户ID、门店ID三个维度查询时数据均在一个分片保证较高的查询效率。 订单表分表后订单表的存储架构如下所示 可以看到分表后每个维度共有100张表分别放在4个库上面。对于同一个订单冗余存储了三份。未来随着业务发展还可以继续通过将表分到不同机器上来持续获得容量的提升。 分库分表后订单数据存储到多个库多个表中为应用层查询带来一定麻烦解决分库分表后的查询主要有三种方案 MySQL服务器端支持目前不支持。中间件。应用层。由于MySQL服务器端不能支持我们只剩下中间件和应用层两个方案。中间件方案对应用透明但是开发难度相对较大当时这块没有资源去支持。于是我们采用应用层方案来快速支持。结合应用开发框架SPRINGMYBATIS我们实现了一个轻量级的分库分表访问插件避免将分库分表逻辑嵌入到业务代码。分库分表插件的实现包括如下几个要点。 配置文件管理分库分表配置信息JAVA注解说明SQL语句分库分表信息JAVA AOP解析注解查询配置文件获取数据源及表名MYBATIS动态替换表名SPRING动态替换数据源。通过分库分表解决了写容量扩展问题。但是分表后会给查询带来一定的限制只能支持主要维度的查询其它维度的查询效率存在问题。 ES搜索订单表分表之后对于ID、用户ID、门店ID外的查询比如按照手机号前缀查询存在效率问题。这部分通常是复杂查询可以通过全文搜索来支持。在订单系统中我们通过ES来解决分表后非分表维度的复杂查询效率问题。具体来说使用ES主要涉及如下几点。 通过databus将订单数据同步到ES。同步数据时通过批量写入来降低ES写入压力。通过ES的分片机制来支持扩展性。小结 通过对存储层的可扩展性改造使得订单系统存储层具有较好的可扩展性。对于中间层的可扩展性与上面提到的中间层可用性一样中间层本身已提供解决方案直接复用即可。对于服务层订单系统服务层提供的都是无状态服务对于无状态服务通过增加机器即可获得更高的容量完成扩容。 通过对订单系统各层可扩展性改造使得订单系统具备了较好的可扩展性能够支持业务的持续发展当前订单系统已具体千万单/日的容量。 上面几部分都是在介绍如何通过架构、技术实现等手段来搭建一个可靠、完善的订单系统。但是要保障系统的持续健康运行光搭建系统还不够运维也是很重要的一环。 早期对系统及业务的运维主要是采用人肉的方式即外部反馈问题RD通过排查日志等来定位问题。随着系统的复杂、业务的增长问题排查难度不断加大同时反馈问题的数量也在逐步增多。通过人肉方式效率偏低并不能很好的满足业务的需求。 为提升运维效率、降低人力成本我们对系统及业务运维进行自动化、智能化改进改进包括事前、事中、事后措施。 事前措施事前措施的目的是为提前发现隐患提前解决避免问题恶化。 在事前措施这块我们主要采取如下几个手段 定期线上压测通过线上压测准确评估系统容量提前发现系统隐患周期性系统健康体检通过周期检测CPU利用率、内存利用率、接口QPS、接口TP95、异常数取消订单数等指标是否异常可以提前发现提前发现潜在问题、提前解决全链路关键日志通过记录全链路关键日志根据日志自动分析反馈订单问题原因给出处理结果有效提高反馈处理效率。事中措施事中措施的目的是为及时发现问题、快速解决问题。 事中这块我们采取的手段包括 订单监控大盘实时监控订单业务指标异常时报警系统监控大盘实时监控订单系统指标异常时报警完善的SOP报警后通过标准流程快速定位问题、解决问题。事后措施事后措施是指问题发生后分析问题原因彻底解决。并将相关经验教训反哺给事前、事中措施不断加强事先、事中措施争取尽量提前发现问题将问题扼杀在萌芽阶段。 通过将之前人肉进行的运维操作自动化、智能化提升了处理效率、减少了运维的人力投入。 看完以后是不是想拍个砖、留个言抒发下己见可以来微信公众号给我们评论还能在第一时间获取我们发布的一些实践经验总结、最新的活动报名信息。关注可扫码
http://www.zqtcl.cn/news/253297/

相关文章:

  • 在线网站建设哪家便宜wordpress 爬取
  • 移动端网站设计规范百度一下首页问问
  • 哪些网站怎么进广西玉林网站建设
  • 高端建站设计赶集网免费发布信息
  • 两题一做的网站响应式网站开发asp
  • 做网站直接开二级域名网站怎么收录到百度
  • 手机论坛网站源码西安网站建设-中国互联
  • 郑州网站建设策划方案丹阳建站推广管理
  • 电商网站用什么框架做广州网站建设公司奇亿网站建设
  • 营销策划网站专做品牌网站
  • 电脑托管宁波seo排名外包
  • 外汇网站模版网站开发和网站制作的区别
  • 学习网站建设的书籍我要做个网站该怎么做
  • h5互动网站建设网站制作的教程
  • 大连网站设计公司双语外贸网站源码
  • 广元网站建设工作室湖北省建设用地预审网站
  • 保定清苑城市建设网站公司网站建立费用
  • 厦门找一家做网站的公司家在深圳论坛
  • 个人网站开发 服务器货源之家官网
  • 教育培训学校网站建设策划局域网 wordpress
  • 重庆建网站有哪些网站做曲线的源代码
  • 龙岩网站设计找哪家公司网站建设没有业务怎么办
  • 网站建设专业学什么建材 团购 网站怎么做
  • 电器工程东莞网站建设wordpress虚拟资源下载源码
  • 无限个网站虚拟空间网站运行维护
  • 宝思哲手表网站关于计算机网站建设的论文
  • uc投放广告网站要自己做吗dw制作企业网站
  • 山东网站制作南京软件外包公司
  • 铁岭建设银行网站网站验证码原理
  • 做网站需要什么专业方向的员工钱多网站