服务架构的设计原则
墨菲定律与康威定律
在系统设计的时候,可以依据于墨菲定律
- 任何事情都没有表面上看起来那么简单
- 所有的事情都会比你预计的时间长
- 可能出错的事总会出错
- 担心的某一个事情的发送,那么它就更有可能发生
在系统划分的时候,可以依据康威定律
- 系统架构与公司的组织架构是相似的
- 应按照业务闭环进行系统拆分/组织架构拆分,实现闭环/高内聚/低耦合,减少沟通成本
核心关键点
- 可伸缩性(Scalability):系统应该能够根据需要进行水平或垂直扩展,以应对不断增长的用户量和负载。可伸缩性的实现可以通过使用负载均衡、分布式计算、缓存等技术手段。
- 高可用性(High Availability):系统应该具备高可用性,即在面对故障或部分组件失效时,仍能保持正常运行。为了实现高可用性,可以采用冗余备份、故障转移、容灾等策略。
- 弹性(Resilience):系统应该具备弹性,能够在面对异常情况时快速恢复正常状态。弹性的实现可以通过监控、自动化故障恢复、灾难恢复等方式。
- 可扩展性(Extensibility):系统应该具备可扩展性,能够方便地添加新功能或模块,以满足不断变化的需求。可扩展性的实现可以通过模块化设计、松耦合、插件化等方式。
- 安全性(Security):系统应该具备安全性,能够保护用户数据和系统资源免受未经授权的访问、攻击或滥用。安全性的实现可以包括身份认证、访问控制、数据加密等措施。
- 可管理性(Manageability):系统应该具备良好的可管理性,使得系统的部署、监控、维护和调试都能够方便进行。可管理性的实现可以通过日志记录、性能监控、自动化运维等方式。
- 性能(Performance):系统应该具备良好的性能,能够在可接受的时间内响应用户请求并处理大量的并发操作。性能的实现可以通过优化算法、缓存、异步处理等手段。
- 可靠性(Reliability):系统应该具备可靠性,即能够在长时间运行中保持稳定的状态,不会出现系统崩溃或数据丢失等问题。可靠性的实现可以通过容错设计、数据备份、错误处理等方式。
设计原则
幂等设计
幂等性对大多数同志来说是容易忽视的问题,但无论是单体还是微服务都会考虑这个问题,相对而言微服务项目在项目运行中是非常需要关注的问题。在项目中如服务与服务之间的消息通讯,目标服务没有及时处理或者返回,调用方服务可能会采取重试机制,此时可能就会造成服务端对同一个任务处理两次的情况,顾需要考虑幂等性的设计防止这种情况的产生。
无状态
如果服务存在状态对整个系统而言就会降低扩展,如果服务无状态,那么应用比较容易进行水平扩容。实际生成环境中可能是应用无状态,配置文件是有状态的,那么我们就可以考虑通过配置中心指定。
消息队列
消息队列在项目中多以处理耗时任务、异步任务为主,但也可以用于流量削峰/缓冲等。但在使用消息队列的时候需要考虑生产消息失败,以及消息重复接收的场景。目前的一些消息队列机制如rabbitmq、kafka等都有相关的应对方案。但在设计的时候对系统来说如果不能容忍失败的时候,一定要做好数据的后续处理,比如将数据持久化,设置警告。

在使用了消息队列的情况下还可能存在数据丢失的情况,因此需要考虑对数据进行校验来保证数据的一致性和完整性。可以通过worker定期检查对应日志,对数据校验,如果存在问题进行补尝。
数据异构/聚合
此项主要应用在高并发的场景,比如以课程详情为例,它所要展示的课程详情信息需要从多个服务中获取,然后再汇总返回给用户。

如果每次都是从多个服务中获取,这样读性能会降低。此时我们可以将课程所需要的数据进行异构到课程服务中,然后对相关的数据进行聚合存储,形成数据的闭环,
-
数据异构:通过
mq机制接收数据的变更,然后序列化存储到合适的存储引擎中 -
数据聚合:把多个服务的数据源拿过来,提前就根据业务组装好数据结构存储到
kv存储中 -
前端展示:前端通过一次或少量调用就可以获取到所有需要的数据。
如下示例:可以基于cannal监听各个服务mysql的binlog日志,然后通过worker同步并聚合到mongodb中,用户获取课程信息就可以从mongodb中获取到数据。

多级缓存
在系统中:我们可以根据服务的数据情况,在各个层级之间合理设置缓存。节点有:客户端→客户端网络→CDN→接入层→应用层→分布式缓存
客户端如果为APP则可以将一些素材缓存到客户端里,而浏览器则可以缓存一些实时不高的数据,如评价、广告词、logo等。
在接入层往往应用的是nginx,我们可以设置nginx的代理缓存来实现。
对应用层和分布式缓存而言主要缓存具有变化性的,并且要是实时较高并访问频率高的数据。
在运用缓存的时候需考虑缓存的更新时间点。
并发化
假设我们有如下数据
目标数据 数据A 数据B 数据C 数据D 数据E
获取时间 20ms 10ms 30ms 5ms 15ms
依赖关系 无 依赖A 无 依赖A、B 无
如果程序串联执行则需要80ms。
如果我们并发化获取,则需要35ms,能提升一倍的性能。

限流
限流的目的是防止恶意请求流量、恶意攻击,或者防止流量超出峰值。
- 流量的控制可以用
nginx的limit模块,或者自己在应用层采用的限流算法处理如:令牌桶算法 - 对恶意请求的
ip可以用nginx的deny进行处理。
相关文章:
服务架构的设计原则
墨菲定律与康威定律 在系统设计的时候,可以依据于墨菲定律 任何事情都没有表面上看起来那么简单所有的事情都会比你预计的时间长可能出错的事总会出错担心的某一个事情的发送,那么它就更有可能发生 在系统划分的时候,可以依据康威定律 系…...
Day 14:2938. 区分黑球和白球
Leetcode 2938. 区分黑球和白球 桌子上有 n 个球,每个球的颜色不是黑色,就是白色。 给你一个长度为 n 、下标从 0 开始的二进制字符串 s,其中 1 和 0 分别代表黑色和白色的球。 在每一步中,你可以选择两个相邻的球并交换它们。 返…...
部署YUM仓库及NFS共享服务
YUM概述 YUM 基于RPM包构建的软件更新机制 可以自动解决依赖关系 所有软件包由集中的YUM软件仓库提供 YUM只允许一个程序运行,虽然不影响命令的使用。DNF后,允许多个程序允许 YUM的配置文件在/etc/yum.conf 网络源(所有以repo为结尾都是源&am…...
web学习笔记(六十五)
目录 1. Hash模式和History模式 2. 导航守卫 3. 路由元信息 4.路由懒加载 1. Hash模式和History模式 Hash模式(哈希模式)和History模式(历史模式)是匹配路由的两种模式,一般默认配置Hash模式,可以在in…...
66. UE5 RPG 实现远程攻击武器配合角色攻击动画
在制作游戏中,我们制作远程攻击角色,他们一般会使用弓箭,弩,弹弓等武器来进行攻击。比如你使用弓箭时,如果角色在播放拉弓弦的动画,但是弓箭武器没有对应的表现,会显得很突兀。所以,…...
用 Python 编写自动发送每日电子邮件报告的脚本,并指导我如何进行设置
编写一个自动发送每日电子邮件报告的脚本涉及几个步骤。我们需要使用 Python 编写脚本,并使用一些库来发送电子邮件。下面是一个示例脚本和设置步骤。 第一步:安装必要的库 我们需要安装 smtplib 和 email 库。可以通过以下命令安装: pip …...
AI大模型的战场:通用与垂直的较量
目录 AI大模型的战场:通用与垂直的较量 1.引言 2.通用大模型的优势 2.1 概念 2.2 谷歌的BERT模型 2.3 OpenAI的GPT模型 2.4 微软的Visual Studio Code 2.5 结论 3.垂直大模型的崛起 3.1 概念 3.2 医疗影像分析的AI模型 3.3 自动驾驶领域的AI模型 3.4 金…...
单目标应用:基于人工原生动物优化器APO的微电网优化(MATLAB代码)
一、微电网模型介绍 微电网多目标优化调度模型简介_vmgpqv-CSDN博客 参考文献: [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、人工原生动物优化算法求解微电网 2.1算法简介 人工原生动物优化器&am…...
USB端口管控软件|USB端口控制软件有哪些(小技巧)
USB端口管控软件成为了保障企业数据安全的重要手段。 本文将为您介绍几款知名的USB端口控制软件,并分享一些实用的小技巧,帮助您更好地管理US端口,确保企业信息安全。#usb接口# 一、USB端口控制软件推荐 1,域智盾 域智盾是一…...
CorelDRAW2024官方最新中文破解版Crack安装包网盘下载安装方法
在设计的世界里,软件工具的更新与升级总是令人瞩目的焦点。近期,CorelDRAW 2024中文版及其终身永久版的发布,以及中文破解版Crack的出现,再次掀起了设计圈的热潮。对于追求专业精确的设计师而言,了解这些版本的下载安装…...
Mysql学习(八)——多表查询
文章目录 五、多表查询5.1 多表关系5.2 多表查询概述5.3 内连接5.4 外连接5.5 自连接5.6 联合查询5.7子查询5.8 总结 五、多表查询 5.1 多表关系 概述:项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,…...
LabVIEW进行图像拼接的实现方法与优化
在工业检测和科研应用中,对于大尺寸物体的拍摄需要通过多次拍摄后进行图像拼接。LabVIEW 作为强大的图形化编程工具,能够实现图像拼接处理。本文将详细介绍LabVIEW进行图像拼接的实现方法、注意事项和提高效率的策略。 图像拼接的实现方法 1. 图像采集…...
纷享销客安全体系:安全合规认证
安全合规认证是指组织通过独立的第三方机构对其信息系统和数据进行评估和审查,以确认其符合相关的安全标准、法律法规和行业要求的过程。 安全合规认证可以帮助组织提高信息系统和数据的安全性,并向客户、合作伙伴和监管机构证明其符合相关的安全标准和…...
推荐这两款AI工具,真的很好用
巨日禄 巨日禄是一款由杭州巨日禄科技有限公司开发的AI工具,主要功能是将文本内容转换为视频。该工具通过分析大量的剧本数据和影视作品,为用户提供各种类型的故事情节和角色设置,帮助用户快速找到灵感,减少构思剧本的困难和犹豫。…...
装饰器在实际开发中的作用
首先先说说装饰器的整体优点。 使用装饰器可以实现代码的模块化、可重用性。当需要对多个函数进行相同的功能增强时,通过装饰器可以避免重复代码的编写,提高开发效率。 1、权限检查:通过装饰器可以在函数执行之前检查用户权限,决…...
JVM学习-监控工具(三)
jconsole 从Java5开始,在JDK中自带的java监控和管理控制台用于对JVM中内存、线程、和类等的监控,是一个基本JMX(java management extendsions)的GUI性能监控工具 三种连接方式 Local:使用JConsole连接是一个正在本地系统运行的JVM…...
GPU显卡计算能力怎么算?
GPU的算力指的是什么? GPU的计算能力可以使用FLOPS表示,FLOPS是floating-point operations per second的缩写,表示“每秒所执行的浮点运算次数”。是被用来估算处理的计算能力 1 MFLOPS 每秒可以执行一百万(10^6)次浮点运算 1 GFLOPS 每秒可以执行十…...
Spark参数配置不合理的情况
1.1 内存设置 💾 常见的内存设置有两类:堆内和堆外 💡 我们作业中大量的设置 driver 和 executor 的堆外内存为 4g,造成资源浪费 📉。 通常 executor 堆外内存在 executor.cores1 的时候,1g 足够了&…...
【OpenGL学习】OpenGL不同版本渲染管线汇总
文章目录 一、《OpenGL编程指南》第6版/第7版的渲染管线二、《OpenGL编程指南》第8版/第9版的渲染管线 一、《OpenGL编程指南》第6版/第7版的渲染管线 图1. OpenGL 2.1、OpenGL 3.0、OpenGL 3.1 等支持的渲染管线 二、《OpenGL编程指南》第8版/第9版的渲染管线 图2. OpenGL …...
等保测评练习
等级保护初级测评师试题11 姓名: 成绩: 判断题(10110分) 1. windows使用"service -status-all | grep running"命令查看危险的网络服务是否已经关闭。( F ) …...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
