Akka的Actor層級結構《seven》譯

示例簡介 

    在寫散文時,最難的部分每每是編寫前幾句話。在開始構建Akka系統時,有一種相似的「空白畫布」的感受。你可能想知道:哪一個應該是第一個Actor?它應該住在哪裏?它該怎麼辦?幸運的是 - 與散文不一樣,已創建的最佳實踐能夠指導咱們完成這些初步步驟。在本指南的其他部分,咱們將研究一個簡單的Akka應用程序的核心邏輯,向您介紹Actor並向您展現如何使用它們制定解決方案。該示例演示了可幫助您啓動Akka項目的常見模式。html

準備部分

    您應該已經按照Akka Quickstart with Java guide指南中的說明下載並運行Hello World示例。您將使用它做爲種子項目並添加本教程中描述的功能。java

IoT例子

    在本教程中,咱們將使用Akka構建物聯網(IoT)系統的一部分,該系統報告來自客戶家中安裝的傳感器設備的數據。該示例着重於溫度讀數。目標用例容許客戶登陸並查看他們家中不一樣區域的最後報告溫度。您能夠想象這樣的傳感器還能夠收集相對溼度或其餘有趣的數據,而且應用程序可能支持讀取和更改設備配置,甚至可能在傳感器狀態超出特定範圍時警告房主。瀏覽器

    在真實系統中,應用程序將經過移動應用程序或瀏覽器向客戶公開。本指南僅關注用於存儲將經過網絡協議調用的溫度的核心邏輯,例如HTTP。它還包括編寫測試,以幫助您得到測試Actor的溫馨和熟練。安全

    教程應用程序包含兩個主要組件:網絡

  • 設備數據收集: - 維護遠程設備的本地表示。用於家庭的多個傳感器設備被組織成一個設備組。
  • 用戶儀表板: - 按期從設備收集登陸用戶家中的數據,並將結果顯示爲報告。

    下圖說明了示例應用程序體系結構。因爲咱們對每一個傳感器設備的狀態感興趣,所以咱們將設備設計爲Actor。正在運行的應用程序將根據須要建立儘量多的設備Actor和設備組實例。ide

您將在本教程中學到什麼

    本教程介紹並說明:學習

  • Actor層次結構及其如何影響Actor行爲
  • 如何爲Actor選擇合適的粒度
  • 如何將協議定義爲消息
  • 典型的會話風格

    讓咱們開始學習更多關於Actor的內容。測試

Dependency

    使用Akka能夠減輕您爲actor系統建立基礎結構的麻煩,也能夠減小編寫控制基本行爲所需的低級代碼。爲了理解這一點,讓咱們看一下您在代碼中建立的actor與Akka在內部爲您建立和管理的actor之間的關係,actor生命週期和失敗處理。
ui

Actor層次結構

    Akka的Sctor老是屬於他的父母。一般,您經過調用getContext().actorOf()來建立actor。這不是建立一個「獨立」Actor,而是將新Actor做爲孩子注入已經存在的樹中:建立者Actor成爲新建立的子演員的父級。你可能會問,你建立的第一個Actor的父母是誰?spa

    以下圖所示,全部Actor都有一個共同的父母,即用戶監護人。可使用system.actorOf()在此actor下建立新的actor實例。正如咱們在快速入門指南中所述,建立actor會返回一個有效URL的引用。所以,例如,若是咱們使用system.actorOf(...,「someActor」)建立一個名爲someActor的actor,它的引用將包含路徑 / user / someActor

    實際上,在代碼中建立actor以前,Akka已經在系統中建立了三個actor。這些內置Actor的名字包含監護人,由於他們監督他們路徑中的每一個兒童Actor。監護人演員包括:

  • /the so-called root guardian 這是系統中全部actor的父級,也是系統自己終止時中止的最後一個。
  • /user 這是全部用戶建立的actor的父actor。
  • /system 系統監護

    在Hello World示例中,咱們已經看到system.actorOf()如何直接在/ user下建立一個actor。咱們將其稱爲頂級actor,儘管實際上它只位於用戶定義的層次結構的頂部。您的ActorSystem中一般只有一個(或極少數)頂級actor。咱們經過從現有actor調用context.actorOf()來建立子級或非頂級actor。context.actorOf()方法的簽名與system.actorOf()相同,後者是它的頂級對應物。

    查看actor層次結構的最簡單方法是打印ActorRef實例。在這個小實驗中,咱們建立一個actor,打印它的引用,建立這個actor的子元素,並打印子元素的引用。咱們從Hello World項目開始,若是您尚未下載它,請從Lightbend Tech Hub下載Quickstart項目。

    在Hello World項目中,導航到com.lightbend.akka.sample包並在此處建立一個名爲ActorHierarchyExperiments.java的新Java文件。將如下代碼段中的代碼複製並粘貼到此新源文件中。保存文件並運行sbt「run Main com.lightbend.akka.sample.ActorHierarchyExperiments」以觀察輸出。

    請注意消息要求第一個Actor執行其工做的方式。咱們使用父級的引用發送消息:firstRef.tell(「printit」,ActorRef.noSender())。當代碼執行時,輸出包括第一個actor和它做爲printit case的一部分建立的子節點的引用。您的輸出應相似於如下內容:

注意引用的結構:

  • 兩條路徑都以akka:// testSystem /開頭。因爲全部actor引用都是有效的URL,所以akka://是協議字段的值。
  • 接下來,就像在網上同樣,URL標識系統。在此示例中,系統名爲testSystem,但它能夠是任何其餘名稱。若是啓用了多個系統之間的遠程通訊,則URL的這一部分包含主機名,以便其餘系統能夠在網絡上找到它。
  • 由於第二個actor的引用包含path / first-actor /,因此它將它標識爲第一個actor的子節點
  • actor參考的最後一部分#1053618476或#-1544706041是一個惟一的標識符,在大多數狀況下你能夠忽略它。

    如今您已經瞭解了actor層次結構的樣子,您可能想知道:爲何咱們須要這種層次結構?它是幹什麼用的?

    層次結構的一個重要做用是安全地管理actor的生命週期。讓咱們接下來考慮一下,看看這些知識如何幫助咱們編寫更好的代碼。

原文:https://doc.akka.io/docs/akka/current/guide/tutorial.html

有什麼討論的內容,能夠加我公衆號:

相關文章
相關標籤/搜索