天天看點

Dapr-Actor建構塊

 前篇-綁定 文章對Dapr的綁定建構塊進行了解,本篇繼續對 Actor 建構塊進行了解學習。

 Actors 為最低級别的“計算單元”。 換句話說,您将代碼寫入獨立單元 ( 稱為actor) ,該單元接收消息并一次處理消息,而不進行任何類型的并行或線程處理。

 當代碼處理一條消息時,它可以向其他參與者發送一條或多條消息,或者建立新的 Actors。 底層 運作時 将管理每個 actor 的運作方式,時機和位置,并在 Actors 之間傳遞消息。

 大量 Actors 可以同時執行,而 Actors 可以互相獨立執行。

 Dapr 包含專門實作 virtual actors 模式 的運作時。 通過 Dapr 的實作,您可以根據 Actors 模型編寫 Dapr Actor,而 Dapr 利用底層平台提供的可擴充性和可靠性保證。

您的問題空間涉及大量(數千或更多) 的獨立和孤立的小機關和邏輯。

您想要處理單線程對象,這些對象不需要外部元件的大量互動,例如在一組 Actors 之間查詢狀态。

您的 actor 執行個體不會通過發出I/O操作來阻塞調用方。

  Dapr Actors 是虛拟的,意思是他們的生命周期與他們的 in - memory 表現不相關。 是以,它們不需要顯式建立或銷毀。 Dapr Actors 運作時在第一次接收到該 actor ID 的請求時自動激活 actor。 如果 actor 在一段時間内未被使用,那麼 Dapr Actors 運作時将回收記憶體對象。 如果以後需要重新啟動,它還将保持對 actor 的一切原有資料。

  調用 actor 方法和 reminders 将重置空閑時間,例如,reminders 觸發将使 actor 保持活動狀态。 不論 actor 是否處于活動狀态或不活動狀态 Actor reminders 都會觸發,對不活動 actor ,那麼會首先激活 actor。 Actor timers 不會重置空閑時間,是以 timer 觸發不會使參與者保持活動狀态。 Timer 僅在 actor 活躍時被觸發。

  空閑逾時和掃描時間間隔 Dapr 運作時用于檢視是否可以對 actor 進行垃圾收集。 當 Dapr 運作時調用 actor 服務以擷取受支援的 actor 類型時,可以傳遞此資訊。

  Virtual actors 生命周期抽象會将一些警告作為 virtual actors 模型的結果,而事實上, Dapr Actors 實施有時會偏離此模型。

  在第一次将消息發送到其 actor 辨別時,将自動激活 actor ( 導緻構造 actor 對象) 。 在一段時間後,actor 對象将被垃圾回收。 以後,再次使用 actor ID 通路,将構造新的 actor。 Actor 的狀态比對象的生命周期更久,因為狀态存儲在 Dapr 運作時的配置狀态提供程式中(也就是說Actor即使不在活躍狀态,仍然可以讀取它的狀态)。

 Dapr Sidecar 提供了用于調用執行元件的 HTTP/gRPC API。 這是 HTTP API 的URL格式: 

<code>&lt;daprPort&gt;</code>: Dapr 偵聽的 HTTP 端口。

<code>&lt;actorType&gt;</code>:執行元件類型。

<code>&lt;actorId&gt;</code>:要調用的特定參與者的 ID。

 a)Actor元件放置服務流程:

Dapr-Actor建構塊

啟動時,Sidecar 調用執行元件服務以擷取注冊的執行元件類型和執行元件的配置設定。

Sidecar 将注冊的執行元件類型的清單發送到放置服務。

放置服務會将更新的分區資訊廣播到所有執行元件服務執行個體。 每個執行個體都将保留分區資訊的緩存副本,并使用它來調用執行元件。

 b)調用Actor元件方法流程:

  

Dapr-Actor建構塊

服務在Sidecar 上調用執行元件 API。 請求正文中的 JSON 有效負載包含要發送到執行元件的資料。

Sidecar 使用位置服務中的本地緩存的分區資訊來确定哪個執行元件服務執行個體 (分區) 負責托管 ID 為的執行元件 <code>3</code> 。 在此示例中,它是 pod 2 中的服務執行個體。 調用将轉發到相應的Sidecar 。

Pod 2 中的Sidecar 執行個體調用服務執行個體以調用執行元件。 服務執行個體激活actor(如果它還沒有激活)并執行actor 方法。

 可以使用計時器和提醒來計劃自身的調用。 這兩個概念都支援配置截止時間。 不同之處在于回調注冊的生存期:

隻要激活執行元件,計時器就會保持活動狀态。 計時器 不會 重置空閑計時器,是以它們不能使執行元件處于活動狀态。

提醒長于執行元件激活。 如果停用了某個執行元件,則會重新激活該執行元件。 提醒 将 重置空閑計時器。

 1、Timers定時器:

  Dapr Actor 運作時確定回調方法被順序調用,而非并發調用。 這意味着,在此回調完成執行之前,不會有其他Actor方法或timer/remider回調被執行。

  Timer的下一個周期在回調完成執行後開始計算。 這意味着 timer 在回調執行時停止,并在回調完成時啟動。

  Dapr Actor 運作時在回調完成時儲存對actor的狀态所作的更改。 如果在儲存狀态時發生錯誤,那麼将取消激活該actor對象,并且将激活新執行個體。

  當actor作為垃圾回收(GC)的一部分被停用時,所有 timer 都會停止。 在此之後,将不會再調用 timer 的回調。 此外, Dapr Actors 運作時不會保留有關在失活之前運作的 timer 的任何資訊。 也就是說,重新啟動 actor 後将會激活的 timer 完全取決于注冊時登記的 timer。

  a) 建立定時器:

  Timer 的 <code>duetime</code> 和回調函數可以在請求主體中指定。 到期時間(due time)表示注冊後 timer 将首次觸發的時間。 <code>period</code> 表示timer在此之後觸發的頻率。 到期時間為0表示立即執行。 負 due times 和負 periods 都是無效。

  以下請求體配置了一個 timer, <code>dueTime</code> 9秒, <code>period</code> 3秒。 這意味着它将在9秒後首次觸發,然後每3秒觸發一次。

  b) 删除定時器:

 2、Reminders 提醒:

  Reminders 是一種在指定時間内觸發 persistent 回調的機制。 它們的功能類似于 timer。 但與 timer 不同,在所有情況下 reminders 都會觸發,直到 actor 顯式取消注冊 reminders 或删除 actor 。 具體而言, reminders 會在所有 actor 失活和故障時也會觸發觸發,因為Dapr Actors 運作時會将 reminders 資訊持久化到 Dapr Actors 狀态提供者中。

  a) 建立Reminders   

  Reminders 的 <code>duetime</code> 和回調函數可以在請求主體中指定。 到期時間(due time)表示注冊後 reminders将首次觸發的時間。 <code>period</code> 表示在此之後 reminders 将觸發的頻率。 到期時間為0表示立即執行。 負 due times 和負 periods 都是無效。 若要注冊僅觸發一次的 reminders ,請将 period 設定為空字元串。

  以下請求體配置了一個 reminders, <code>dueTime</code> 9秒, <code>period</code> 3秒。 這意味着它将在9秒後首次觸發,然後每3秒觸發一次。

  b) 擷取Reminders 

  c) 删除Reminders 

  使用 Dapr 狀态管理建構塊儲存執行元件狀态。由于執行元件可以一輪執行多個狀态操作,是以狀态存儲元件必須支援多項事務。

  目前狀态管理元件支援事務/Actors支援情況:

Name

CRUD

事務

ETag

Actors

狀态

元件版本

自從

Aerospike

Alpha

v1

1.0

Apache Cassandra

Cloudstate

Couchbase

Hashicorp Consul

Hazelcast

Memcached

MongoDB

GA

MySQL

PostgreSQL

Redis

RethinkDB

Zookeeper

 需要支援Actor狀态存儲需添加以下内容:

  1、添加nuget包引用:Dapr.Actors和Dapr.Actors.AspNetCore。

  2、定義IOrderStatusActor接口,需要繼承自IActor

  執行元件方法的傳回類型必須為 <code>Task</code> 或 <code>Task&lt;T&gt;</code> 。 此外,執行元件方法最多隻能有一個參數。 傳回類型和參數都必須可 <code>System.Text.Json</code> 序列化。

 3、定義OrderStatusActor實作IOrderStatusActor,并繼承自Actor

 4、修改Statup.cs檔案

 5、添加ActorController操作Actor

 6、Timer應用:使用Actor基類的 <code>RegisterTimerAsync</code> 方法注冊計時器:在OrderStatusActor類中新增方法

 7、Reminder操作:使用Actor基類的 RegisterReminderAsync 方法計劃計時器。在OrderStatusActor類中新增方法

 8、啟動定時器:

 Dapr 執行元件建構基塊可以更輕松地編寫正确的并發系統。 執行元件是狀态和邏輯的小單元。 它們使用基于輪次的通路模型,無需使用鎖定機制編寫線程安全代碼。 執行元件是隐式建立的,在未執行任何操作時以無提示方式從記憶體中解除安裝。 重新激活執行元件時,自動持久儲存并加載執行元件中存儲的任何狀态。 執行元件模型實作通常是為特定語言或平台建立的。 但是,借助 Dapr 執行元件建構基塊,可以從任何語言或平台利用執行元件模型。

 Actor元件支援計時器和提醒來計劃将來的工作。 計時器不會重置空閑計時器,并且允許執行元件在未執行其他操作時停用。 提醒會重置空閑計時器,并且也會自動保留。 計時器和提醒都遵守基于輪次的通路模型,確定在處理計時器/提醒事件時無法執行任何其他操作。

 使用 Dapr 狀态管理建構基塊 持久儲存執行元件狀态。 支援多項事務的任何狀态存儲都可用于存儲執行元件狀态。