【网易云商】构建高效 SaaS 系统的技术要点与最佳实践

SaaS 是什么

定义

相信大家都对云服务中的  IaaS、PaaS、SaaS 早就有所耳闻,现在更是衍生出了 aPaaS、iPaaS、DaaS 等等的类似概念。对于 SaaS 也有各种各样的定义,本文给出的定义是:

SaaS 是一种基于互联网提供服务和软件的交付模式,所有网络基础设施及软件、硬件运作平台的所有前期实施、后期维护都由 SaaS 平台完成,用户只需要租赁软件服务并通过互联网接入使用。SaaS 模型依赖敏捷性和运营效率,作为推动增长、覆盖和创新的业务战略的支柱。业内大家通常会以 Salesforce 作为 SaaS 的标杆。

价值

目前市场上越来越多的企业和组织采用 SaaS 服务来替代原来传统的软件采购部署方式,其原因可以主要总结为以下几个方面。

 

另外,相比于传统软件,SaaS 的盈利模式也决定了客户的成功对于 SaaS 厂商来说极其重要,只有客户成功了,才会有续费, SaaS 项目才有办法继续下去。当然 SaaS 系统相比传统软件也会有一些缺点,如独立性、可控性、个性化等。

基础架构

SaaS 系统通常是一个普通的分布式系统,因此它一定具有分布式系统的所有组成要素,如服务发现、负载均衡、序列化协议、传输协议、授权认证、网络安全等等。

入口

客户最直接接触的通常是 SaaS 系统的客户端,客户端的形式可以根据业务的需求决定,常见的有浏览器网页、移动端 APP、小程序、智能设备等。

客户端到服务器的入口通常是一个通用域名或者是每个租户的独立子域名。如互客的入口是 huke.163.com,网易七鱼的入口是 xxx.qiyukf.com。域名的背后就一定需要 DNS 的存在,需要配置出合理的 DNS 解析,通常传统的基于 UDP 的 DNS 服务容易受到中间人攻击,存在被劫持的风险,另外也存在被运营商封禁等情况,因此 SaaS 系统通常通过搭建自己的 HTTPDNS 来规避风险。

有了域名作为入口之后,下一步就是客户端和服务器之间的通信协议,对于少数简单的 SaaS 系统来说只要通过域名和 HTTP 协议就可以完成所有服务,但大部分 SaaS 系统都会存在双向通信的需求,因此还需要维护长连接通道,常用的如原生 TCP 协议,或 Websocket 协议。另外如果业务中有媒体流传输的需求,还会用到 UDP、RTP 协议等。当然,目前市场上对于各种场景和需求都有对应的成熟解决方案,因此 SaaS 系统通常不会去从 0 开始解决所有问题,如长链接和媒体流我们可以集成网易云信的服务来解决。

接入层

接入层通常是各种路由协议以及多层代理组成,如运营商和 AS 之间通常用 BGP 协议或者三线,机房内部通常会有接入的三层交换机,四层代理等等。网易七鱼目前的接入方案如下图所示,而对于规模较小的业务,为了灵活性和性价比,通常会在交换机和 Nginx 之间加入四层代理 nlb。这一层基本都是由集团的 SA 同学负责搭建和运维。

 

业务层

这里我们不去讨论业务上的各种设计模式和分层,因此把接入层之后、数据层之前的所有服务和设施统称为业务层。通常业务层是一个 SaaS 系统研发中投入资源最大的,线上问题如性能瓶颈、稳定性、安全漏洞等大部分都来自于业务层,因此该层也是开发和线上运维的重点。

在业务层目前 SaaS 系统最常用的还是微服务的架构,不同于 IaaS 或 PaaS,SaaS 业务的一个重要特征是其业务复杂度很高、业务链路很长,而微服务的架构刚好可以很好地应对这种情况。当然在业务刚开始的时候,我们可以用简单的单体应用来快速实现原型验证,等业务发展起来后再开始逐步微服务拆分。

流量通过接入层后,一般为了系统的灵活性,会通过 Nginx 的 upstream 来转发请求到网关,由网关统一分发到对应的业务服务,而业务服务又可以拆分为许多独立的微服务相互调用。这也就带来了 SaaS 系统中的大部分常见问题,如:

  • 谁可以使用什么服务?(租户管理)

  • 服务在哪里?(服务发现)

  • 请求应该由哪个服务节点处理?(负载均衡)

  • 信息怎么传输?(传输协议)

  • 如何避免一个租户影响另一个租户?(资源隔离)

  • 输入和输出如何表示?(序列化协议)

  • 网络出现分区、超时或者服务出错了怎么办?(熔断、降级、服务治理)

  • 服务权限如何管理?(认证授权)

  • 如何保证通信安全?(网络安全)

  • 重要程度和依赖关系怎么样?(服务分级)

  • 如何保证不同机器的服务状态一致?(分布式数据一致性)

等等...这些全都需要研发人员投入大量的精力,每个点展开细说都是一个很大的话题。基于业务和技术的考虑,通常还需要引入消息队列、缓存、配置中心、定时任务等组件。

数据层

所有业务逻辑,最后一定都会在数据存储上得到体现。在一个 SaaS 系统中,最常用的存储依然是关系型数据库,如我们的 DDB、另外常用 HBase、TiDB 等作为冷数据存储,ES、MongoDB 等作为对应功能的数据存储。因此 SaaS 系统中多个数据存储之间的一致性是一个需要重视的地方。

对象存储方面,我们集团内有 Nos,市面上的云厂商也都有相应的服务,不需要自己构建。不论客户存储的对象还是系统中的某些资源,为了提高客户的访问速度,我们都需要有 CDN 的存在。

SaaS 业务中还有一个常见的需求就是 BI,这要求系统具有数据分析能力,OLAP 数据库也是必不可少的,网易云商采用的是 ClickHouse。

在某些特定的业务场景,也许还需要用到 TSDB,录入智能设备的传感器读数,用户的活动轨迹,系统的状态变化等。

数据层还有一个非常重要,但经常被忽视的话题就是数据合规。特别是对于 SaaS 业务,因为面向的客户都是企业和组织,因此数据的安全合规是非常重要的。例如网易云商有专门的中间件用于数据库的敏感数据加密。

 

运维能力

到目前为止,一个 SaaS 系统基本已经搭建成型可以提供服务了。但是我们对系统的状态还一无所知,因此还要构建足够强大的运维能力。其中包括了可观测性、计量计费、快速恢复、故障演练、系统治理各个方面。以可观测性为例,我们需要采集系统中的各种数据并通过大量技术手段来观测系统的状态,如系统资源、业务指标、健康状态、链路追踪、业务埋点、报警管理、错误统计、流量水位、趋势分析、变更管理等。针对 SaaS 业务的特点,还需要特别对系统进行租户维度的监控和管理。

 

部署模式

SaaS 系统根据隔离程度的不一样可以分为三种部署模式,每种部署模式都会涉及到架构的调整适配,都有各自的优缺点。

共享模式

指 SaaS 系统中的所有资源,如业务服务、数据存储等全部是共享的,这要是绝大分部 SaaS 系统一开始采用的模式,这种模式系统的优势是灵活性高,资源利用率高,采用集中化管理,开发运维更简单。缺点是租户间容易相互影响,合规性也容易被一些特定行业客户挑战,还有很难为不同租户提供差异化服务。

专属模式

指 SaaS 系统中几乎所有资源都是租户独占的,这种部署模式的优势是每个租户有完全隔离的环境,租户之间不会有影响,可以针对不同租户提供个性化的服务。但是缺点也很明显,这种部署模式的资源利用率低、成本高、运维难度高、管理复杂。通常会被用于一些特定行业或者特殊需求的客户场景。

 

混合模式

指 SaaS 系统中有部分资源是所有租户共享的,还有部分资源是租户独占的,这种模式是现在大型 SaaS 系统常见的部署模式,可以兼顾上面种模式的优缺点,针对不同的客户提供不同的解决方案。

 

未来发展

上面简要介绍了搭建一个 SaaS 系统的主要过程,尽管 SaaS 的设计初衷是快速为特定业务场景提供垂直解决方案,但企业对跨业务跨部门的需求也越来越强烈,例如营销服务一体化、私域运营等场景。因此,业界无论在业务还是技术方面都还在不断地探索之中,例如对于 SaaS 的成本控制,合规性,可扩展性,针对不同租户的差异化服务等等,都是 SaaS 厂商经常面临的难题。有人在探索部署方式的优化,有人在探索产品的设计方案,有人在探索低代码的模式,还有人在探索生态合作的方案。无论如何,大家的的努力都是在为了客户的成功,回到我们的起点,只有客户成功了,SaaS 才有存在下去的价值。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/185971.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文彻底看懂Python切片,Python切片理解与操作

1.什么是切片 切片是Python中一种用于操作序列类型(如列表、字符串和元组)的方法。它通过指定起始索引和结束索引来截取出序列的一部分,形成一个新的序列。切片是访问特定范围内的元素,就是一个Area。 说个笑话:切片不是切片,而是切片,但是又是切片。大家理解下呢(末…

80C51单片机----数据传送类指令

目录 一.一般传送指令,即mov指令 1.16位传送(仅1条) 2.8位传送 (1)目的字节为A(累加器) (2)目的字节为Rn(工作寄存器) (3)目的字节为direct…

java中的String.format()方法详解

介绍 String.format() 是 Java 中的一个字符串格式化方法,它用于生成指定格式的字符串。这个方法可以接受一个或多个参数,并将它们按照指定的格式插入到字符串中。它使用了类似于 C 语言中的 printf 函数的语法。 String.format() 方法的使用格式如下&…

Tars框架 Tars-Go 学习

Tars 框架安装 网上安装教程比较多,官方可以参数这个 TARS官方文档 (tarsyun.com) 本文主要介绍部署应用。 安装完成后Tars 界面 增加应用amc 部署申请 amc.GoTestServer.GoTestObj 名称不知道的可以参考自己创建的app config 点击刷新可以看到自己部署的应用 服…

微机原理_3

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案,请将选定的答案填涂在答题纸的相应位置上。) 在 8086 微机系统中,完成对指令译码操作功能的部件是()。 A. EU B. BIU C. SRAM D. DRAM 使计算机执行某…

【Rust日报】2023-11-22 Floneum -- 基于 Rust 的一款用于 AI 工作流程的图形编辑器

Floneum -- 基于 Rust 的一款用于 AI 工作流程的图形编辑器 Floneum 是一款用于 AI 工作流程的图形编辑器,专注于社区制作的插件、本地 AI 和安全性。 Floneum 有哪些特性: 可视化界面:您无需任何编程知识即可使用Floneum。可视化图形编辑器可…

2023年金融信创行业研究报告

第一章 行业概况 1.1 定义 金融信创是指在金融行业中应用的信息技术,特别是那些涉及到金融IT基础设施、基础软件、应用软件和信息安全等方面的技术和产品。这一概念源于更广泛的“信创 (信息技术应用创新)”,即通过中国国产信息技术替换海外信息技术&a…

某60区块链安全之未初始化的存储指针实战二学习记录

系列文章目录 文章目录 系列文章目录未初始化的存储指针实战二实验目的实验环境实验工具实验原理实验内容实验过程EXP利用 未初始化的存储指针实战二 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约未初始化的存储指针漏洞 找到合约漏洞进行分析并形成利用 实验…

【Vue】图片切换

上一篇&#xff1a; vue的指令 https://blog.csdn.net/m0_67930426/article/details/134599378?spm1001.2014.3001.5502 本篇所需要的指令有&#xff1a; v-on v-bind v-show <!DOCTYPE html> <html lang"en"> <head><meta charset"…

【微服务专题】SpringBoot自动配置源码解析

目录 前言阅读对象阅读导航前置知识笔记正文0、什么是自动配置0.1 基本概念0.2 SpringBoot中的【约定大于配置】0.3 从SpringMVC看【约定大于配置】0.4 从Redis看【约定大于配置】 一、EnableAutoConfiguration源码解析二、SpringBoot常用条件注解源码解析2.1 自定义条件注解2.…

基于 STM32Cube.AI 的嵌入式人脸识别算法实现

本文介绍了如何使用 STM32Cube.AI 工具开发嵌入式人脸识别算法。首先&#xff0c;我们将简要介绍 STM32Cube.AI 工具和 STM32F系列单片机的特点。接下来&#xff0c;我们将详细讨论如何使用 STM32Cube.AI 工具链和相关库来进行人脸识别算法的开发和优化。最后&#xff0c;我们提…

仿 美图 / 饿了么,店铺详情页功能

前言 UI有所不同&#xff0c;但功能差不多&#xff0c;商品添加购物车功能 正在写&#xff0c;写完会提交仓库。 效果图一&#xff1a;左右RecyclerView 联动 效果图二&#xff1a;通过点击 向上偏移至最大值 效果图三&#xff1a;通过点击 或 拖动 展开收缩公告 效果图四&…

2021年12月 Scratch(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 执行下列程序,屏幕上可以看到几只小猫? A:1 B:3 C:4 D:0 答案:B 第2题 下列程序哪个可以实现:按下空格键,播放完音乐后说“你好!”2秒? A: B: C:

知虾官网:探索跨境电商数据的新平台

随着电子商务的快速发展&#xff0c;跨境电商已成为全球贸易的重要组成部分。为了帮助企业更好地了解市场、选品、分析竞争对手和科学运营&#xff0c;知虾官网应运而生。本文将为您介绍知虾官网的功能和优势&#xff0c;以及广州萌啦信息科技有限公司的背景。 一、知虾官网的功…

Python中classmethod的妙用

更多Python学习内容&#xff1a;ipengtao.com 在Python中&#xff0c;classmethod装饰器为开发者提供了一种强大的工具&#xff0c;使得类方法的定义和使用更加灵活。本文将深入探讨classmethod的妙用&#xff0c;通过丰富的示例代码展示其在不同场景下的实际应用。 类方法与实…

【JavaWeb】TomcatJavaWebHTTP

Tomcat&JavaWeb&HTTP 文章目录 Tomcat&JavaWeb&HTTP一、Tomcat1.1 版本选择及安装1.2 目录1.3 WEB项目部署的方式 二、IDEA中Java Web开发部署流程三、HTTP协议3.1 发展历程3.2 HTTP协议的会话方式3.3 请求报文3.4 响应报文 一、Tomcat Tomcat是Apache 软件基…

postgresql从入门到精通 - 第35讲:中间件PgBouncer部署|PostgreSQL教程

PostgreSQL从小白到专家&#xff0c;是从入门逐渐能力提升的一个系列教程&#xff0c;内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容&#xff0c;希望对热爱PG、学习PG的同学们有帮助&#xff0c;欢迎持续关注CUUG PG技术大讲堂。 第35讲&#…

【CVE-2021-1675】Spoolsv打印机服务任意DLL加载漏洞分析

漏洞详情 简介 打印机服务提供了添加打印机的接口&#xff0c;该接口缺乏安全性校验&#xff0c;导致攻击者可以伪造打印机信息&#xff0c;在添加新的打印机时实现加载恶意DLL。这造成的后果就是以system权限执行任意代码。 影响版本 windows_10 20h2 windows_10 21h1 win…

华硕灵耀XPro(UX7602ZM)原装Win11系统恢复安装教程方法

华硕灵耀XPro(UX7602ZM)原装Win11系统恢复安装教程方法&#xff1a; 第一步&#xff1a;需要自备华硕6个底包工厂安装包&#xff08;EDN.KIT.OFS.SWP.HDI.TLK&#xff09;或者自己备份的iso/esd/wim等镜像恢复 支持系列&#xff1a; 灵耀系列原装系统 无畏系列原装系统 枪…

原型 原型对象 原型链

在面向开发对象开发过程中对每一个实例添加方法&#xff0c;会使每一个对象都存在该添加方法造成空间浪费 通过对原型添加公共的属性或方法&#xff0c;使所有实例对象都可访问 原型为了共享公共的成员 prototype 原型: JS为每个构造函数提供一个属性prototype(原型),它的值…