微服务设计原则——功能设计

news2024/12/21 16:58:42

文章目录

  • 1.ID生成
  • 2.数值精度
  • 3.DB操作
  • 4.性能测试
  • 5.版本兼容
    • 5.1 向旧兼容
    • 5.2 向新兼容
  • 6.异步时序问题
  • 7.并发问题
    • 7.1 并发时序
    • 7.2 并发数据竞争
  • 参考文献

1.ID生成

在分布式系统中,生成全局唯一ID是非常重要的需求,因为需要确保不同节点、服务或实例在并发操作时不会生成相同的ID。

  • 如无必要,ID 长度不要超过 128 字节。
  • 使用业界成熟的 ID 生成方案,如 UUID (Universally Unique Identifier),Snowflake 算法,数据库自增ID,基于 Redis 的分布式ID生成器,以及分布式唯一ID生成服务(Zookeeper 或 etcd)等,而不是自己实现。
  • 如果一定要自己生成,使用基于“时间戳+机器ID+序列号”的组合而不是仅仅使用时间戳。因为在并发场景,同一时刻会产生相同的ID。注意序列号如果使用随机值可能会重复。

2.数值精度

数值精度问题在计算机科学中经常出现,尤其是在涉及浮点运算、金融计算或其他高精度要求的应用中。解决数值精度问题通常需要根据具体场景采取适当的策略。

  • 【强制】使用 decimal 类型处理浮点数,可规避数值精度问题。

  • 【强制】返回给前端的浮点数使用 stirng 类型表示。

  • 【强制】在实现涉及数字精度处理的业务逻辑前,必须与需求方(如产品经理)确认需求的详细描述和业务背景,确保精度设计符合业务需求。

  • 【强制】确定统一的数字精度处理标准(如统一使用四舍五入到两位小数)

  • 【强制】增加精度相关的单元测试用例和接口测试用例,确保数字精度处理在各种场景下都能正确执行。特别是单测,可以构造遍历价格和数量涵盖业务99%使用场景的case。

  • 【建议】整数代替浮点数:在货币计算等需要高精度的场景中,使用整数而非浮点数来表示数值。例如,用最小货币单位(如分)表示金额,以避免浮点数的精度误差。

  • 【建议】合理的舍入策略,比如四舍五入:在进行浮点数计算时,可以使用四舍五入来减少累积误差。

  • 【建议】浮点数对比结果小于某个极小的的浮点数即可视为相等。

3.DB操作

外部调用包括对外部系统的调用和基础组件的调用。它具有返回时间不确定的特性,必然会导致大事务。大的数据库事务,会造成其他客户端对数据库连接的请求获取不到,那么和这个数据库相关的所有服务都有可能处于等待状态,造成数据库连接池被打满,多个服务直接宕掉。

  • 【强制】避免长事务,不要在 SQL 语句中进行网络调用「如果一定需要调用,设置网络总超时时间不能高于30ms,且拉起慎重评估」。
  • 【强制】单表数据量过大或访问量过大(有高并发读写需求)时,要有分库分表的设计。
  • 【强制】在涉及数据库操作时,必须检查正确使用事务管理。例如,确保事务开启、操作和提交的一致性。
  • 【强制】编写高效的SQL查询,避免引入慢查询和不必要的连表查询。例如,使用索引。
  • 【强制】对于大规模的数据操作,采用分批处理,避免一次性操作对系统性能的影响。
  • 【强制】在涉及多个步骤的操作中,使用数据库事务,确保操作的原子性和一致性。
  • 【强制】DB操作语句对关键字段(如条件字段)进行校验(如判空),并对不符合预期的字段进行告警监控。
  • 【建议】将长事务分解为多个短事务,每个短事务处理一部分操作。这不仅能提高系统的并发性,还能减少单个事务的执行时间。例如:分阶段提交:将事务拆分为若干阶段,每个阶段提交一次。
  • 【建议】使用缓存机制,减少数据库查询次数,提高系统性能。
  • 【建议】在功能实现过程中,优先使用经过验证的工具、库或数据源。

4.性能测试

能测试是软件测试中的一个重要环节,特别是在开发和维护 Web 服务、API 和微服务时。进行接口性能测试有如下作用:

  • 确保系统可用性:通过测试接口在高并发和长时间运行下的表现,确保系统能够在用户访问高峰期保持正常运行,避免崩溃和服务中断。
  • 识别性能瓶颈:通过分析响应时间和资源使用情况,识别出影响接口性能的瓶颈,帮助开发团队进行针对性的优化,从而提升整体系统性能。
  • 优化用户体验:快速的接口响应时间直接影响用户满意度,性能测试可以确保接口能够快速响应用户请求,提升用户体验,减少用户流失。

关于性能测试,一般遵循如下实践:

  • 【强制】涉及性能要求的业务场景,技术方案中编写性能测试用例,约定好压测目标(如单机 QPS 和 P99)。
  • 【强制】编码过程中,尽可能地将可并行的任务改为异步并行处理。选择适当的并发处理策略,如线程池、无锁算法、异步处理等,减少不必要的计算,提高请求响应效率。
  • 【强制】开发完成后,执行压测,确保在系统上线前性能达到预期标准。
  • 【建议】实现对系统性能的实时监控,及时发现和处理性能异常。配置性能异常告警,确保在性能指标超出阈值时,能够及时通知相关人员进行处理。
  • 【建议】关注极端case下的时延,也就是长尾请求(可以用对冲策略来解决)。

5.版本兼容

5.1 向旧兼容

向旧兼容也称为向后兼容(Backward Compatibility),是指在软件系统或接口更新时,确保新版本的系统或接口能够正常运行旧版本的功能或与旧版本的客户端进行交互。向旧兼容性设计对于保持系统的稳定性和用户体验至关重要,尤其是在大规模分布式系统中,向旧兼容性可以防止新版本导致的业务中断或用户操作失败。

  • 【强制】新增功能:在接口更新时,尽量以增加新功能的方式而不是修改或移除旧功能。
  • 【强制】兼容的协议。设计协议时,允许接收端忽略无法识别的字段,而不是直接拒绝处理。比如新增协议字段,而不修改旧协议字段。
  • 【强制】默认值支持:如果必须增加新的参数,确保它们具有合理的默认值,使旧版本的客户端无需更改即可继续使用。切记,默认值不要有业务含义。
  • 【建议】版本控制:引入版本控制机制,如在API路径中包含版本号(如 /api/v1/resource),确保旧版本的客户端可以继续访问原有的API版本,而不会受到新版本更改的影响。

5.2 向新兼容

向新兼容也称为向前兼容(Forward Compatibility),是指指系统、接口或协议在设计时考虑到未来的版本更新,使得当前版本能够与未来的版本兼容。这意味着即使未来的版本发生变化,当前的系统或客户端仍然能够正确地理解或处理这些变化,而不需要进行重大修改。

  • 【强制】兼容上游扩展。账户类型、品类、字段取值等,自身服务需要做到兼容,并在非法输入时,编写防御性代码来处理这些情况,做好容错。
  • 【建议】兼容性字段:在数据库设计中保留一些扩展字段或列,用于未来可能的功能扩展。

6.异步时序问题

异步时序问题是指在异步编程或系统设计中,由于事件、任务或消息的执行顺序和时间不确定,可能导致意外行为或错误的情况。这种问题在分布式系统、并发编程、异步操作等场景中尤为常见。理解并解决异步时序问题是确保系统正确性、稳定性和一致性的重要步骤。

  • 【强制】梳理清晰的依赖关系:在设计异步任务时,明确任务之间的依赖关系,保证任务处理的正确性。
  • 【强制】监控与日志记录:在异步系统中,设置详尽的监控和日志记录,及时发现并排查时序问题。
  • 【建议】防御性编程:设计系统时假设异步任务可能以任何顺序执行,并编写防御性代码来处理这些情况。
  • 【建议】异步任务测试:通过并发测试工具和方法,模拟异步任务的并发执行,提早发现可能的时序问题。

异步时序问题在并发和分布式系统中是一个复杂且常见的问题。通过合理使用同步机制、原子操作、事件驱动模型、事务处理、消息传递等手段,可以有效避免和解决这些问题。同时,清晰的设计、充足的测试和监控也在防止和诊断时序问题中起到至关重要的作用。

7.并发问题

7.1 并发时序

并发时序问题是指在多线程或并发系统中,由于不同线程或任务的执行顺序和时间不可预测,可能导致程序的行为异常或产生错误的情况。与异步时序问题类似,并发时序问题同样涉及到任务的顺序执行,但它们更多地发生在共享资源和状态之间的竞争上。

  • 【强制】梳理清晰的依赖关系:在并发处理时,明确任务之间的依赖关系,保证任务处理的正确性。
  • 【强制】并发场景,对依赖条件进行检测,满足后才能继续后面的操作。
  • 【建议】并发任务测试:通过并发测试工具和方法,模拟异步任务的并发执行,提早发现可能的时序问题。

7.2 并发数据竞争

并发数据竞争问题是指当多个线程或进程在没有正确同步的情况下,同时访问和修改共享数据时,可能导致程序的运行结果不确定,或者出现意外的行为。这种问题通常在并发编程中发生,需要特殊注意。

  • 【强制】并发编程需要注意哪些有关临界资源的访问问题,可适当使用锁来保证共享资源的互斥访问。
  • 【建议】避免数据竞争。通过减少或消除共享状态来避免数据竞争。例如,使用无状态的操作,或者将状态局限在单一线程内,避免在多个线程之间共享数据。
  • 【建议】检测与调试数据竞争。许多编译器和开发工具提供静态分析功能,可以在编译时检测潜在的数据竞争问题。比如 Golang 的 go race 检测数据竞争。

参考文献

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何编辑调试gradle,打印日志

在build.gradle.kts中输入 println("testxwg1 ") logger.lifecycle("testxwg2") logger.log(LogLevel.ERROR,"testxwg5") 点刷新就能看到打印日志了

electron-vite【实战系列教程】

创建项目 https://blog.csdn.net/weixin_41192489/article/details/144442262 安装必要的插件 UI 库 element-plus npm install element-plus --save安装 element-plus 图标 npm install element-plus/icons-vue安装插件 – 自动注册组件 vs 自动导入框架方法 npm install -…

【开源项目】数字孪生轨道~经典开源项目数字孪生智慧轨道——开源工程及源码

飞渡科技数字孪生轨道可视化平台,基于国产数字孪生引擎,结合物联网IOT、大数据、激光雷达等技术,对交通轨道进行超远距、高精度、全天侯的监测,集成轨道交通运营数据,快速准确感知目标,筑牢轨交运营生命线。…

Rstudio安装

Rstudio提供了良好的R语言代码编辑环境,R程序调试环境,图形可视化环境以及方便的R工作空间和工作目录管理。 下载网址:https://posit.co/products/open-source/rstudio/ 进入网址: 下滑找到,点击进入 找到Dsektop&am…

Chrome 浏览器原生功能截长屏

我偶尔需要截取一些网页内容作为素材,但偶尔内容很长无法截全,需要多次截屏再拼接,过于麻烦。所以记录下这个通过浏览器原生功能截长屏的方案。 注意 这种方案并不是百分百完美,如果涉及到一些需要滚动加载的数据或者悬浮区块&am…

【工具】通过js获取chrome浏览器扩展程序列表id及名称等

【工具】通过js获取chrome浏览器扩展程序列表id及名称等 第一步 打开扩展程序页面 chrome://extensions/ 第二部 注入js获取 let 扩展字典 {} document.querySelector("body > extensions-manager").shadowRoot.querySelector("#items-list").shadow…

基于LSB最低有效位的音频水印嵌入提取算法FPGA实现,包含testbench和MATLAB对比

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视…

Midjourney参数大全

基本参数​ 纵横比&#xff0c;宽高比​ --aspect&#xff0c;或--ar更改生成的纵横比。 混乱​ --chaos <number 0–100>改变结果的变化程度。更高的数值会产生更多不寻常和意想不到的结果。 图像权重​ --iw <0–2>设置相对于原始图像相识度。默认值为 1&a…

虚拟机VMware的安装问题ip错误,虚拟网卡

要么没有虚拟网卡、有网卡远程连不上等 一般出现在win11 家庭版 1、是否IP错误 ip addr 2、 重置虚拟网卡 3、查看是否有虚拟网卡 4、如果以上检查都解决不了问题 如果你之前有vmware 后来卸载了&#xff0c;又重新安装&#xff0c;一般都会有问题 卸载重装vmware: 第一…

Loki 微服务模式组件介绍

目录 一、简介 二、架构图 三、组件介绍 Distributor&#xff08;分发器&#xff09; Ingester&#xff08;存储器&#xff09; Querier&#xff08;查询器&#xff09; Query Frontend&#xff08;查询前端&#xff09; Index Gateway&#xff08;索引网关&#xff09…

EMQX V5 使用API 密钥将客户端踢下线

在我们选用开源的EMQX作为mqtt broker&#xff0c;我们可能会考虑先让客户端连接mqtt broker成功&#xff0c;再去校验客户端的有效性&#xff0c;当该客户端认证失败&#xff0c;再将其踢下线。例如&#xff1a;物联网设备连接云平台时&#xff0c;我们会将PK、PS提前烧录到设…

Python中所有子图标签Legend显示详解

在数据可视化中&#xff0c;图例&#xff08;legend&#xff09;是一个非常重要的元素&#xff0c;它能够帮助读者理解图表中不同元素的含义。特别是在使用Python进行可视化时&#xff0c;matplotlib库是一个非常强大的工具&#xff0c;能够轻松创建包含多个子图的图表&#xf…

TCP套接字通信与守护进程

目录 TCP socket API 详解 代码实现TCP通讯 服务端 客户端 Task 守护进程 守护进程 前台与后台 Linux进程间关系 ​编辑 设置为独立会话setsid daemon接口 为什么需要设置umask 会话ID与组ID TCP的相关机制 下图是基于TCP协议的客户端/服务器程序的一般流程: 数…

单点登录平台Casdoor搭建与使用,集成gitlab同步创建删除账号

一&#xff0c;简介 一般来说&#xff0c;公司有很多系统使用&#xff0c;为了实现统一的用户名管理和登录所有系统&#xff08;如 GitLab、Harbor 等&#xff09;&#xff0c;并在员工离职时只需删除一个主账号即可实现权限清除&#xff0c;可以采用 单点登录 (SSO) 和 集中式…

OCR:文字识别

使用场景: 远程身份认证 自动识别录入用户身份/企业资质信息&#xff0c;应用于金融、政务、保险、电商、直播等场景&#xff0c;对用户、商家、主播进行实名身份认证&#xff0c;有效降低用户输入成本&#xff0c;控制业务风险 文档电子化 识别提取各类办公文档、合同文件、企…

亚信安全春节14天双倍假期通告

亚信安全14天双倍假期来袭 “网安福利王”再次实至名归 2024年 8773小时&#xff0c;31582680秒 亚信安全一直驰骋于云网安世界 奋战在“安全 数智化”的壮阔征途上 如今&#xff0c;新春的脚步渐近 长达14天的春节长假 能让我们暂且放下忙碌的工作 去除班味&#xff0c…

使用Python打开资源管理器并选择文件

from PySide6.QtWidgets import QFileDialogdef openSelectFile(Path):filename, _ QFileDialog.getOpenFileName(Path, "打开文件", "", "所有文件 (*)")if filename:print(f"选择的文件: {filename}")return filename 代码解释 &a…

uniapp blob格式转换为video .mp4文件使用ffmpeg工具

前言 介绍一下这三种对象使用场景 您前端一旦涉及到文件或图片上传Q到服务器&#xff0c;就势必离不了 Blob/File /base64 三种主流的类型它们之间 互转 也成了常态 Blob - FileBlob -Base64Base64 - BlobFile-Base64Base64 _ File uniapp 上传文件 现在已获取到了blob格式的…

五、windows上vscode构建c/c++环境

1、安装vscode 官网下载界面&#xff1a;https://code.visualstudio.com/Download 请根据电脑系统安装所需版本点击下载链接&#xff08;一般情况下点击windows按钮即可&#xff09;鼠标左键双击&#xff0c;即可运行安装程序&#xff0c;点击【确认】&#xff1b;选择安装路径…

ElasticSearch中的模糊搜索:为什么输入错误还能搜索出来?

引言 在日常搜索中&#xff0c;用户经常会因为拼写错误或输入笔误导致搜索结果不准确。然而&#xff0c;ElasticSearch 提供了一种非常智能的模糊搜索&#xff08;Fuzzy Search&#xff09;功能&#xff0c;使得即使关键词输入错误&#xff0c;依然能够返回准确或接近的结果。…