史爱武解析:Web后端开发的关键职责

发表时间: 2023-01-23 07:00

来源于微信公众号:计算机大学生

随着互联网和IT技术的高速发展,前端页面的展示、交互体验越来越灵活、炫丽,响应体验也要求越来越高;后端服务的高并发、高可用、高性能、高扩展等特性的要求也愈加苛刻,从而导致前后端研发各自专注于自己擅长的领域深耕细作,前后端分离已成为IT项目开发的业界标准。

前端开发就是开发网页上的内容展示和用户的交互。后端开发就是服务器端的开发,主要涉及软件系统“后端”的事情,简单地说,你在用户界面上看不到但是用来支持前端的东西就是后端,它主要解决核心业务逻辑、数据库访问以及高并发、高可用、负载均衡等性能问题,使用到的技术多且复杂,如Java、JVM原理、事务、多线程、后端框架、版本控制管理、API、高并发、设计模式、数据库、中间件、分布式架构、微服务架构,等等。

通常情况下,一个Web应用的绝大多数代码都属于后端代码,因为后端承担了Web应用实际的业务逻辑。后端开发的压力通常比前端开发要大,因为后端是Web应用的“灵魂”,它影响着Web应用的方方面面,除了业务逻辑之外还需要考虑安全性、稳定性、可维护性、可扩展性、伸缩性等问题。在现实中,世界上存在的大多数代码(可以说是最有用的代码)是最终用户从来不会看到的后端代码。所以,后端开发工程师是处理业务逻辑和优化性能的“幕后英雄”。

一、岗位职责

Web后端开发的主要目的是给前端用户提供展示所需要的内容、信息或数据。为了达成这个目的,后端开发工程师就需要完成至少下列工作内容:

一是,按业务需求设计和实现业务逻辑代码,使业务流程和逻辑按需求执行和处理;

二是,创建API接口供前端开发人员调用来访问后端的业务实现或数据,当然,后端开发人员在实现业务逻辑或创建API时候可能也需要调用第三方API;

三是,为了更好地提供前端服务,后端开发人员必须要考虑高并发、高可用、负载均衡等性能问题。否则,前端的交互体验肯定是不太好的,甚至完全无法给前端提供业务支撑服务。

下面是一个网上的Web后端开发工程师的岗位职责示例。

岗位职责:

1.参与产品业务需求分析、系统设计、接口设计和数据建模,并撰写相应的技术文档;

2.能独立完成相应系统业务模块的详细设计、开发、单元测试、优化和持续迭代;

3.能掌控自己代码的运行状况,并根据程序日志来排除错误和优化代码,能独立解决开发中遇到的难点问题;

4.参与系统稳定性、性能和扩展性调试。

Web后端开发是IT应用系统最核心的开发内容,也是开发代码量最多的工作,而且开发工作量随后端的业务需求的增多而增多。所以,对于一个IT公司来说,整个Web开发团队(或者开发团队)的人员一般绝大多数是处理后端业务逻辑的后端开发人员,其核心职责除了设计和实现业务逻辑功能之外,还包括实现和使用API,以及性能相关的优化。当然,优化性能的工作可能更多的是由中高级后端开发人员(或架构设计师)来考虑和处理的。

(一)设计和实现业务逻辑

软件产品都是在某个领域内实现某些特定业务需求的,自然地,软件产品应该分解为至少前端的用户界面和后端的业务逻辑两大部分。其中,业务逻辑部分是软件产品的核心,它一般运行在软件系统的后端,不能与用户直接交互;而用户界面部分是用户与后端的业务逻辑交互的接口,用户通过与前端界面交互,进而执行后端的业务逻辑代码,使得软件产品发挥其作用。

业务逻辑作为一个高层次概念,其内在结构也是非常丰富的,领域实体、业务规则、完整性约束和业务流程是构成业务逻辑的底层结构部分。其中,领域实体是某个领域内各种对象的抽象,可以用名词表示,构成了整个业务逻辑的骨骼和静态模型。一般每个领域实体有自己的一些属性和行为。领域实体的存在是面向对象分析和设计OOAD的基础。业务规则就是某个领域内运作的规则,构成了整个业务逻辑的灵魂和动态模型。业务规则作用于领域实体,领域实体遵从业务规则来运作。领域实体和业务规则构建了业务逻辑的主体,但在这主体之上,还存在着一个限制,这就是完整性约束。完整性约束是对业务领域中的数据、规则的强制性规定与约束,这种约束是系统正常运转的保证。

有了领域实体、业务规划和完整性约束等三部分,业务逻辑还不能正常工作,因为还没有“启动器”和“过程托管器”。设想我们有了各种实体类,它们有各自的属性和行为,也有定义好的业务规则和完整性约束。现在实体类仅仅具有实现业务规则的能力,但它们如何启动并交互协调完成业务规则呢?因此我们需要有东西去触发和协调实体。业务流程或工作流是启动及托管协调领域实体完成既定规则的过程。

例如,“在线订购”是一个业务流程,它包括“用户登录-选择商品-结算-下订单-付款-确认收货”这一系列流程。各个实体如会员、订单、商品等已经包含了完成在线订购必要的行为,但仍需一个流程,才能真正完成业务。具体到程序中,业务流程也许通过一个方法来实现,这个方法负责启动并协调各个实体类,完成一个流程。

业.务逻辑模块的实现是需要设计的。架构设计师一般考虑整个系统的架构设计,以及整体系统的概要设计,具体的业务逻辑的详细设计都是由后端开发人员自己来设计的,将业务逻辑组织成为领域模型,大多数业务逻辑由具有状态和行为的类组成。后端开发工程师基于这些设计的类、对象、方法和属性以及一定的设计模式和方法来按需求实现这些业务逻辑,达成需求分析过程中所设定的功能要求。不过,在业务逻辑的设计和实现过程中,后端开发工程师还有可能要设计数据库表、字段和属性以及在业务代码实现中操作这些表和字段。

一般只有高级的后端开发人员和架构设计师才需要关注架构设计问题,但是架构设计是后端开发中非常重要的一环,因为它决定了每个业务逻辑模块解决什么问题、如何组织业务逻辑代码、如何保障系统的扩展性和可维护性,如何解决系统的高并发,等等。一定程度上,架构设计的不同也会影响业务逻辑的具体实现,比如,微服务和单体架构这两种架构下,同一种业务逻辑的实现可能完全不同。

(二)实现和使用API

Application Programming Interface,也即是应用编程接口API,它是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。它用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程,而又无需访问原码或理解内部工作机制的细节。

API是一种程序之间的接口,因其便捷性以及流行的微服务架构,得到了广泛的应用,目前已覆盖了移动应用程序、工业物联网应用、云服务客户端、企业内部集成应用程序、供应链合作伙伴集成应用程序等IT领域的多个方面。

后端需要向前端提供前端所需的数据,也需要使用第三方API来完成业务逻辑(如完成某个功能需要通过API调用其他应用、在使用框架进行开发时需要使用语言和框架的API、操作数据库时需要使用数据库或ORM框架的API等)。因为后端开发过程中经常需要与API打交道,所以也有人把后端开发称为“API开发”,就像有些人将前端开发称为“GUI开发”一样。

由于近年来软件的规模日益庞大,常常需要把复杂的系统划分成小的组成部分,编程接口的设计十分重要。程序设计的实践中,编程接口的设计首先要使软件系统的职责得到合理划分。良好的接口设计可以降低系统各部分的相互依赖,提高组成单元的内聚性,降低组成单元间的耦合程度,从而提高系统的维护性和扩展性。应用程序接口经常是软件开发工具包(SDK)的一部分。

API 的一个主要功能是提供通用功能集。开发人员通过调用 API功能可以实现特定的功能,而无须考虑其底层的源代码或理解其内部工作机制细节,可以把API接口理解为是特定功能服务的一种封装,将服务封装起来提供给他人调用。这样一来,很多功能不需要重新开发,可以减轻编程任务。另外,API往往也被用于不同系统和编程语言之间进行数据交互,为各种不同平台提供数据共享。

为了快速、大规模地集成不同的应用程序,API 使用协议或规范来定义那些通过网络传输的消息的语义和信息,这些规范构成了 API 的体系架构。目前主流的API架构包括RPC、SOAP、REST和GraphQL,每个架构都有它独有的数据交换模式、优势、不足以及最佳的应用场景。

后端开发工程师在实现API时都要面对不同的限制和需求。通常,API架构的选择要取决于所使用的编程语言、开发环境、资源预算(包括人力资源和财务资源),等等。后端开发工程师可以选择最适合项目的那一种API架构。

上述四种主流的API架构相较而言,具有强耦合性的RPC很适合于内部微服务,但它对于外部API或者提供API对外服务不是一个好的选择。SOAP的使用有些麻烦,但它强大的安全拓展使它在计费操作、预订系统和支付方面是无可替代的。REST是针对API的最高级别的抽象和最佳模型,但它往往会返回大量的元数据而增加系统的负担,如果是面对移动端应用开发,这是个较大的性能问题。GraphQL在数据获取方面比较有优势,但是学习曲线可能有点长。

实际上,对于Web后端开发工程师来说,他们在开发过程中开发实现或使用最多的还是REST API。很多情况下,后端开发工程师实现的业务逻辑也是通过REST API方式提供给外部系统或者内部组件(或系统)调用的。

(三)性能优化

性能优化一般指降低响应时间和提高系统吞吐量两个方面,但在流量高峰时期,服务的可用性才是应该关注的重点,此时性能优化也包括提高服务可用性。降低响应时间、提高系统吞吐量和提高服务可用性三者是相互矛盾的,不可兼得。比如增加缓存可以降低平均响应时间,但是处理线程数量会因为缓存过大而有所限制,从而降低系统吞吐量。所以需要在三者中找到平衡,实现业务需求。

后端系统响应时间是指系统对请求做出响应的时间(应用延迟时间)。对于面向用户的Web服务,响应时间会受到数据库查询、RPC调用、网络IO、JVM垃圾回收等诸多方面因素的影响。对于高并发的应用和系统,吞吐量是关键指标,它是与网络请求对应的CPU、内存资源消耗,调用外部接口及IO紧密关联的。

除了硬件升级(如机械硬盘升级为固态硬盘,提高服务器内存等)之外,后端开发工程师常用的性能优化策略包括:

业务逻辑优化:业务逻辑优化是第一位的,特别是一些不合理的复杂实现。如果结合需求能从代码实现的角度,使用更高效的算法或方案,进而解决问题,那是最简单有效的。

数据库的优化:总体上有3个方面的数据库优化:掌握基本的优化SQL语句,或使用日志和分析工具定位具体问题SQL并逐步调优;选择高效适用的连接池,结合连接池的原理、具体的连接池监控数据和当前的业务量作一个综合的判断,反复调试得到最终的调优参数;读写分离、主从库负载均衡、水平和垂直分库分表等数据库架构层面的优化。

数据缓存:使用本地缓存(HashMap、Guava Cache等),或中央缓存服务(Redis、Memcache等)。对于数据量非常小但调用频繁的数据我们可以用本地缓存;中央缓存服务适用于于数据量大的。数据缓存的使用可以减少响应时间,提供快速响应,防止数据库在高并发访问中不堪重负。

异步处理:系统要调用其他接口时可以不同步的尽量不要同步,此时可以用异步线程或消息队列来处理这些请求。异步处理有很多好处,包括提升服务的处理性能,缩短接口响应时间,使用户的请求快速返回,用户体验更好;避免线程长时间处于运行状态,这样会引起服务线程池的可用线程长时间不够用,进而引起线程池任务队列长度增大,从而阻塞更多请求任务,使得更多请求得不到及时处理。

分布式:多个节点组成一个分布式系统,协同工作,更加高效。Web服务一般可以利用Nginx等负载均衡服务来实现分布式部署,也可以利用微服务架构来实现分布式系统开发。

上面列出了后端开发工程师可能会使用的性能优化策略,从硬件、软件到业务逻辑,从缓存到数据库,甚至到开发方式。后端开发工程师关键是要找到性能瓶颈,再针对性地实现性能优化,在硬件、网络、资源一定的情况下实现性能最大化——既是后端开发人员的职责,也是能力水平的体现。