亿级流量系统架构设计与实战(六)

news2025/7/15 12:59:01

微服务架构与网络调用

当某个业务从单体服务架构转变为微服务架构后,多个服务之间会通过网络调用形式形成错综复杂的依赖关系。

在微服务架构中 , 一个微服务正常工作依赖它与其他微服务之间的多级网络调用。

网络是脆弱的 , RPC 请求有较大的概率会遇到超时 、 抖动 、 断开连接等各种异常情况 , 这些都会直接影响微服务的可用性。

上游下游

当微服务 A 是微服务 B 的调用方时 , 我们称 B 是 A 的下游服务 , 而 A 是 B 的上游服务 。

  • 如上图,内容列表服务是个人页服务的下游服务,内容列表服务、内容服务、关系服务是计数服务的上游服务。

解决影响服务可用性的问题,从以下两方面考虑

  • 容错性设计
    • 要接受网络脆弱与下游服务质量不可靠的事实 , 并在进行服务设计时充分考虑相应故障产生时的容错方案 。
  • 流量控制
    • 既要对上游服务调用采取预防性策略,防止打垮我们的服务;
    • 也要对下游服务有感知与保护意识 , 当感知到下游服务的质量下滑甚至服务不可用时 ,及时通过自身保护下游服务。

重试与降级是容错性设计的具体表现形式。

熔断、隔离与限流则是流量控制的常见实现方式。

重试

对于服务间 RPC 请求遇到网络抖动的情况,最简单的解决办法就是重试。

幂等接口

超时可能出现在请求处理的多个阶段:

  • RPC 请求发送超时,此时下游服务并未收到 RPC 请求 。
  • RPC 请求处理超时,下游服务已经收到 RPC 请求,但是处理时间过长 。
  • RPC 响应报文超时,下游服务已经处理完 RPC 请求,但是响应报文超时未回复。

服务器是无法判断 RPC 请求是否被下游服务成功处理,只能假定最坏的情况:下游服务已经成功处理请求 ,但是我们的服务没有收到响应信息。

如果我们的服务要进行重试,那么下游服务必须保证再次处理同一请求的结果与用户预期相符。

怎样才算与用户预期相符呢 ?

举一个电商产品下单服务的例子。 用户选择购买价格为100 元的产品时 , 下单服务会调用用户账户服务的扣款接口 , 从用户的余额中扣除 100 元 。

假如用户账户服务已经成功从用户的余额中扣除 100 元,但是对下单服务请求的响应超时 ,这时下单服务将重试调用扣款接口 。 如果用户的余额再次被扣除 100 元 , 即用户实际支付200 元才下单了这个价格为 100 元的产品 , 那么这就不是与用户预期相符的情况 。

理论上 ,无论重试调用扣款接口多少次 , 用户的余额最终仅应该被扣除 100 元 。

幂等

幂等:幂等指的是对于某系统接口,无论同一请求被重复执行多少次,都应该与执行一次的结果相同

可以被重试调用的接口应该满足幂等性,只有幂等接口可以被安全地重试调用

  • 读性质的 RPC 接口 ( 即读接口 ) 天然都是幂等接口, 因为无论读接口执行多少次都不会改变数据 ;
  • 写性质的 RPC 接口 ( 即写接口 ) 会改变数据 , 所以需要查看多次改变数据的结果是否与一次改变数据的结果相同 。
    • 以 SQL 语句为例:
    • 覆盖操作:UPDATE table1 SET col1 = X WHERE col2 = Y,执行多次语句 col1 仍为 X,是幂等操作。
    • 更新操作:UPDATE table1 SET col1=col1 + 1 WHERE col2 = Y,每执行一次 col1 都会发生变化,不幂等。
    • 插入操作:INSERT INTO table1 (col1,col2) VALUES(X,Y),执行多次会插入多条数据,不幂等。

涉及非幂等写操作的接口可以通过幂等性被设计成幂等接口。

数据库操作设计幂等

插入操作:对数据库的相关数据表设置唯一键。重复调用此接口时,数据库会报出 “ 键重复 ” 错误 , 表示此数据已经被插入。

更新操作:借鉴 CAS ( Compare And Swap , 比较与替换)的思想 , 为行数据引入数据版本号 , 重写 SQL 语句如下 :UPDATE tablel SET col1 = col1 + l WHERE version = X AND col2 = Y

通用幂等设计

对于每个请求,使用分布式唯一 ID 作为 UUID,同时在接口侧保存已处理的请求记录

请求调用接口时,由接口侧根据请求的唯一标识查询已处理的请求记录,若找到,说明已经处理过,直接返回即可。

Redis 分布式锁

接口使用 Redis 的 SET 命令保存已处理请求的 UUID,并结合 NX 参数保证:当且仅当键不存在时才成功写入 , 否则不写入。

  1. 接口接收请求后 , 先尝试在 Redis 中执行 SET UUID NX 命令写入请求的 UUID 。
  2. 如果 Redis 写入成功 , 则说明此请求未被接口处理过 , 接口可以真正处理此请求

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

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

相关文章

浅聊find_package命令的搜索模式(Search Modes)

背景 find_package应该算是我们使用最多的cmake命令了。但是它是如何找到上游库的.cmake文件的? 根据官方文档,整理下find_package涉及到的搜索模式。 搜索模式 find_package涉及到的搜索模式有两种:模块模式(Module mode)和配置模式(Conf…

【LLaMA-Factory】使用LoRa微调训练DeepSeek-R1-Distill-Qwen-7B

【LLaMA-Factory】使用LoRa微调训练DeepSeek-R1-Distill-Qwen-7B 本地环境说明禁用开源驱动nouveau安装nvidia-smi安装Git环境安装Anaconda(conda)环境下载DeepSeek-R1-Distill-Qwen-7B模型安装LLaMA-Factory下载LLaMA-Factory安装LLaMA-Factory依赖修改环境变量安装deepspeedA…

使用lldb查看Rust不同类型的结构

目录 前言 正文 标量类型 复合类型——元组 复合类型——数组 函数 &str struct 可变数组vec Iter String Box Rc Arc RefCell Mutex RwLock Channel 总结 前言 笔者发现这个lldb挺好玩的,可以查看不同类型的结构,虽然这好像是C的东…

【Linux】线程POSIX信号量

目录 1. 整体学习思维导图 2. 信号量的概念 3. 基本接口 4. 基于环形队列的生产者消费者模型(信号量) 1. 整体学习思维导图 2. 信号量的概念 POSIX信号量和SystemV信号量作用相同,都是用于同步操作,达到无冲突的访问共享资源目的。但 POSIX可以用于线…

MySQL事务和JDBC中的事务操作

一、什么是事务 事务是数据库操作的最小逻辑单元,具有"全有或全无"的特性。以银行转账为例: 典型场景: 从A账户扣除1000元 向B账户增加1000元 这两个操作必须作为一个整体执行,要么全部成功,要么全部失败…

每日脚本学习5.10 - XOR脚本

xor运算的简介 异或就是对于二进制的数据可以 进行同0异1 简单的演示 : 结果是 这个就是异或 异或的作用 1、比较两数是否相等 2、可以进行加密 加密就是需要key 明文 :0b010110 key : 0b1010001 这个时候就能进行加密 明文 ^ key密文 还有这个加密比…

【编译原理】总结

核心 闭包,正则闭包 产生式(规则) 文法 G[S](,,P,S) 一组规则的集合 :非终结符 :终结符 P:产生式 S:开始符号 推导 归约 规范(最右&#xff…

docker创建一个centOS容器安装软件(以宝塔为例)的详细步骤

备忘:后续偶尔忘记了docker虚拟机与宿主机的端口映射关系,来这里查看即可: docker run -d \ --name baota \ --privilegedtrue \ -p 8888:8888 \ -p 8880:80 \ -p 8443:443 \ -p 8820:20 \ -p 8821:21 \ -v /home/www:/www/wwwroot \ centos…

OpenVLA:开源的视觉-语言-动作模型

1. 简介 让我们先来介绍一下什么是OpenVLA,在这里: https://openvla.github.io/ 可以看到他们的论文、数据、模型。 OpenVLA 是一个拥有 70亿参数的开源 **视觉-语言-动作(VLA)**模型。它是在 Open X-Embodiment 数据集 中的 97万…

Matlab/Simulink的一些功能用法笔记(4)

水一篇帖子 01--MATLAB工作区的保护眼睛颜色设置 默认的工作区颜色为白色 在网上可以搜索一些保护眼睛的RGB颜色参数设置 在MATLAB中按如下设置: ①点击预设 ②点击颜色,点击背景色的三角标符号 ③点击更多颜色,找到RGB选项 ④填写颜色参数…

Elasticsearch:我们如何在全球范围内实现支付基础设施的现代化?

作者:来自 Elastic Kelly Manrique SWIFT 和 Elastic 如何应对基础设施复杂性、误报问题以及日益增长的合规要求。 金融服务公司在全球范围内管理实时支付方面面临前所未有的挑战。SWIFT(Society for Worldwide Interbank Financial Telecommunication -…

matlab介绍while函数

MATLAB 中的 while 语句介绍 在 MATLAB 中,while 语句是一种循环结构,用于在满足特定条件时反复执行一段代码块。与 for 循环不同,while 循环的执行次数是动态的,取决于循环条件是否为真。 语法 while condition% 循环体代码 e…

如何解决 PowerShell 显示 “此系统上禁用了脚本运行” 的问题

在 Windows 11 或 10 的 PowerShell 中运行脚本时,你可能会遇到一个错误,提示系统上禁用了脚本运行。这是一种安全功能,而不是系统问题,旨在防止可能有害的脚本自动运行。然而,如果你需要运行脚本来完成某些任务,或者你在系统上做了软件开发或测试的环境,那么你需要在 P…

深入浅出之STL源码分析4_类模版

1.引言 我在上面的文章中讲解了vector的基本操作,然后提出了几个问题。 STL之vector基本操作-CSDN博客 1.刚才我提到了我的编译器版本是g 11.4.0,而我们要讲解的是STL(标准模板库),那么二者之间的关系是什么&#x…

初学者入门指南:什么是网络拓扑结构?

初学者入门指南:什么是网络拓扑结构? 在构建或学习计算机网络时,一个绕不开的核心概念便是“网络拓扑结构”(Network Topology)。它决定了网络中各个设备如何连接、通信以及如何扩展。理解网络拓扑不仅有助于我们更清…

Satori:元动作 + 内建搜索机制,让大模型实现超级推理能力

Satori:元动作 内建搜索机制,让大模型实现超级推理能力 论文大纲一、背景:LLM 推理增强的三类方法1. 基于大规模监督微调(SFT)的推理增强2. 借助外部机制在推理时进行搜索 (RLHF / 多模型 / 工具)3. 现有局限性总结 二…

SDC命令详解:使用all_outputs命令进行查询

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html all_outputs命令用于创建一个输出端口对象集合,关于设计对象和集合的更详细介绍,可以参考下面的博客。 Synopsys:设计对象https://chenzhang.blog.csdn…

printf调试时候正常,运行时打印不出来

问题是在添加了 printf 功能后,程序独立运行时无法正常打印输出,而调试模式下正常。这表明问题可能与 printf 的重定向实现、标准库配置、或编译器相关设置有关。 解决: 原来是使用 Keil/IAR,printf可能需要启用 MicroLIB 或正确…

解决 TimeoutError: [WinError 10060] 在 FramePack项目中连接 Hugging Face 超时的问题

#工作记录 以下是针对 TimeoutError: [WinError 10060] 的完整排查方案,适用于 FramePack项目中。 (一般该错误的发生原因请重点排查Hugging Face模型仓库受限需要登录的情形) FramePack项目参考资料 FramePack部署(从PyCharm解…

分布式-Redis分布式锁

Redis实现分布式锁优点 (1)Redis有很高的性能; (2)Redis命令对此支持较好,实现起来比较方便 实现思路 (1)获取锁的时候,使用setnx加锁,并使用expire命令为锁…