首页 > 其他分享 >分布式事务的性能设计

分布式事务的性能设计

时间:2022-11-04 17:01:35浏览次数:45  
标签:事务 缓存 性能 算法 遍历 数据 数据库 分布式

分布式事务的性能设计,主要包含吞吐量和相应延迟两方面。分布式事务更适合对吞吐量要求高,对相应延迟要求不苛刻的应用。性能设计有三个层面,分别为代码优化层、算法逻辑层以及架构设计层。

1、代码优化层

代码优化层关注代码细节优化,代码实现是否合理,是否创建了过多的对象,循环遍历是否高效,cache使用是否高效、合理,是否重用计算结果等,具体分析如下。

  • 循环遍历是否高效:不要在循环里调用RPC接口、查询分布式缓存、执行SQL等,要先调用批量接口组装好数据,再循环处理。
  • 代码逻辑避免生成过多的对象或无效对象:输出Log时进行Log级别判断,避免新建无效对象。
  • 对数据对象是否合理重用:比如通过RPC查到的数据能复用则必须复用。
  • 根据数据访问特性选择合适的数据结构:如果读多写少,考虑使用CopyOn-WriteArrayList(写时复制副本)。
  • 是否正确初始化语句:有些全局共享的数据采用饿汉式模式,需要在用户访问之前先初始化好。
  • 列遍历是否使用L1缓存:列遍历由于不满足局部性原理,需要放到L3 cache。行遍历符合局部性原理,因此缓存命中率高,速度接近前者2倍。注意,CPU缓存体系中各缓存的运行速度按从低到高的顺序排列是内存->L3->L2->L1。本质上内存使用一个大的一维数组,二维数组在内存中按行排列,先存放a[0]行,再存放a[1]行。
  • 业务系统使用缓存降低响应时间、提高性能,必须要提高缓存命中率:如果对数据实时性要求很高,必须提供严格的时效性,需要慎重处理更新缓存带来的一致性问题。
  • 时效性和缓存的冲突:比如商品服务对商品进行了缓存,由于更新缓存和更新商品不是同一个事务,若对数据实时性要求很高,如交易,则只能直接从数据库查询商品信息。
  • 当读操作数量少于等于写操作数量的时候,没必要用缓存
  • 当查询条件数据量超过总数据库总量的30%时:就不会用索引,而是直接用遍历查询。可以缩小范围,让条件覆盖的数据量少一些。也可以不查几年的,只查半个月的。
2、算法逻辑层

算法逻辑层优化主要关注算法选择是否高效、算法逻辑优化、空间时间优化任务并行处理、是否使用无锁数据结构等,具体分析如下。

  • 用更高效的算法替换现有算法,而不改变其接口。增量式算法,复用之前的计算结果,比如一个报表服务,要从全量数据中生成。报表数据量很大,但每次的增量数据较少,则可以考虑只计算增量数据并将其与之前的计算结果合并。
  • 并发和锁的优化:读多写少,乐观锁;读少写多,互斥锁。
  • 系统时间是瓶颈:如缓存复用计算结果,降低时间开销,因为CPU时间比内存容量更重要。
  • 数据大小是瓶颈:网络传输是瓶颈,使用系统时间换取空间,使用HTTP的Gzip压缩算法。
  • 并行执行:如果只是逻辑调用多个RPC接口,而这些接口之间并没有数据依赖,则可以考虑并行调用,减少响应时间。
  • 异步执行:分析业务中的主次流程,把次要流程拆出来异步执行或将次要流程进一步拆分成单独的模块去执行,比如消息队列,让其彻底和核心流程解耦,提高核心流程的稳定性,减少响应时间。
3、架构设计层

架构设计层的优化包括如何拆分系统,如何使各个部分系统负载更加均衡,充分发挥硬件设施的性能优势,减少系统内部开销等,具体分析如下。

  • 系统微服务。
  • 无状态化设计,动态水平弹性扩展。
  • 调用链路梳理,热点数据尽量靠近用户。
  • 分布式缓存,多级多类型缓存。
  • 提前拒绝,保证柔性可用。
  • 容量规划。
  • 分布分表,读写分离,数据分片。

在基于容器云的分布式架构中,当客户端发起大流量请求时,网关、应用架构层、数据访问层可以横向扩展,但最终数据还是会落盘。因此有大流量请求时,分布式架构最终的性能瓶颈在于数据库上的热点数据。

针对数据库的热点数据,我们可以采用对数据库做分表的方法,但如果热点消息是一个数据库中的一行数据,通过数据库和缓存的分表也无法完全消除热点。

我们在进行方案设计时,最终要将吞吐量和成本结合考虑,即ROI。实际上,即使互联网公司的电商系统做了诸多优化,在促销时也不能保证100%请求全部成功,这不是技术的问题,而是ROI的考量。

标签:事务,缓存,性能,算法,遍历,数据,数据库,分布式
From: https://blog.51cto.com/key3feng/5823999

相关文章

  • 服务器性能监控之New Relic 入门教程
    NewRelic是一个很强大的服务器性能监控工具,NewRelic目前专注于SaaS和App性能管理业务,它支持支持agent和API传送数据,能够对部署在本地或在云中的web应用程序进行监控、......
  • 深入理解 Spring 事务原理
    Spring事务的基本原理Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤......
  • Spring 源码(七)Spring 事务源码解析
    注册后置处理器开启对事务的支持@EnableTransactionManagement​​@EnableTransactionManagement​​注解的主要作用是开启对事务的支持,源码如下:@Target(ElementType.TYPE)@......
  • 并发情况如何提升同步代码块的性能
    使用并发编程的目标是为了提升系统性能,引入多线程后,其实会引入额外的开销,如线程之间的协调、增加的上下文切换,线程的创建和销毁,线程的调度等等。过度或不恰当的使用,可能会导......
  • 基于redis 实现分布式锁(二)
    分布式锁的解决方式基于数据库表做乐观锁,用于分布式锁。(适用于小并发)使用memcached的add()方法,用于分布式锁。使用memcached的cas()方法,用于分布式锁。(不常用)使用redis......
  • 关于 线程模型中经常使用的 __sync_fetch_and_add 原子操作的性能
    最近从kvell这篇论文中看到一些单机存储引擎的优秀设计,底层存储硬件性能在不远的未来可能不再是主要的性能瓶颈,反而高并发下的CPU可能是软件性能的主要限制。像BPS/AEP/Op......
  • Rocksdb 日志分析工具 -- 性能和稳定性分析
    文章目录​​1.前言​​​​2.工具使用细节​​​​3.如何制作一个自己的python-package​​​​3.1项目配置文件​​​​3.1.1LICENSE文件​​​​3.2README.md文......
  • .NET性能优化-复用StringBuilder
    在之前的文章中,我们介绍了dotnet在字符串拼接时可以使用的一些性能优化技巧。比如:为StringBuilder设置Buffer初始大小使用ValueStringBuilder等等不过这些都多多少少有......
  • 细说React组件性能优化
    React组件性能优化最佳实践React组件性能优化的核心是减少渲染真实DOM节点的频率,减少VirtualDOM比对的频率。如果子组件未发生数据改变不渲染子组件。组件卸载前......
  • 使用MyBatis时需要注意到的事情------执行添加操作时,一定要记得提交事务
    今天在重写添加操作代码时,发现自己写的代码没有任何报错,使用断点进行查询,发现一切正常,但是注册使用的数据就是无法添加到数据库里面然后就去之前看过的视频里面去找错误,就......