宝马娱乐在线城-宝马娱乐在线

来自 宝马技术 2019-12-05 12:48 的文章
当前位置: 宝马娱乐在线城 > 宝马技术 > 正文

架构干货:来听听架构大师 Martin Abbott 怎么说

根据不同服务或(和)用户使用的量级来分割应用和数据库。虽然它会给程序带来一些轻量的复杂度,但在规模上这样做更易于扩展。

数据库复制和分片 是提高吞吐量非常好的方法,我们应该充分利用这些经过实践检验的架构模式,以扩展企业应用的持久层。

架构扩展性的13条最佳实践

  • 某个SQL语句是否会拖慢系统的速度?
  • Redis突然变慢了吗?
  • 特定的HTTP Web服务宕了,还是变慢了?

4. 监控应用程序性能

关系型数据库是Java应用程序中另一个常见的性能问题。为了获得完整请求的响应时间,我们很自然地必须查看应用程序的每一层,并思考如何让代码与底层SQL DB进行交互。

原标题:架构干货:来听听架构大师 Martin Abbott 怎么说

上面代码中使用的StringBuilder对性能的提升非常有效。请注意,现代的JVM会在编译或者运行时对字符串操作进行 优化 。

图片 1

其他JVM语言(如Scala)已经在编译器级 支持 尾递归代码的优化,当然,对于这种优化目前也存在着一些争议。

尽可能小批量地在服务器上部署新代码,而不要让整个站点关闭。这要求所有代码都要向后兼容,因为在部署时你会有两个版本的代码同时运行。这种方法可以帮助我们方便地找到应用质量或者L&P测试(负载性能测试)所遗漏的问题,同时最小化对客户的影响。

性能指标

3. 使用多层次的缓存

示例应用程序

9. 在部署前执行负载与性能测试

说起来容易,做起来难,而且了解应用程序当前的性能也非常重要。这就是我们接下来要关注的问题。

8. 在服务器上小批量地部署新代码

Gatling的模拟测试脚本是用Scala编写的,但该工具还附带了一个非常有用的图形界面,可用于记录具体的场景,并生成Scala脚本。

首先要站在客户的角度去分析你的程序性能。从外部网络进行监控测试,可以模拟真实的用户体验。同时,还可以根据查询和事务操作上执行次数和耗时数据,来监控程序的内部工作情况。

例如,下面的图形展示了在一段给定的时间内速度最慢的组件。

架构质量从一开始设计就要考虑进去,质量不能靠测试来解决。测试只能发现研发过程中带来的问题。

监控应用程序

尽可能使用OLTP(on-line transaction processing,联机事务处理 )数据库作为存储设备。因为要确保ACID属性,关系型数据库在扩展型方面会有很多挑战。你的交易越依赖关系型数据库系统(RDBMS)提供的功能,那么系统在扩展时你投入的负载就越大。建议从数据库中将主要的业务逻辑(例如存储过程)都移到应用程序或服务内。当系统需要做大规模扩展时,应该通过应用或服务来扩展, 而不是通过SQL。

代码级别的优化

复制数据库可以帮助还原数据,同时把读取的负载分配到多个实例。

  • 应用程序平均响应时间
  • 系统必须支持的平均并发用户数
  • 在负载高峰期间,预期的每秒请求数

以下内容节选自:世界级软件架构大师 Martin Abbott 亲研架构秘籍《突破技术领导力》

JVM调优 堆大小的调优

1. 尽可能多地使用异步的通信方式

连接池

图片 2

另一方面,Hibernate则更加灵活,它允许我们 只需修改一个配置即可快速切换为批处理操作。

确保所有版本的代码都有回滚能力,在准生产或者QA环境演练,必要时在生产环境中用它来解决客户的问题。如果没有经历过无法回滚代码的痛,还继续冒险地“修改-发布”代码,那么你会在未来某个时刻体会到这种痛苦。

使用一些流行的库,比如 Apache Commons Lang 也是一个很好的选择,特别是在字符串的操作方面。

11. 容量规划 / 扩展峰值

持久化处理应尽可能地执行批量操作。 JDBC批处理允许我们在单次数据库交互中发送多个SQL语句。

6. 使用切片(Sharding)技术

根据“ Gatling的第一步 ”所述,用下面的代码创建一个名为EmployeeSimulation的scala文件:

10. 不能回滚注定失败

public int factorial(int n) {
    if (n == 0) {
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}

转自:北京尚学堂IT学院(一点号)返回搜狐,查看更多

这些指标可以通过使用多种监视工具监测到,它们对分析性能瓶颈和性能调优有着非常大的作用。

12. 问题根源分析

这里建议使用 HikariCP JDBC ,这是一个非常轻量级(大约130Kb)并且速度极快的JDBC连接池框架。

同步调用会同时将两种不同服务的可用性捆绑在一起。如果其中一者产生错误或是堵塞,另一者也会受到影响。

如果应用程序使用了大量的线程,那么使用线程池会更加有用,因为线程池允许这些昂贵的对象被重用。

在多个层上尽可能地使用缓存,如数据库前的对象缓存(例如:memcached),或是页面内容缓存(例如:squid),边缘缓存(例如:Akamai)。

JDBC性能

确保有强大的学习文化,当问题出现时,一定要确保找到问题根源, 才能最终修复问题。

Stackify的 Retrace 是一个成熟的APM解决方案。它的功能很丰富,对确定应用程序的性能基线很有帮助。 Retrace的关键组件之一是它的 代码分析 功能,它能够在不减慢应用程序的情况下收集运行时信息。

一定要在产品部署前,执行负载与性能测试。虽然这不会发现所有问题(这也是为什么我们需要回滚 Rollback的能力),但它很值得做。

在我们的这个例子中,具体的场景将是“启动200个用户,每个用户发出一万个请求。”

5. 复制数据库

只要底层的JDBC驱动程序支持,你就可以在客户端(驱动程序)或数据库端(语法树甚至执行计划)中缓存PreparedStatement。

根据用户划分来创建硬件隔离的“泳道 Swim Lanes”。这可以防止因为某个客户所产生的问题而影响其他客户,同时有助于诊断问题和代码发布。

让我们从众所周知的事实开始,即数据库连接是昂贵的。 连接池 机制是解决这个问题非常重要的第一步。

7. 尽可能少的使用关系型数据库RDBMS特性

图片 3

对于每一层、每一个服务,都要清楚它有多大容量。使用 扩展峰值(Scalability Summits) 来规划容量的增长需求。

语句缓存

责任编辑:

我们来看一个头递归的例子:

  1. 从一开始就重视质量工作

除了能够提升Java的性能,通过集群进行横向扩展也有其他的好处,添加新的节点能产生冗余,并更好的处理故障,从而提高整个系统的可用性。

2. 使用用户泳道来隔离错误

图片 4

class EmployeeSimulation extends Simulation {
    val scn = scenario("FetchEmployees").repeat(10000) {
        exec(
          http("GetEmployees-API")
            .get("http://localhost:8080/employees")
            .check(status.is(200))
        )
    }
    setUp(scn.users(200).ramp(100))
}

摘要:本文首先介绍了负载测试、基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代码的一些最佳实践。最后研究了JVM特定的调优技巧、数据库端的优化和架构方面的调整。以下是译文。

要获得有关应用程序需求的最好最可靠的方法是对应用程序执行实际的负载测试,并在运行时跟踪性能指标。我们之前讨论的基于Gatling的测试就是一个很好的方法。

这样,无论是在驱动端还是在数据库端, 性能都可能得到显著地提升 。 * PreparedStatement*是一个非常棒的的批处理命令,一些数据库系统(例如Oracle)只支持预处理语句的批处理。

Stop-the-world(STW)垃圾收集的周期是影响大多数面向客户端应用程序响应和整体Java性能的大问题。但是,目前的垃圾收集器大多解决了这个问题,并且通过适当的优化和大小的调整,能够消除对收集周期的感知。

public String stringAppendLoop() {
    String s = "";
    for (int i = 0; i < 10000; i++) {
        if (s.length() > 0)
            s += ", ";
        s += "bar";
    }
    return s;
}

public String stringAppendBuilderLoop() {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 10000; i++) {
        if (sb.length() > 0)
            sb.append(", ");
        sb.append("bar");
    }
    return sb.toString();
}

为生产系统确定合适的JVM堆大小并不是一件简单的事情。要做的第一步是回答以下问题以预测内存需求:

下面这个例子是一个简化了的但却很典型的循环。前面使用了原始的连接方式,后面使用了构建器:

找到最慢的那个点

规模的缩放

要执行负载测试,请运行以下命令:

要使用Retrace进行Java应用程序的开发,首先需要在Stackify上申请 免费试用 账号。然后,将我们自己的 Spring Boot 应用程序配置为Linux服务。我们还需要在托管应用程序的服务器上安装Retrace代理,按照 这篇文章 所述的操作即可。

Retrace还提供了监视基于JVM应用程序的内存、线程和类的小部件。除了应用程序本身的指标之外,它还支持监视托管应用程序的服务器的CPU和IO使用情况。

负载测试工具和应用程序性能管理(APM)解决方案常用于跟踪和优化Java应用程序的性能。要找出性能瓶颈,主要就是对各种应用场景进行负载测试,并同时使用APM工具对CPU、IO、堆的使用情况进行监控等等。

定义场景

导致出现StackOverFlowError错误的递归代码逻辑是Java应用程序中另一种常见的问题。如果无法去掉递归逻辑,那么尾递归作为替代方案将会更好。

Retrace代理和要监控的Java应用程序启动后,我们就可以到Retrace仪表板上单击AddApp按钮添加应用了。添加应用完成之后,Retrace将开始监控应用程序了。

介绍

配置记录器

本文由宝马娱乐在线城发布于宝马技术,转载请注明出处:架构干货:来听听架构大师 Martin Abbott 怎么说

关键词: