日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > 使用Akka構建集群(一)

使用Akka構建集群(一)

來源:程序員人生   發布時間:2017-03-17 09:57:34 閱讀次數:7657次

概述

Akka提供的非常吸引人的特性之1就是輕松構建自定義集群,這也是我要選擇Akka的最基本緣由之1。如果你不想敲太多代碼,也能夠通過簡單的配置構建1個非常簡單的集群。本文為說明Akka集群構建的學習本錢低廉,以Akka官網的例子代碼動身,進行簡單改造后與Spring集成,有關Spring集成的信息你可以選擇瀏覽《Spring與Akka的集成》1文。本文所講述的是1款10分簡便的集群監聽器,它通過定閱集群成員的消息,對全部集群的成員進行管理(管理的方式只是打印1行日志)。

Akka集群規范

根據Akka官網的描寫——Akka集群特性提供了容錯的、去中心化的、基于集群成員關系點對點的,不存在單點問題、單點瓶頸的服務。其實現原理為閑談協議和失敗檢查。

集群概念

  • 節點(node):集群中的邏輯成員。允許1臺物理機上有多個節點。由元組hostname:port:uid唯1肯定。
  • 集群(cluster):由成員關系服務構建的1組節點。
  • 領導(leader):集群中唯1扮演領導角色的節點。
  • 種子節點(seed node):作為其他節點加入集群的連接點的節點。實際上,1個節點可以通過向集群中的任何1個節點發送Join(加入)命令加入集群。

節點狀態

這里以Akka官網提供的成員狀態狀態圖為例,如圖1所示。


圖1

圖1展現了狀態轉換的兩個因素:動作和狀態。

狀態

  • joining:節點正在加入集群時的狀態。
  • weekly up:配置了akka.cluster.allow-weakly-up-members=on時,啟用的狀態。
  • up:集群中節點的正常狀態。
  • leaving/exiting:優雅的刪除節點時,節點的狀態。
  • down:標記為已下線的狀態。
  • removed:墓碑狀態,表示已不再是集群的成員。

動作

  • join:加入集群。
  • leave:告知節點優雅的離開集群。
  • down:標記集群為已下線。

配置

本節將要展現構建集群所需要的最基本的配置,幾近不會引入過量的開發本錢,1個集群就構建完成了。application.conf文件的內容以下:

akka {
  actor {
    provider = "akka.cluster.ClusterActorRefProvider"
  }
  remote {
    log-remote-lifecycle-events = off
    netty.tcp {
      hostname = "127.0.0.1"
      port = 2551
    }
  }

  cluster {
    seed-nodes = [
      "akka.tcp://metadataAkkaSystem@127.0.0.1:2551",
      "akka.tcp://metadataAkkaSystem@127.0.0.1:2552"]

    #//#snippet
    # excluded from snippet
    auto-down-unreachable-after = 10s
    #//#snippet
    # auto downing is NOT safe for production deployments.
    # you may want to use it during development, read more about it in the docs.
    #
    # auto-down-unreachable-after = 10s
    
    # Disable legacy metrics in akka-cluster.
	metrics.enabled=off
  }

}
此配置文件與我在《使用Akka的遠程調用》1文中的配置有很多不同:

  1. provider不再是akka.remote.RemoteActorRefProvider,而是akka.cluster.ClusterActorRefProvider。這說明ActorRef將由akka.cluster.ClusterActorRefProvider提供;
  2. 增加了cluster配置;

cluster配置詳解

首先任何1個集群都需要種子節點,作為基本的加入集群的連接點。本例中以我本地的兩個節點(分別監聽2551和2552端口)作為種子節點。不管配置了多少個種子節點,除在seed-nodes中配置的第1個種子節點需要率先啟動以外(否則其它種子節點沒法初始化并且其它節點也沒法加入),其余種子節點都是啟動順序無關的。第1個節點需要率先啟動的另外一個緣由是如果每一個節點都可以率先啟動,那末有可能造成1個集群出現幾個種子節點都啟動并且加入了自己的集群,此時全部集群實際上分裂為幾個集群,造成孤島。當你啟動了超過2個以上的種子節點,那末第1個啟動的種子節點是可以關閉下線的。如果第1個種子節點重啟了,它將不會在自己創建集群而是向其它種子節點發送Join消息加入已存在的集群。
注意:除akka.remote.netty.tcp.port配置項指定的端口不同,所有加入集群節點的application.conf可以完全1樣。如果akka.remote.netty.tcp.port未指定,那末Akka會為你隨機選擇其他未占用的端口。

簡單集群監聽器

我們創建1個簡單的集群監聽器SimpleClusterListener(實際上是1個Actor,由于繼承了UntypedActor),它向集群定閱MemberEvent(成員事件)和UnreachableMember(不可達成員)兩種消息,來對集群成員進行管理(打印),其實現見代碼清單1所示。

代碼清單1

@Named("SimpleClusterListener")
@Scope("prototype")
public class SimpleClusterListener extends UntypedActor {
	LoggingAdapter log = Logging.getLogger(getContext().system(), this);
	Cluster cluster = Cluster.get(getContext().system());

	// subscribe to cluster changes
	@Override
	public void preStart() {
		// #subscribe
		cluster.subscribe(getSelf(), ClusterEvent.initialStateAsEvents(), MemberEvent.class, UnreachableMember.class);
		// #subscribe
	}

	// re-subscribe when restart
	@Override
	public void postStop() {
		cluster.unsubscribe(getSelf());
	}

	@Override
	public void onReceive(Object message) {
		if (message instanceof MemberUp) {
			MemberUp mUp = (MemberUp) message;
			log.info("Member is Up: {}", mUp.member());

		} else if (message instanceof UnreachableMember) {
			UnreachableMember mUnreachable = (UnreachableMember) message;
			log.info("Member detected as unreachable: {}", mUnreachable.member());

		} else if (message instanceof MemberRemoved) {
			MemberRemoved mRemoved = (MemberRemoved) message;
			log.info("Member is Removed: {}", mRemoved.member());

		} else if (message instanceof MemberEvent) {
			// ignore

		} else {
			unhandled(message);
		}

	}
}

運行展現

初始化的代碼以下:
		logger.info("Start simpleClusterListener");
		final ActorRef simpleClusterListener = actorSystem.actorOf(springExt.props("SimpleClusterListener"), "simpleClusterListener");
		actorMap.put("simpleClusterListener", simpleClusterListener);
		logger.info("Started simpleClusterListener");

我們首先啟動第1個種子節點,配置跟第1小節完全1致。我們視察SimpleClusterListener的日志輸出以下圖所示。


我們再啟動第2個種子節點,其配置的akka.remote.netty.tcp.port為2552,我們視察SimpleClusterListener的日志輸出以下圖所示。


我們再啟動1個非種子節點,沒有為其指定akka.remote.netty.tcp.port,我們視察SimpleClusterListener的日志輸出以下圖所示。


可以看到新加入的節點信息被SimpleClusterListener打印出來了,仔細的同學可能發現了1些Akka集群中各個節點的狀態遷移信息,第1個種子節點正在加入本身創建的集群時的狀態時JOINING,由于第1個種子節點將自己率先選舉為Leader,因此它還將自己的狀態改變成Up。后面它還將第2個種子節點和第3個節點從JOINING轉換到Up狀態。

我們停止第3個加入的節點,我們視察SimpleClusterListener的日志輸出以下圖所示。


可以看到其狀態首先被標記為Down,最后被轉換為Removed。

總結

通過以上介紹相信大家對使用Akka構建集群有了基本的認識,是否是很輕松?

其它Akka利用的博文以下:

  1. 《Spring與Akka的集成》;
  2. 《使用Akka的遠程調用》;
  3. 《使用Akka構建集群(1)》;
  4. 《使用Akka構建集群(2)》;
  5. 《使用Akka持久化——持久化與快照》;
  6. 《使用Akka持久化——消息發送與接收》;


后記:個人總結整理的《深入理解Spark:核心思想與源碼分析》1書現在已正式出版上市,目前京東、鐺鐺、天貓等網站均有銷售,歡迎感興趣的同學購買。


京東:http://item.jd.com/11846120.html 

鐺鐺:http://product.dangdang.com/23838168.html 


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 99精品一区二区三区 | 91在线精品视频 | 蜜桃视频一区二区三区在线观看 | 欧美成人精品在线观看 | 91一区| 午夜网址| 国产在视频线在精品视频55 | 亚洲欧洲无码一区二区三区 | www.日韩视频 | 日韩免费毛片 | 一二三区在线 | 国产免费小视频 | 成人1区2区 | www.狠狠干 | 国产精品视频免费在线观看 | 黄色一级片在线看 | 欧美不卡在线 | 91久久久久久久久久久久久 | 久久亚洲精品国产日韩潮高 | 性视频网 | 在线观看国产小视频 | 成人在线不卡 | 一区二区三区精品 | 中文字字幕在线中文乱码免费 | 簧片av | 最污网站| 狠狠干狠狠操 | 欧美日韩亚 | 亚洲欧洲精品成人久久曰影片 | 国产精品一区二区三区在线 | 国产成人精品一区二区三区四区 | 天天草夜夜操 | 久久久久国产精品免费免费搜索 | 久久精品免费观看 | 亚洲精品wwwww| 国产视频一区二区在线观看 | 国产日韩欧美日韩 | 色伊人| 国产毛片久久久久久国产毛片 | 国产一区二区三区影视 | 免费在线一区二区 |