Akka 进阶(一)Dispatcher调度器

news2025/4/17 2:29:54

目录

  • 一 Dispatcher 任务分发
    • 1.1 理解什么是Dispatcher
    • 1.2 Executor的分类
    • 1.3 基本使用
    • 1.4 其他类型的调度器

  • 在Akka中,Actor的消息通信和任务执行建立在一个完全透明的调度机制之上,它屏蔽了底层线程(池)的实现细节,几乎让开发者感觉不到它的存在。
  • 调度机制类似于一个消息中心控制器,所有消息、任务都由它负责分发和派送,在这个过程中,有很多因素会影响整个系统的效率和性能。

一 Dispatcher 任务分发

1.1 理解什么是Dispatcher

当前疫情情况下,快递小哥短缺,由于每个快递小哥都有大量的货要送,所以很可能会造成延迟送货,为了解决这个问题,快递公司可能会从两方面入手。

  • 让快递小哥们提高单次送货速度,尽可能多送货。
  • 临时增派人手,以便处理更多的送货任务。

在Akka中,Actor运行在一个线程池之上,每个线程(快递小哥)会处理多个Actor消息(商品),为了能保证Actor消息处理的及时性和线程的使用效率,我们需要对线程池做一些调配或协调的工作,这就是Dispatcher的意义。
epub_933107_19.jpg
在实际项目中,我们(Actor)可能需要处理各种不同类型的任务,有的任务耗时长,或者长时间阻塞,而有的任务则处理较快,不会造成阻塞,大部分时候,我们会将这两类任务做线程资源上的隔离,即分配不同的Dispatcher处理它们,此时可以避免由于某类任务耗尽线程而让其他请求等待的情况。

1.2 Executor的分类

  • thread-pool-executor:基于普通的线程池,它有一个工作队列,当线程空闲时会从队列中获取任务并执行。
        my- threadpool-dispatcher {
            # dispatcher类型
            type = Dispatcher
            executor = "thread-pool-executor"
            # 配置线程池
            thread-pool-executor {
            # 最小线程数
            core-pool-size- min = 2
            #  并发使用的最大线程数=处理器*因子
            core-pool-size-factor = 3.0
            #最大线程数
            core-pool-size-max = 15
            }
            throughput = 1
        }
  • fork-join-executor:基于工作窃取的线程池,它的工作思路是把大的计算任务拆分成小的任务然后并行执行,最后合并结果。当某个线程的任务队列里没有任务时,会主动从其他线程的任务队列中“窃取”任务。一般认为,fork-join的性能更佳,这也是Akka的默认选项。
# 自定义线程名称,Actor中使用
my-forkjoin-dispatcher {
  # 类型:有多种类型,不同的线程调度策略
  type = Dispatcher
  # 执行器
  executor = "fork-join-executor"
  # 配置fork-join线程池
  fork-join-executor {
  # 最小线程
  parallelism- min = 3
  # 并发因子 cpu核数*parallelism-factor
  parallelism-factor = 3.0
  # 最大线程数
  parallelism-max = 15
}
# 公证
throughput = 1
}

epub_933107_20 (1).jpg

1.3 基本使用

代码式

import akka.actor.AbstractActor;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import akka.cluster.ClusterEvent;
import akka.event.Logging;
import akka.event.LoggingAdapter;

/**
 * @description:
 * @author: shu
 * @createDate: 2022/12/23 13:58
 * @version: 1.0
 */
public class DispacherActor extends AbstractActor {

    protected final LoggingAdapter log = Logging.getLogger(context().system(), this);

    @Override
    public Receive createReceive() {
        return receiveBuilder()
                .build();
    }


    public static void main(String[] args) {
        ActorSystem system = ActorSystem.create("sys");
        ActorRef ref = system.actorOf(Props.create(DispacherActor.class).withDispatcher("my-forkjoin-dispatcher"), "actorDemo");
    }
}

配置式

akka.actor.deployment {
            /actorDemo {
                dispatcher = my-forkjoin-dispatcher
            }
        }

1.4 其他类型的调度器

innedDispatcher是另外一种Dispatcher类型,它会为每个Actor提供只有一个线程的线程池,该线程池为Actor独有。当Actor处理比较耗时、阻塞的操作时,使用Pinned-Dispatcher将会非常有效。

import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import akka.actor.UntypedActor;

/**
 * @description:
 * @author: shu
 * @createDate: 2022/12/23 14:08
 * @version: 1.0
 */
class ActorPinnedDemo extends UntypedActor {
    @Override
    public void onReceive(Object msg) throws Exception {
        System.out.println(getSelf()+"--->"+msg+""
                +Thread.currentThread().getName());
        Thread.sleep(5000);
    }


    public static void main(String[] args) {
        ActorSystem system = ActorSystem.create("sys");
        for(int i=0; i<20; i++) {
            ActorRef ref = system.actorOf(Props.create(ActorPinnedDemo.class)
                    .withDispatcher("my-pinned-dispatcher"), "actorDemo"+i);
            ref.tell("hello pinned", ActorRef.noSender());
        }
    }
}
        my-pinned-dispatcher {
            executor = "thread-pool-executor"
            type = PinnedDispatcher
        }

image.png

  • PinnedDispatcher会让每个Actor都有自己单独的线程池(虽然只有一个线程),这个线程池不会被其他Actor共享;
  • 普通的Dispatcher会让多个Actor绑定到一个线程池,当任务很多并且非常耗时的时候,会占用大量(甚至全部)的线程去执行它们,而新的任务会等待空闲的线程。

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

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

相关文章

Java: static,final,代码块 的详解

Java: static&#xff0c;final&#xff0c;代码块 的详解 每博一文案 山本文绪说过这样一句话&#xff1a;哪些决定放弃了的事&#xff0c;就请放弃得干干净净。哪些决定再也不见面的人&#xff0c;就真 的不要再见面了&#xff0c;不要再做背叛自己的事&#xff0c;如果想要…

CentOS7迷你版安装Redis并配置基础信息

1. 安装gcc、wget依赖 yum install gcc yum install wget 2. 使用命令&#xff1a;wget http://download.redis.io/releases/redis-6.2.5.tar.gz 下载安装包&#xff0c;注意要先cd到要下载到的目标位置&#xff09; 3. tar -zxvf redis-6.2.5.tar.gz 解压压缩包 4. cd redis-…

学习周报-20221223

文章目录一 Linux的ACL访问控制列表一 基础概念1.1 起因1.2 系统支持1.3 相关定义二 查看ACL权限2.1 简单查看2.2 详细查看2.3 具体配置三 更改ACL权限3.1 添加或修改ACL3.2 输出和输入3.3 设置ACL掩码3.4 递归修改ACL3.5 删除ACL3.6 控制默认ACL权限二 Linux磁盘分区中物理卷&…

zabbix6.0安装教程(七):从web界面安装

zabbix6.0安装教程&#xff08;七&#xff09;&#xff1a;从web界面安装 目录一、欢迎主界面二、先决条件检查三、配置数据库连通性四、配置本章节提供有关Zabbx Web界面的部署步骤说明。Zabbix 前端是由PHP语言编写&#xff0c;所以其网页服务的运行需要支持PHP语言的网站服务…

Allegro如何任意角度走线操作指导

Allegro如何任意角度走线操作指导 Allegro支持在PCB上进行任意角度走线,尤其是在高速设计的时候,尤为常见,如下图 具体操作如下 选择add connect命令Find选择Cline segs

谷歌要给移动VR定规矩

代号牛轧糖的最新安卓7.0手机操作系统发布两天后&#xff0c;谷歌公司开发的虚拟现实&#xff08;VR&#xff09;平台Daydream&#xff08;下称“白日梦”&#xff09;也将在未来几周推出。与平台一同推出的&#xff0c;还有来自Hulu和YouTube等视频网站“网红”们的全新视频内…

【软件工程】实验3:软件详细设计

CAM系统的类图 CAM系统的顺序图 CAM系统模拟实现&#xff08;CAM工具库封装&#xff09; 1、代码运行界面 &#xff08;1&#xff09;根据提示输入要加工的图形类型 &#xff08;2&#xff09;J-Soft软件会根据输入的数字提示用户输入不同的图形参数&#xff0c;图形参数输入…

函数栈帧(栈区)

函数栈帧&#xff08;栈区&#xff09;一.前言二.main函数空间的开辟&#xff08;函数调用是如何做到的&#xff09;三.main函数内部的变量初始化&#xff08;局部变量是如何创建的以及为什么是随机值&#xff09;四.main函数内部的函数创建1.函数是如何传参的2.传参的顺序以及…

物联网通信技术原理第2章 无线通信技术(期末重点)

目录 2.1 无线通信基本知识 2.1.2 无线通信的特点 2.2 无线信道 2.2.1 恒参无线信道举例 2.2.2 恒参无线信道特性及其对信号传输的影响 1. 幅度—频率畸变 2. 相位—频率畸变​编辑 2.2.3 随参无线信道距离 1、短波电离层反射 2、对流层散射信道 2.2.4 随参信道特性及…

漏洞深度分析|Apache Karaf 4.2.16 存在JNDI 注入漏洞

项目地址 GitHub - apache/karaf: Mirror of Apache Karaf 项目介绍 Apache Karaf是一个模块化运行时&#xff0c;支持多种框架和编程模型&#xff08;REST/API、web、spring boot 等&#xff09;。它提供了统包功能&#xff0c;您可以毫不费力地直接利用这些功能&#xff0…

戴维南定理

定理内容&#xff1a;任意二端口直流网络都可以被一个等效电路替换&#xff0c;这个等效电路只包含一个电压源和一个串联电阻&#xff0c;如图1所示。 图1 戴维南定理的作用 1、分析含有非串联或非并联电源的网络 2、用最少数量的元件实现复杂网络的端口特性&#xff08;端口前…

【深入浅出Spring原理及实战】「开发实战系列」SpringSecurity原理以及实战认证分析开发指南

前提介绍 承接上一篇文章&#xff0c;相信大家应该已经对SpringSecurity的原理有了一定的认识&#xff0c;而本篇文章给大家带来的则是在实际业务开发中的技术指南&#xff0c;希望对你有所帮助。所谓知彼知己方能百战百胜&#xff0c;用Spring Security来满足我们的需求最好了…

我们国家都有哪些信息安全标准

写在前面 早年刚参加信息安全工作更多的学点皮毛技术&#xff0c;到处找安全工具&#xff0c;跟踪poc&#xff0c;拿到一个就全网扫一遍&#xff0c;从来没有想过&#xff0c;系统化的安全工作应该怎样搞?我做的工作在安全体系中处于哪个阶段? 后来有机会做企业安全建设&…

503.下一个更大元素II,42. 接雨水

503. 下一个更大元素 II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数…

C++:vector操作笔记

本文记录了对C中的vector容器的简单操作&#xff0c;包括给vector添加元素、按指定列排序、取值。 文章目录一、vector 和普通数组之间的转化二、根据vector数组的某一列数据排序三、删除二维 vector 数组最后一列数据一、vector 和普通数组之间的转化 1&#xff0c;数组转vec…

Mysql日志体系

3、Mysql日志体系 bing log &#xff1a;在server记录mysql所有的DDL和DML语句&#xff0c;主要用来做主从复制和数据恢复。内容追加&#xff0c;没有固定大小限制。redo log &#xff1a;undo log &#xff1a; 3.1、bin log 3.1.1、binlog日志作用 binlog记录所有的DDL和…

Unity CEO:玩家不在乎AR还是VR,他们只想要优质内容

近期&#xff0c;Unity CEO John Riccitiello在接受英国金融时报采访时&#xff0c;透露了自己对于游戏的前生今世&#xff0c;以及AR/VR和未来的看法。他认为&#xff0c;打造一个新平台需要大量优质内容&#xff0c;创意对于新平台很重要&#xff0c;不管AR和VR技术有什么区别…

java医院挂号系统挂号预约网站挂号网站预约网站源码

主要实现门诊挂号和用户网站预约挂号的功能 演示视频&#xff1a; https://www.bilibili.com/video/BV1nN411d7HT/?share_sourcecopy_web&vd_sourceed0f04fbb713154db5cc611225d92156 环境&#xff1a;jdk7/8mysql5.5tomcat7/8 技术&#xff1a;ssm(springspringmvcmyi…

读书笔记---Bioinformatics Data Skills

最近阅读了《Bioinformatics Data Skills》&#xff0c;是不错的生物信息学入门书&#xff0c;本文作者简介如下&#xff1a; 全书以下面三个方向展开&#xff0c;为生物信息学的继续学习指明了道路&#xff1a; &#xff08;1&#xff09;生物信息学数据技巧&#xff08;第一章…

动态DNS与DPDK高性能DNS -DPDK环境搭建

工具准备&#xff1a; vmware Ubuntu 16.04 Server 版本 1.vmware 添加两块网卡 桥接网卡作为 DPDK 运行的网卡 NAT 网卡作为 ssh 连接的网卡 2.修改网卡配置信息 将 ethernet0.virtualDev 由 e1000 修改 vmxnet3&#xff0c;因为 vmware 的 vmxnet3 支持多队 列网卡 3.修…