微服务设计原则——功能设计
文章目录
- 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 检测数据竞争。
参考文献
相关文章:
微服务设计原则——功能设计
文章目录 1.ID生成2.数值精度3.DB操作4.性能测试5.版本兼容5.1 向旧兼容5.2 向新兼容 6.异步时序问题7.并发问题7.1 并发时序7.2 并发数据竞争 参考文献 1.ID生成 在分布式系统中,生成全局唯一ID是非常重要的需求,因为需要确保不同节点、服务或实例在并…...

低代码软件搭建自学的第一天——熟悉PyQt
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 学习计划第 1 步:环境搭建1.1 安装 Python1.2 安装 PyQt安装命令:验证安装: 第 2 步:PyQt 基础知识2.1 创建第一个窗…...

基于Python3编写的Golang程序多平台交叉编译自动化脚本
import argparse import os import shutil import sys from shutil import copy2from loguru import loggerclass GoBuild:"""一个用于构建跨平台执行文件的类。初始化函数,设置构建的主文件、生成的执行文件名称以及目标平台。:param f: 需要构建的…...

远程桌面连接
电脑A:使用机 电脑B:被控制的另一个 方法1: 在电脑B上操作 ①winr输入cmd进入命令行窗口,输入ipconfig查询本机地址 ②我的电脑/此电脑 右键点击“属性” ③选择屏幕右边“远程桌面” ④打开“启用远程桌面” ⑤打开设置&am…...
网络地址转换NAT
NAT(Network Address Translation) 方法于1994年提出。需要在专用网连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球地址IPG。 所有使用本地地址的主机在和外界通信时都要在NAT路由器上将其本地地址转换成外部全球…...

什么是CRM管理软件?CRM的基本概念、功能、选择标准、应用场景
什么是CRM管理软件? 嘿,大家好!今天咱们聊聊一个在现代企业管理中非常重要的工具——CRM管理软件。CRM是Customer Relationship Management(客户关系管理)的缩写,简单来说,它就是一个帮助企业和…...

Python编程常用的19个经典案例
Python 的简洁和强大使其成为许多开发者的首选语言。本文将介绍36个常用的Python经典代码案例。这些示例覆盖了基础语法、常见任务、以及一些高级功能。 1. 列表推导式 fizz_buzz_list ["FizzBuzz" if i % 15 0 else "Fizz" if i % 3 0 else "Buzz…...

【Unity基础】AudioSource 常用方法总结
在 Unity 中,AudioSource 组件用于控制音频的播放和管理。以下是常用的 AudioSource 控制方法及其说明。 1. 播放和暂停音频 Play():开始播放音频,如果是从暂停的地方继续播放,可以直接调用。Pause():暂停当前播放的…...
CSS系列(25)-- 滚动优化详解
前端技术探索系列:CSS 滚动优化详解 📜 致读者:探索流畅滚动的艺术 👋 前端开发者们, 今天我们将深入探讨 CSS 滚动优化,学习如何创建流畅、高性能的滚动体验。 平滑滚动 🚀 基础设置 /* …...

CST天线设计的六大核心特点:为天线分析提供完整解决方案!
CST Studio Suite 为天线设计提供了从最初的概念评估到最终的合规性测试所需的所有功能,确保天线设计在各种环境下实现稳定通信。这一套工具覆盖了所有重要的设计阶段,帮助设计师顺利完成从概念到成品的全过程。 下面我们来看一看CST电磁仿真中天线设计…...

Ubuntu下C语言操作kafka示例
目录 安装kafka: 安装librdkafka consumer Producer 测试运行 安装kafka: Ubuntu下Kafka安装及使用_ubuntu安装kafka-CSDN博客 安装librdkafka github地址:GitHub - confluentinc/librdkafka: The Apache Kafka C/C library $ apt in…...

怎么将pdf中的某一个提取出来?介绍几种提取PDF中页面的方法
怎么将pdf中的某一个提取出来?传统上,我们可能通过手动截取屏幕或使用PDF阅读器的复制功能来提取信息,但这种方法往往不够精确,且无法保留原文档的排版和格式。此外,很多时候我们需要提取的内容可能涉及多个页面、多个…...

HTTP接口报错详解与解决 200,500,403,408,404
前言: 仅做学习记录,侵删 背景 当后端编写接口时,经常需要对接口使用ApiFox或者PostMan进行测试,此时就会出现各种各样的报错,一般都会包括报错编码:200,400,401等。这个状态码一般是服务器所返回的包含…...
监控IP频繁登录服务器脚本
该脚本的作用是监控IP登录失败次数,如果某个IP的登录失败次数超过设定的最大次数,则阻止该IP的进一步登录尝试。通过iptables防火墙阻止连接,当一个IP尝试登录次数超过5次时,iptables会阻止来自该IP的所有连接 #!/bin/bashfuncti…...
分布式链路追踪-03-Jaeger、Zipkin、skywalking 中的 span 是如何设计的?
开源项目 auto-log 自动日志输出 Jaeger、Zipkin 中的 spanId 是如何生成的? 在 Jaeger 和 Zipkin 这两个分布式跟踪系统中,Span ID 是通过不同的方法生成的。 下面分别介绍它们的生成方式: Jaeger 中的 Span ID 生成: 在 Ja…...
【达梦数据库】获取对象DDL
目录 背景获取表的DDL其他 背景 在排查问题时总会遇到获取对象DDL的问题,因此做以下总结。 获取表的DDL 设置disql工具中显示LONG类型数据的最大长度,避免截断: SET LONG 9999获取DDL SELECT DBMS_METADATA.GET_DDL(TABLE,表名,模式名) …...
InnoDB和MyISAM引擎优缺点和区别
nnoDB和MyISAM是MySQL数据库中常用的两种存储引擎。它们各自具有不同的特性和优势,适用于不同的应用场景。 一、InnoDB引擎: 1、它有如下特性: 1)、支持事务(ACID) 2)、支持外键约束(FOREIGN KEY const…...

文件上传知识点汇总
归纳总结一下文件上传(其实是懒得写wp) 基于Dream ZHO师傅的CTF show 文件上传篇(web151-170,看这一篇就够啦)-CSDN博客 和dota_st 师傅的ctfshow-Web1000题系列修炼(一) | dota_st 做一篇自己的总结 目录 一、什么…...
计算机网络技术基础:5.数据通信系统
一、数据通信的基本概念 1.信息 信息是对客观事物的运动状态和存在形式的反映,可以是客观事实的形态、大小、结构、性能等描述,也可以是客观事物与外部之间的联系。信息的载体可以是数字、文字、语音、图形和图像等。计算机及其外围设备产生和交换的信息…...

光谱相机在农业的应用
一、作物生长监测1、营养状况评估 原理:不同的营养元素在植物体内的含量变化会导致植物叶片或其他组织的光谱反射率特性发生改变。例如,氮元素是植物叶绿素的重要组成部分,植物缺氮时,叶绿素含量下降,其在可见光波段&a…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...