Akka 学习(九)Akka Cluster

news2024/11/18 16:49:49

参考文章

  • Gitter Chat,Akka 在线交流平台
  • Akka Forums,Akka 论坛
  • Akka in GitHub,Akka 开源项目仓库
  • Akka Official Website,Akka 官网
  • Akka Java API,Akka 应用程序编程接口
  • 《Akka入门与实践》 [加]Jason Goodwin(贾森·古德温)

文章系列

  • Akka 学习(一)Actor 初步认识与环境搭建 已完成
  • Akka 学习(二)第一个入门程序 已完成
  • Akka 学习(三)Actor的基本使用 已完成
  • Akka 学习(四)Remote Actor 已完成
  • Akka 学习(五)消息传递的方式 已完成
  • Akka 学习(六)Actor的监督机制 已完成
  • Akka 学习(七)Actor的生命周期 已完成
  • Akka 学习(八)路由与Dispatcher 已完成
  • Akka 学习(九)Akka Cluster 已完成

Akka 基础篇就此结束了,Akka基础篇主要介绍Akka的基本概念与一些基本术语,使用方式
代码:https://github.com/Eason-shu/Akka# 一 CAP理论
CAP理论是由Eric Brewer提出的,指的是一个分布式系统中的一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)之间的一个权衡。在分布式系统中,这三个概念是相互矛盾的,因此,系统必须在这三个概念之间进行权衡,以确定在特定情况下采取哪种策略。例如,在一个分布式系统中,如果要同时保证一致性和可用性,就必须牺牲分区容错性。

1.1 C -一致性(Consistency)

一致性是指客户端会返回某条记录最新的值。假如有一个银行账号,如果我们在存入一张400美元的支票之后马上试图取回400美元,我们希望系统能够给出正确的账户余额,并且允许我们取回400美元。

1.2 A可用性(Availability)

可用性是指一个没有发生失败的节点能够返回一个合理的响应。(例如,给出某个写操作是否成功的精确描述)。

1.3 P -分区容错性(Partition Tolerance)

分区容错性指的是如果某个节点由于暂时的网络错误而被从网络中移除,那么系统可以继续正常运行。如果数据被冗余备份到三个节点,那么如果其中一个节点暂时变得不可用,而另两个节点仍然能够正常运行[插图],那么就认为系统具备分区容错性。

二 Akka Cluster状态的监听

2.1 节点的状态

  • Akka Cluster基于Remoting,但是更强大,用处也更,如果使用Remoting,那么我们需要在基础设施或者代码中自己考虑高可用性这样的问题。
  • 而Akka Cluster会负责解决很多这些问题,因此是我们构建分布式Actor系统的绝佳选择。

f5aa5fb0ed558f300e6d7d194ccd9707_member-states.png

  • joining - 当尝试加入集群时的初始状态
  • up - 加入集群后的正常状态
  • **leaving / exiting **- 节点退出集群时的中间状态
  • down - 集群无法感知某节点后,将其标记为down
  • removed - 从集群中被删除,以后也无法再加入集群
  • fd* - 这个表示akka的错误检测机制Faiulre Detector被触发后,将节点标记为unreachable
  • unreachable* - unreachable不是一个真正的节点状态,更多的像是一个flag,用来描述集群无法与该节点进行通讯。当错误检测机制侦测到这个节点又能正常通讯时,会移除这个flag。

2.2 节点状态案例

加入依赖


<dependency>
  <groupId>com.typesafe.akka</groupId>
  <artifactId>akka-cluster_2.13</artifactId>
  <version>2.5.23</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.typesafe.akka/akka-contrib -->
<dependency>
  <groupId>com.typesafe.akka</groupId>
  <artifactId>akka-contrib_2.13</artifactId>
  <version>2.5.23</version>
</dependency>

编写一个Actor

import akka.actor.AbstractActor;
import akka.cluster.Cluster;
import akka.cluster.ClusterEvent;
import akka.event.Logging;
import akka.event.LoggingAdapter;
import akka.japi.pf.ReceiveBuilder;


/**
* @description:
* @author: shu
* @createDate: 2022/12/12 10:34
* @version: 1.0
*/
public class ClusterController extends AbstractActor {

    protected final LoggingAdapter log = Logging.getLogger(context().system(), this);
    Cluster cluster = Cluster.get(getContext().system());


    @Override
    public void preStart() throws Exception {
        cluster.subscribe(self(), (ClusterEvent.SubscriptionInitialStateMode) ClusterEvent.initialStateAsEvents(), ClusterEvent.MemberEvent.class, ClusterEvent.UnreachableMember.class);
        log.info("I'm about to start! Code: {} ", getSelf().hashCode());
    }


    @Override
    public void postStop() throws Exception {
        cluster.unsubscribe(self());
    }


    @Override
    public Receive createReceive() {
        return receiveBuilder()
            .match(ClusterEvent.MemberUp.class, mUp->log.info("Member is Up: {}", mUp.member()))
            .match(ClusterEvent.UnreachableMember.class, mUnreachable->log.info("Member detected as unreachable: {}", mUnreachable.member()))
            .match(ClusterEvent.MemberRemoved.class, mRemoved->log.info("Member is Removed: {}", mRemoved.member()))
            .match(ClusterEvent.LeaderChanged.class, msg->log.info("Leader is changed: {}", msg.getLeader()))
            .match(ClusterEvent.RoleLeaderChanged.class, msg->log.info("RoleLeader is changed: {}", msg.getLeader()))
            .match(ClusterEvent.MemberEvent.class, event->{})
            .build();
    }

}

配置文件

akka {
  actor {
  provider = "akka.cluster.ClusterActorRefProvider"
}
remote {
  netty.tcp {
  hostname = "127.0.0.1"
  port = 0
}
artery {
  enabled = on
  canonical.hostname = "127.0.0.1"
  canonical.port = 0
}
}
cluster {
  seed-nodes = [
  "akka://ClusterSystem@127.0.0.1:2552",
  "akka://ClusterSystem@127.0.0.1:2551"
  ]
}
}

启动类

import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @description:
 * @author: shu
 * @createDate: 2022/12/12 11:04
 * @version: 1.0
 */
public class MainSystem {
  public static void main( String[] args )
  {
    if(args.length==0)
      startup(new String[] {"2551", "2552", "0"});
    else
      startup(args);
  }

  public static void startup(String[] ports){
    ExecutorService pool = Executors.newFixedThreadPool(ports.length);
    for(String port : ports){
      pool.submit(()->{
        // Using input port to start multiple instances
        Config config = ConfigFactory.parseString(
          "akka.remote.netty.tcp.port=" + port + "\n" +
          "akka.remote.artery.canonical.port=" + port)
        .withFallback(ConfigFactory.load());

      // Create an Akka system
      ActorSystem system = ActorSystem.create("ClusterSystem", config);

      // Create an
      system.actorOf(Props.create(ClusterController.class), "ClusterListener");
    });
  }
}
}


节点初始化
image.png
2552的初始化
image.png
2551的初始化
image.png

说明

  1. 在底层有一个逻辑上的leader节点,负责协调状态的变化,集群会从逻辑上对节点进行排序,集群中的所有节点都会遵循这个顺序。排序列表中的第一个节点就是leader节点。
  2. Leader节点会对加入和离开集群的请求做出响应,并修改集群成员的状态。
  3. 在加入集群时,将要加入的节点会将其状态设为Joining。Leader节点会做出响应,将其状态改为Up。
  4. 如果一个节点将状态设置为Leaving,那么leader节点会做出响应,先将其状态改为Exiting,然后再改成Removed。
  5. 值得注意的是,如果一个节点被标记为不可达,那么Akka集群不会改变任何节点的状态:也就是说,在该节点由于无法从不可达状态恢复,被标记为Down之前,Akka Cluster将不会改变任何节点的状态。
  6. 如果节点无法访问并且被标记为Down,那么该节点在这之后将服务重新加入集群。结果会产生两个分离的集群(形成所谓的“左右脑”的情况)。

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

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

相关文章

AI创业时代!这9个方向有钱途;AIGC再添霸榜应用Lensa;美团SemEval2022冠军方法分享;医学图像处理工具箱… | ShowMeAI资讯日报

&#x1f440;日报合辑 | &#x1f3a1;AI应用与工具大全 | &#x1f514;公众号资料下载 | &#x1f369;韩信子 &#x1f4e2; 2023年9个有前途的 AI 创业方向 https://www.aiplusinfo.com/blog/9-promising-artificial-intelligence-startup-ideas-for-2023/ 2022年&#x…

央视广告怎么做,做好央视广告的关键点有哪些

企业品牌打算投放央视广告&#xff0c;首先想到的是如何做才更有效果&#xff0c;往往本身就比较困惑。公司应该投入多少资金&#xff1f;应选用何种广告投放方案&#xff1f;有时公司内部的观点也是不同的。尤其是面对广告公司提供的众多方案&#xff0c;让负责人看着都头疼&a…

Tos-GPR-AMC,117961-27-0,标记肽Tos-GPR-7-氨基-4-甲基香豆素

胰蛋白酶和凝血酶的荧光底物 Tos-GPR-AMC, fluorogenic substrate for trypsin and thrombin. Kinetic data for Thrombin: kcat 180, Km 310 uM. 编号: 190611中文名称: 标记肽Tos-GPR-7-氨基-4-甲基香豆素英文名: Tos-Gly-Pro-Arg-AMCCAS号: 117961-27-0单字母: Tos-GPR-AM…

代码随想录训练营第6天

专题&#xff1a;哈希表 题目&#xff1a;有效的字母异位词 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 例如 输入: s "anagram", t "nagaram" 输出: true 说明: 你可以假设字符串只包含小写字母。 题目理解&…

av_interleaved_write_frame():Broken pipe

使用FFmpeg命令rtsp推流到Docker中MediaServer服务器&#xff0c;15秒timeout一到就会打印错误信息&#xff0c;如下图&#xff1a; av_interleaved_write_frame():Broken pipe 命令中指定rtsp传输方式为tcp&#xff08;-rtsp_transport tcp &#xff09;&#xff0c;虽然不会…

第二证券|锂电起火风险完美解决?美科学家研发新型超高盐度电解质

现在&#xff0c;研讨人员正致力于以各种方式改善电池技能&#xff0c;其中最重要的是处理可燃性问题。 美国科学家们近期研宣布了一种新的电解质配方&#xff0c;就能够以一种十分有出路的方式处理这一问题&#xff0c;依托额定的盐含量来防止有问题发生的化学反应。 众所周知…

[附源码]JAVA毕业设计疫情期间高校师生外出请假管理系统录屏(系统+LW)

[附源码]JAVA毕业设计疫情期间高校师生外出请假管理系统录屏&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&am…

婚礼策划预约小程序开发,拓展客户人群

婚礼对于所有人来说都是非常重要的一件事&#xff0c;是人生中最值得回忆的美好场景。在经济水平的不断提高下&#xff0c;人们在结婚之前都要找专业团队对婚礼进行策划&#xff0c;让婚礼更加完美&#xff0c;正因如此&#xff0c;婚礼策划行业得到了迅速发展。但是从众多策划…

Zabbix-proxy安装(zabbix 6.0LTS)

关于zabbix 系列的博文我已经很久没有更新了&#xff0c;主要原因是最近太忙了。如果读者诸君有认真阅读我前面的文章并亲自实践过的话&#xff0c;相信你肯定会大有收获的。到目前为止zabbix 的基础知识在我的博文中基本已经全都涉及到了&#xff0c;至于如何运用&#xff0c;…

赛狐ERP11月新功能汇总 | 13大场景,超90项功能升级

赛狐ERP月度《产品升级》栏目来啦&#xff01; 11月我们加紧迭代了运营、进销存、财务、报表等多个维度的功能内容&#xff0c;聚焦卖家关注的需求要点&#xff0c;进行了13大业务场景&#xff0c;超90项功能升级。赛狐ERP将不断优化产品细节&#xff0c;提升卖家体验&#xf…

CH36X系列接口芯片Linux系统开发库说明

一、概述 ch36x_lib库是Linux系统下用于开发CH36X系列设备CH365/CH367/CH368等芯片应用的软件接口库&#xff0c;此接口库主要提供以下功能&#xff1a; 设备打开/关闭 获取芯片类型/驱动版本 获取IO基地址/Memory基地址/中断号 配置空间读写&#xff08;支持单字节/双字节…

基于java+springboot+mybatis+vue+mysql的体育场馆运营系统

项目介绍 在系统流程分析当中调查分析它是比较重要的环节&#xff0c;因为在这个系统当中它都涉及到每个环节的业务流程&#xff0c;所以从计算机毕业设计SpringBootVue选题推荐—体育场馆运营系统的设计的整体设计上要保证各个信息的正确输入和输出以及对数据储存的完整&…

linux下JDK安装

先下载离线安装包&#xff0c;我将安装包直接放到/root/softPackages目录下&#xff08;需要安装包可私聊&#xff09; 1.卸载已有OpenJDK(如果有) 查找已经安装的OpenJDK包 rpm -qa | grep java 如果有查出结果&#xff0c;直接yum -y remove卸载即可&#xff1a; 例如&a…

MobileNetV1作为CenterNet的Backbone尝试

1、CenterNet对于Backbone的要求是&#xff1a; 输入为512*512&#xff0c;输出为&#xff1a;heatmap&#xff08;128*128*C&#xff09;、wh&#xff08;128*128*2&#xff09;、reg&#xff08;128*128*2&#xff09;。 2、原生的MobileNet V1输出&#xff1a; 最后一层通…

JSP:使用 sitemesh/decorator装饰器装饰jsp页面(原理及详细配置)

摘要&#xff1a;首先这个Decorator解释一下这个单词&#xff1a;“装饰器”&#xff0c;我觉得其实可以这样理解&#xff0c;他就像我们用到的Frame&#xff0c;他把每个页面共有的东西提炼了出来&#xff0c;也可能我们也会用各种各样的include标签&#xff0c;将我们的常用页…

关于使用C语言实现负值和非负值进行左右划分,奇数和偶数进行左右划分

目录 1.负值和非负值左右划分 2.偶数和奇数的划分 数据结构之折半查找&#xff08;递归和非递归&#xff09;&#xff0c;插值查找和斐波那契查找 归并排序求逆序对&#xff08;C语言&#xff09; 1.负值和非负值左右划分 要求&#xff1a;使用尽可能少的时间将一组连续的序…

BlockRender for 3DMAX一键区域渲染插件使用教程

BlockRender一键区域渲染插件&#xff0c;自定义区域渲染并在视口中直接查看结果&#xff0c;并可以自动或手动对渲染的图像进行保存。 这个小插件的亮点就在于它能对渲染的图像进行保存&#xff0c;如果没有保存图像的功能&#xff0c;显然这个插件没有任何存在的意义。有了保…

分布式操作系统 - 6.分布式同步控制

文章目录1.物理时钟同步1.1 时钟同步问题1.2 时钟同步算法1.3 网络时间协议&#xff08;1&#xff09;Christian算法&#xff08;2&#xff09;考虑的问题&#xff08;3&#xff09;Berkeley算法-集中式方法&#xff08;4&#xff09;平均值算法-非集中式方法&#xff08;5&…

python教程十 列表

列表 序列是 Python 中最基本的数据结构。 序列中的每个值都有对应的位置值&#xff0c;称之为索引&#xff0c;第一个索引是 0&#xff0c;第二个索引是 1&#xff0c;依此类推。 Python 有 6 个序列的内置类型&#xff0c;但最常见的是列表和元组。 列表都可以进行的操作…

java基础巩固-宇宙第一AiYWM:为了维持生计,四大基础之OS_Part_3_Linux整起(Linux常见命令操作、Shell)

OS的一些基本概念简介&#xff0c;在下面两篇中已经介绍了一些&#xff1a; OS_Part_1整起&#xff08;进程线程协程并发并行、进程线程切换进程间通信、死锁\进程调度策略、分段分页、交换空间、OS三大调度机制&#xff09;OS_Part_2整起~IO们那些事【包括五种IO模型&#xf…