【系统设计】服务设计初步

缘由

最早学习web开发时,在告别了最开始写web服务的兴奋之后,带来的是更多的困惑:

  • web开发与操作系统、网络、数据结构算法这些之间的关系是什么?为什么我感觉我只是在写一些很简单的业务逻辑和数据结构算法没有什么关系?
  • web框架的原理是什么?在整个web服务过程中他做了那些事?
  • 除了web场景之外,如游戏,视频流媒体,搜索推荐等服务开发又有哪些不同?
  • 所谓的架构是什么?分布式又是什么?

我在早期也做了一些探索,比如自己研究过Python web框架的实现发布在csdn:https://blog.csdn.net/yz764127031/article/details/71583674
但是依然很浅显,后来在读研期间阅读了一系列的书籍和做了一些实践,对这些问题有了更加深刻的理解,于是打算将这些思考记录下来,既是总结也是分享。

系统设计

《计算机系统设计原理》一书中,作者开篇点明了系统设计的本质:为了化解系统的复杂性。
系统复杂性来源主要有两个:

  1. 现实世界复杂多变的需求
  2. 资源是稀缺的,我们必须保证高效的利用。

书中将系统设计的基本方法分为:模块化,抽象化,层次化,分级化。
个人认为,系统设计的基本和本质方法就是模块化。
抽象化是强调模块间的解耦合,每个模块都提供一种单独的抽象,仅提供接口,并隐藏内部实现,来降低思考的负担。
层次化是强调模块之间的粒度和组织关系,每个模块都承担一种单一职责,上层模块的功能依赖下层模块。
分级化是一种系统优化的思路,针对不同类型分级处理,例如:把小块内存和大块内存分开处理。

服务设计

在互联网发明之后,随着成本不断降低,以互联网为媒介提供信息服务已经成为主流方式,所以我们必须讨论在这种情况下,如何进行系统设计:

服务:服务方通过互联网向用户提供的计算、存储、通讯等服务。

服务的基本组成:服务 = 通讯链路 + 解释器(计算)+ 存储器

服务的本质可以视为一组函数的集合,客户端从发起请求到获得响应的过程可以认为是一次RPC调用:

  • 客户端 完成了两个核心步骤:1.封装调用参数和函数名 2.解析响应结果和显示结果
  • 服务端 则负责将设置函数,绑定函数名,执行函数的计算过程,在这过程中因为业务的差异而产生服务端设计的差别。

在实践中,服务随着规模的变化可以分为三类:

  1. 单体式:单个进程就是一个服务,适用于用户规模小的情况。
  2. 集群式:有多个提供单一服务的进程,为了进程间的通讯需要引入中间件,此外web场景下考虑session的共享,需要设计session的存储方案
  3. 微服务式:将大服务拆分为若干个粒度更小的服务,并通过微服务框架来管理协调。

此外还需要考虑服务的非功能需求:
扩展性
可靠性
安全性
可维护性

服务设计中的关键权衡点

  • 通讯链路:

    • 可靠性与延迟
    • 长连接与短连接
    • 状态信息
    • 协议
  • 解释器

    • web框架
    • 业务逻辑
    • 算法模型
    • 批处理/流式计算
  • 存储器

    • 存储模型
    • 查询语言
    • 存储引擎
    • 事务

几种基本服务类型举例

web服务:

  • 通讯链路:网关服务器 + 通讯协议http + session
  • 解释器: web开发框架 + 业务逻辑
  • 存储器: 关系型数据库 + 缓存

实时服务(游戏,直播等):

  • 通讯链路:长连接 + 自定义通讯协议 + 服务端保持状态
  • 解释器: 内存计算
  • 存储器: 关系型数据库

机器学习系统:

  • 通讯链路:消息队列
  • 解释器:离线计算 + 实时计算 + 算法模型
  • 存储器: nosql
posted on 2021-12-09 15:43  yangzhe97  阅读(113)  评论(0编辑  收藏  举报