《Akka应用模式:分布式应用程序设计实践指南》读书笔记9

简介: 性能  这也是一个比较大的问题,因为性能不一定是Akka本身的问题,还可能是你代码写的有问题。  优化的第一步就是找出性能的瓶颈,隔离出应用程序里面比较耗时的部分,然后尝试对其优化,减少需要耗费的时间成本。

性能

  这也是一个比较大的问题,因为性能不一定是Akka本身的问题,还可能是你代码写的有问题。

  优化的第一步就是找出性能的瓶颈,隔离出应用程序里面比较耗时的部分,然后尝试对其优化,减少需要耗费的时间成本。其实有时候对性能进行度量往往比优化性能还重要,因为你在度量性能的时候,已经在思考哪些可能是性能瓶颈了,这过程中就会不由自主的对其进行了优化。性能测试往往是找出那些超出预期的性能问题。

隔离瓶颈

  性能优化的第一步就是识别瓶颈,这是一个技术活。

优化Akka

  只有在确定了是Akka的问题之后再动手优化Akka,但大部分情况优化的都是业务逻辑和代码逻辑,跟Akka本身关系不大。

减少或隔离阻塞型操作

  个人感觉使用Akka就一定要遵守Actor模型的几个约束,其中一个很重要的约束就是每条消息处理一定要快,且最好是异步通信。这一点对于Akka新手来说,并不太好理解,或者理解的不够深刻。如果一个操作耗时不长,就没必要用Actor模型了,如果耗时太长,Actor又要求尽量要快,这不就是矛盾么?还要Akka干啥。其实这是我刚开始学Akka时候的疑问和不解。不过用下来才发现,如果你有一个目标:Actor消息处理一定要快。你就会无形中对一个操作尽可能的拆分,使其异步、短小,当然了带来的问题就是消息类型比较复杂。

  使用Akka时,不可避免的用到JDBC或文件等IO操作,这类操作有可能很慢且都是阻塞性操作,但并不代表不能把他设计成异步、非阻塞的。比如有一个流程如下:1.写数据库;2.写入成功后执行后续操作。我们往往是同步、阻塞的操作,但其实可以用future或异步JDBC将其拆分成两步:写数据库、成功后执行操作。比如把写入消息发送给单独的actor,该actor收到写入消息,对其进行写入然后把结果异步的返回给原来的actor,原actor收到写入成功的消息后执行后续操作。虽然并不一定解决阻塞的问题,但把阻塞的问题进行了隔离,因为阻塞只有在数据库actor才会有。但原actor却可以处理更多的消息。由于写数据库相关的消息都被封装到单独的actor,那么我们可以采取批量的方法,把数据插入数据库,以提高插入的性能和吞吐量。如果还与原actor的业务逻辑混到一块,就很难优化了。

  再进一步,还可以将插入数据库的actor放到单独的派发器,提高原actor的并发量。

缩短消息处理时间

  这和你显然是一句废话。但确实一个优化的方向,如何缩短呢?还是那个“分而治之”的思想,具体的方法大家就各自参悟吧,^_^。

增加处理消息的actor

  这其实也是一个好方法,无形中增加了并行数量。当然前提是各个actor没有争用资源,即使有争用也要对其进行解耦,减少争用时间和范围。Akka集群中增加actor数量,还可以充分利用各个节点的资源。当然了,这会增加系统的复杂性,不过使用Akka本身就是解决复杂系统的,简单的系统用Akka好像没啥必要。

派发器

  派发器是优化Akka的关键组件。这一点需要对派发器有深入的理解,刚开始时候我并没有认识到这一点,导致系统性能不太好。关于派发器建议大家读一下官方的文档。

标准派发器

  这是最常用、通用的派发器。默认是fork-join。还可以配置成thread-pool的形式。不过具体情况可以具体分析。但要认识到线程的让步都会执行一次上下文的切换,如果经常发生切换,对于系统来说是一个比较昂贵的开销。你看其他语言创建了自己的线程调度器就知道优化的必要了。

固定派发器

  固定派发器不再为actor使用线程池,而是每个actor分配一个固定线程,这样就不会有上下文切换的问题了。这种只对actor比较少的系统有用。

平衡派发器

  平衡派发器通过使用共享邮箱来执行这样的重分配操作。不常用,就不分析了。

calling-thread派发器

  主要用于测试。它不会分配线程池,所有操作都在发送消息的同一个线程上执行。

何时使用单独的派发器

  根据我的经验来看,前期不要考虑这个问题,先实现业务逻辑,等有性能问题的时候再考虑。但有一个却可以提前考虑,那就是与数据库相关的阻塞操作可以使用单独的派发器,这样不会影响原有actor的线程吞吐量。

提高并行性

  提高并行性是对业务的优化,就是提前考虑算法能否用“分而治之”的思想进行拆分,然后并行处理。但并不是所有的算法都能拆分,这点就靠大家自行分析了。

结论

  Akka是一个好的框架,它基本考虑了分布式 环境下遇到的所有方面的问题。Akka的很多高级特性都是基于最基础的Actor模型,可以使用它构建高并发、稳定的分布式系统,但有一点大家需要注意。Akka是一个分布式框架,系统的很多功能都需要自行设计,而且系统的稳定性和质量都取决于有没有合理的使用Actor模型。该书虽然描述了最重要的actor模式,但并不详细,很多章节都需要我们根据自己的实际场景来设计的。目前并没有关于Akka最佳实践的材料,即使有也都在各公司内部。所以我准备在未来的时间内写一点关于Akka最佳实践的博客,希望大家捧场。

目录
相关文章
|
27天前
|
SQL 数据建模 BI
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错
|
26天前
|
机器学习/深度学习 存储
DeepSeek进阶开发与应用4:DeepSeek中的分布式训练技术
随着深度学习模型和数据集规模的扩大,单机训练已无法满足需求,分布式训练技术应运而生。DeepSeek框架支持数据并行和模型并行两种模式,通过将计算任务分配到多个节点上并行执行,显著提高训练效率。本文介绍DeepSeek中的分布式训练技术,包括配置与启动方法,帮助用户轻松实现大规模模型训练。数据并行通过`MirroredStrategy`同步梯度,适用于大多数模型;模型并行则通过`ParameterServerStrategy`异步处理大模型。DeepSeek简化了分布式环境配置,支持单机多卡和多机多卡等场景。
|
4月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
89 5
|
4月前
|
监控
Saga模式在分布式系统中保证事务的隔离性
Saga模式在分布式系统中保证事务的隔离性
|
5月前
|
人工智能 文字识别 Java
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
尼恩,一位拥有20年架构经验的老架构师,通过其深厚的架构功力,成功指导了一位9年经验的网易工程师转型为大模型架构师,薪资逆涨50%,年薪近80W。尼恩的指导不仅帮助这位工程师在一年内成为大模型架构师,还让他管理起了10人团队,产品成功应用于多家大中型企业。尼恩因此决定编写《LLM大模型学习圣经》系列,帮助更多人掌握大模型架构,实现职业跃迁。该系列包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构》等,旨在系统化、体系化地讲解大模型技术,助力读者实现“offer直提”。此外,尼恩还分享了多个技术圣经,如《NIO圣经》、《Docker圣经》等,帮助读者深入理解核心技术。
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
|
5月前
|
存储 缓存 NoSQL
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
160 4
|
6月前
Saga模式在分布式系统中如何保证事务的隔离性
Saga模式在分布式系统中如何保证事务的隔离性
120 7
|
6月前
|
存储 NoSQL Java
分布式session-SpringSession的应用
Spring Session 提供了一种创建和管理 Servlet HttpSession 的方案,默认使用外置 Redis 存储 Session 数据,解决了 Session 共享问题。其特性包括:API 及实现用于管理用户会话、以应用容器中性方式替换 HttpSession、简化集群会话支持、管理单个浏览器实例中的多个用户会话以及通过 headers 提供会话 ID 以使用 RESTful API。Spring Session 通过 SessionRepositoryFilter 实现,拦截请求并转换 request 和 response 对象,从而实现 Session 的创建与管理。
195 0
分布式session-SpringSession的应用
|
6月前
|
存储 NoSQL Java
分布式session-SpringSession的应用
Spring Session 提供了一种创建和管理 Servlet HttpSession 的方案,默认使用外置 Redis 存储 Session 数据,解决 Session 共享问题。其主要特性包括:提供 API 和实现来管理用户会话,以中立方式替换应用程序容器中的 HttpSession,简化集群会话支持,并在单个浏览器实例中管理多个用户会话。此外,Spring Session 允许通过 headers 提供会话 ID 以使用 RESTful API。结合 Spring Boot 使用时,可通过配置 Redis 依赖和支持缓存的依赖实现 Session 共享。
120 0
分布式session-SpringSession的应用

热门文章

最新文章