一种复杂业务场景的解决方案(代码结构)

2023-10-27

背景

我个人负责交易线的一些服务优化工作,如购物车、预购单等,这些服务是前台服务,需要基于很多中台服务能力来实现业务功能,中台服务如商品中心、协议中心、用户中心、营销活动等,前台服务通过RPC调用中台服务获取数据。

在2020年度的优化工作汇报中,我统计了一组数据,有50%的接口是因为重复或者循环RPC导致的慢接口,其中重复RPC非常常见,鉴于此问题以及基于我们的优化方式,最终提出了一套适用的解决方案。

解决方案

在这里插入图片描述

优点

  • 有效规避重复PRC,所有数据都在context中,读写方便
  • 有效规避事务中RPC,加事务注解的方法如果需要某个RPC的数据,只需从context中取,否则容易造成事务中RPC,或者需要调整代码结构
  • 结构清晰,业务逻辑大致可分为五个模块,每个模块功能独立且统一
  • 业务扩展性好,如业务需求新增一项校验,依赖了商品数据,从context中取非常方便;否然为了规避重复查询,需要大改结构
  • 便于并行查询,如遇到多个耗时RPC,可以快速选择并行查询,提高整体查询速度
  • 便于做耗时统计,耗时通常发生在RPC和DB,统一的模块便于开发快速定位耗时点

最后

该方法并非适用于所有场景,比如我们的PRC B依赖RPC A的业务处理结果,这个时候需要做一些判断,比如RPC B的代价是否很大,如果不大,直接查询是OK的;但如果RPC B代价很大且多半经过业务处理后,RPC B只在极少数场景下才会需要执行,这时我们就会选择将RPC B放到具体的业务处理中,而不是context中。

最后再把我全年的优化感悟贴在下方

关注我们的接口性能,不要循环RPC、不要重复RPC、不要复杂SQL,写简洁干净的代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一种复杂业务场景的解决方案(代码结构) 的相关文章

  • 如何在测试套件中定义 JUnit 方法规则?

    我有一个类 它是 JUnit 测试类的 JUnit 套件 我想定义一个规则on the suite 这是可以做到的 但需要做一些工作 您还需要定义自己的 Suite 运行程序和测试运行程序 然后在测试运行程序中重写 runChild 使用以
  • Spring控制器是线程安全的吗

    我遇到了这个控制器示例 想知道它是否是线程安全的 我特别想知道 gson 实例变量 import org springframework stereotype Controller import org springframework we
  • Android - 如何访问 onResume 中 onCreate 中实例化的 View 对象?

    In my onCreate 方法 我正在实例化一个ImageButton View public void onCreate Bundle savedInstanceState super onCreate savedInstanceSt
  • Google 地图查询返回的 JSON 包含像 \x26 这样的编码字符(如何解码?)

    在 Java 应用程序中 我获取 JSON 来自 Google 地图 其中包含以下字符 x26我想将其转换为其原始字符 据我所知 这是一个 UTF 8 表示法 但我不完全确定 在源 JSON 中 可能会出现各种编码字符 例如 x3c div
  • 用 @DataJpaTest 注释的测试不是用 @Autowired 注释的自动装配字段

    我有一个 Spring Boot 应用程序 其中包含 Spring Data Jpa 存储库 我需要围绕这个存储库运行单元 或组件 测试 我对 Spring Data Jpa 没有太多经验 这是我的测试 这很简单 我无法让它通过 impor
  • MP3:一种以毫秒为单位获取任何给定字节位置的位置的方法?

    我创建了一个 servlet 它返回从客户端请求的任何给定字节位置开始的流 来自 MP3 文件 这允许客户端在任何给定字节位置立即开始播放 而无需进行任何本地查找 现在 我有一个滑块可以直观地显示进度 我正在使用当前字节位置来更新滑块 但是
  • JTree 节点不会被直观地选择

    不知何故 我无法为我的 JTree 节点启用 选择突出显示 我正在我的项目中使用自定义单元格渲染器 这很可能导致此问题 这是完整的渲染器类代码 protected class ProfessionTreeCellRenderer exten
  • 如何对 IntStream 进行逆序排序

    我正在使用 txt 文件读取数字BufferedReader 我想颠倒该流中元素的顺序 以便在收集它们时 它们将从最高到最低排列 我不想在构建数组后进行排序 因为我不知道其中可能有多少元素 我只需要最高的 N 个元素 in new Buff
  • 使用 Spring 时实例化对象,用于测试与生产

    使用 Spring 时 应该使用 Spring 配置 xml 来实例化生产对象 并在测试时直接实例化对象 这样的理解是否正确 Eg MyMain java package org world hello import org springf
  • Google Inbox 类似 RecyclerView 项目打开动画

    目前 我正在尝试实现 Google Inbox 例如RecyclerView行为 我对电子邮件打开动画很好奇 我的问题是 该怎么做 我的意思是 他们使用了哪种方法 他们用过吗ItemAnimator dispatchChangeStarti
  • Java 重写 hashCode() 得到 StackOverflowError

    所以我不太熟悉重写 hashCode 并且我似乎在 hashCode 方法中以某种方式进行了一些无限递归 这是我的场景 我有一个 DuplicateCache 类 它是一个缓存对象 用于检查系统中的重复对象 我有一个静态内部类 Duplic
  • PropertySources 中各种源的优先级

    Spring引入了新的注释 PropertySources对于所有标记为的类 Configuration since 4 0 需要不同的 PropertySource作为论证 PropertySources PropertySource c
  • Java 变量的作用域

    我不明白为什么这段代码的输出是10 package uno public class A int x 10 A int x 12 new B public static void main String args int x 11 new
  • 如何将 XMP XML 块序列化为现有的 JPEG 图像?

    我有许多 JPEG 图像 其中包含损坏的 XMP XML 块 我可以轻松修复这些块 但我不确定如何将 固定 数据写回图像文件 我目前正在使用 JAVA 但我愿意接受任何能让这项任务变得容易的事情 这是目标关于 XMP XML 的另一个问题
  • 所有junit测试后的清理

    在我的项目中 我必须在所有测试之前进行一些存储库设置 这是使用一些棘手的静态规则来完成的 然而 在所有测试之后我不知道如何进行清理 我不想保留一些神奇的静态数字来引用所有测试方法的数量 我应该一直维护它 最受赞赏的方法是添加一些侦听器 该侦
  • Install4j:如何在安装结束时执行命令行 java -jar filename.jar

    在 Intall4j 中 在安装结束时 我只想通过执行如下命令行来初始化某些内容 java jar filename jar 我怎样才能归档这个任务install4j Thanks 将 运行可执行文件或批处理文件 操作添加到 安装屏幕 并设
  • Apache Commons CLI:替代已弃用的 OptionBuilder?

    IntelliJ 显示此示例代码中不推荐使用 OptionBuilderhttp commons apache org proper commons cli usage html http commons apache org proper
  • 在 Selenium WebDriver 上如何从 Span 标签获取文本

    在 Selenium Webdriver 上 如何从 span 标记检索文本并打印 我需要提取文本UPS Overnight Free HTML代码如下 div id customSelect 3 class select wrapper
  • 使用 Java 从 S3 上的文件在 S3 上创建 zip 文件

    我在 S3 上有很多文件 需要对其进行压缩 然后通过 S3 提供压缩文件 目前 我将它们从流压缩到本地文件 然后再次上传该文件 这会占用大量磁盘空间 因为每个文件大约有 3 10MB 而且我必须压缩多达 100 000 个文件 所以一个 z
  • java中如何找到class文件的包

    我正在编写一个使用 class 文件的 java 程序 我希望能够读取文件系统上的 class 文件 使用 InputStream 并确定它所在的包 该 class 文件可能不在一个好的包目录结构中 它可能位于某个随机位置 我怎样才能做到这

随机推荐

  • “泰迪杯”挑战赛-通过图像处理和数据挖掘实现车辆检测与跟踪

    目 录 挖掘目标 分析方法与过程 2 1 总体流程 2 2 具体步骤 2 3 结果分析 结论 参考文献 1 挖掘目标 在建设平安城市的进程中 安全是政府日常管理工作中的重要任务 随着城市报警和监控系统的建设 对于监控数据的分析也日显重要 本
  • powerdesigner物理视图 导出建库脚本(mysql)

    第一步 设置powerdesigner 物理视图 导出数据库类型 菜单栏 DataBase 数据库 generate Database 第二步 设置Powerdesigner 物理视图 导出数据库语言类型 第三步 根据第二步的相关配置 进行
  • web.xml文件详解

    前言 一般的web工程中都会用到web xml web xml主要用来配置 可以方便的开发web工程 web xml主要用来配置Filter Listener Servlet等 但是要说明的是web xml并不是必须的 一个web工程可以没
  • Python错误提示:TypeError: sequence item 2: expected str instance, int found

    我们知道在对list进行拼接 对字符串进行拼接的时候可以使用 join 但是在将list进行拼接转换为字符串的时候报错 大家可以对比看一下 list01 name age 20 s join list01 print s try list0
  • java8之lambda表达式简介

    文章目录 1 概念 2 基础语法 2 1 语法格式一 2 2 语法格式二 2 3 语法格式三 2 4 语法格式四 2 5 语法格式五 2 6 语法格式六 3 Lambda 表达式需要 函数式接口 的支持 4 java内置四大核心函数式接口
  • python的split分割数组_NumPy数组的分割

    在 NumPy 中 利用 split hsplit 和 vsplit 等函数可实现数组的分割操作 split 函数 该函数可沿特定的轴将数组分割为子数组 使用 split 函数的方法如下 numpy split arr indices or
  • K8S安装Master教程(亲测成功)

    配置hosts vim etc hosts 追加如下内容 192 168 18 10 k8s master 192 168 18 11 k8s node1 192 168 18 12 k8s node2 192 168 18 13 k8s
  • 搭建nginx+php后访问不到项目

    记在虚拟机搭建php nginx mysql踩到的坑 首先因为工作原因 离开了上家公司 然后入职xx后 由于没有开发机只能自己搭建了一个虚拟机 搭建好后使用一键安装式工具安装了lnmp环境 之后访问nginx是可以访问通的 但是指定了项目目
  • TCP、UDP、HTTP、SOCKET之间的区别

    IP 网络层协议 TCP和UDP 传输层协议 HTTP 应用层协议 SOCKET TCP IP网络的API TCP IP代表传输控制协议 网际协议 指的是一系列协议 TCP和UDP使用IP协议从一个网络传送数据包到另一个网络 把IP想像成一
  • 二手服务器还是组装机,我表弟不懂电脑,老板竟然给他组装这种电脑:没坑人,明码标价!...

    说到组装电脑 大家都不陌生了 它是多硬件组合的产物 它对硬件搭配有要求 对于动手能力也有一定的要求 于是很多朋友为了省麻烦就会去找熟人或者是电脑店进行咨询组装电脑 前几天 我的表弟就在他居住附近的一家电脑店咨询组装了一台电脑 最后发现被坑惨
  • 原创打造 Claude网页 接口

    先进入App unavailable Anthropic 新建聊天聊起来 在聊之前就要打开f12 监听请求 相关参数打开f12即可找到 注意 需要在打开f12后发送几条信息给claude才有相关链接显示 这两个参数就是我们需要的 cooki
  • Code Blocks IDE在linux下添加include & lib路径

    摘自 url http bbs csdn net topics 350101552 url size large 第一步 编译第三方库 得到头文件和库 例如路径关系 D MyLib include D MyLib lib 在include中
  • 抖音直播间弹幕rpc学习

    目标url 随便找个直播间即可 https live douyin com 198986091107 接口分析 首先并没有在xhr下找到对应的接口 因为采用了websocket来传输信息 切换到ws即可看到 消息下 可以看到16进制的数据在
  • 连接被拒绝 因为没有授权此用户账户进行远程登录

    背景 有时想远程连接某服务器进行操作 但是远程登陆时 却报错 解决办法 在服务器上进行设置 允许用户登录 步骤 1 用允许登录的用户 远程连接服务器 在这里用v liyh登录 点击 开始 图标 运行 如图 在对话框中输入 mstsc 如图
  • 【Linux命令详解

    文章标题 简介 一 参数列表 二 使用介绍 1 显示文件内容 2 创建文件 3 连接文件 4 显示行号 5 压缩空行 6 显示特殊字符 7 显示行号和特殊字符 8 从标准输入读取 9 显示文件开头或结尾 10 备份文件 11 显示文件内容至
  • Redis 配置详解 —— 全网最新最全

    文章目录 一 撰文目的 二 配置详解 1 EXAMPLE 概要说明 2 INCLUDES 配置包含 3 MODULES 加载模块 4 NETWORK 网络配置 5 TLS SSL 通讯协议 6 GENERAL 常规配置 7 SNAPSHOT
  • 【合作 】联通、壳牌、联想、国金证券等众多企业签约 Eolink !

    联通 壳牌 联想 华润置地 中国铁塔等多家知名企业签约 Eolink 携手落地 API 全生命周期管理 感谢广大企业对 Eolink 的信任和选择 Eolink 致力于为企业提供最全面的 API 研发管理解决方案 提供高效 可靠的工具以及服
  • lua文件读写

    文件读写 文件读写对制作游戏很有帮助 可以调用别的文件中的代码 保存最高分 游戏存档 玩家状态等信写到文件中 首先 让我们看一个简单的命令 dofile 这个命令会读入另一个文件的代码并立即执行 代码 dofile test lua 很简单
  • 记录一个vue项目报错UnhandledPromiseRejectionWarning: Unhandled promise rejection.

    使用vue cli创建vue项目 加入一些之前的代码 然后打包运行报错 node 4892 UnhandledPromiseRejectionWarning Unhandled promise rejection This error or
  • 一种复杂业务场景的解决方案(代码结构)

    背景 我个人负责交易线的一些服务优化工作 如购物车 预购单等 这些服务是前台服务 需要基于很多中台服务能力来实现业务功能 中台服务如商品中心 协议中心 用户中心 营销活动等 前台服务通过RPC调用中台服务获取数据 在2020年度的优化工作汇