呂海東
(大連理工大學, 城市學院, 遼寧, 大連 116600)
當今世界,隨著監測設備和控制設備日益大規模增加,尤其是物聯網(IoT)的迅猛發展[1],工業過程控制系統變得越來越復雜,已經由傳統的集中控制模式,全面轉變為分布式控制模式。
傳統的控制系統通常可以控制幾百或幾千的傳感器和執行設備,再多就感到力不從心,系統性能嚴重下降,實時性難以滿足實際需求。如一個大城市的交通信號控制系統,智慧城市控制系統,需要控制的各種設備可能超過幾十萬,甚至上百萬。
為了克服多線程編程復雜,難以實現真正的高并發性,高可靠性和實時性的問題,Lightbend推出了著名的Akka框架[2]。Akka為構建分布式、異步、高性能的實時系統提供了一種創新的編程模式模型。Akka使開發人員能夠輕松地使用高級抽象來構建異步響應式系統,不必處理諸如線程、互斥和死鎖之類難題。Akka將應用程序的行為和狀態封裝和建模為Actor(角色),如過程控制系統中的每個設備對應一個Actor,這些Actor通過傳遞消息進行相互協作,完成數據的采集、傳輸和處理[3]。
Actor的核心工作模式是,應用程序只通過相互發送消息與之交互,而不像傳統的面向對象編程模式直接調用對象的方法。
Akka的Actor對象占用資源非常少,按照Akka的官方文檔說明,Akka的Actor運行在Java的JVM中,1GB Heap的內存可以運行250萬個Actor對象,即可以模擬250萬個控制設置(如傳感器、執行器、轉換器等),通過增加計算機的內存,Akka可以控制的Actor數量急劇上升。
Akka中Actor的工作在消息驅動模式[4],不像傳統的編程模式通過調用對象的方法,或函數調用Actor功能,而是發送消息給Actor,Actor只有接收到消息后,才可以執行指定的功能。消息驅動完全工作在異步模式[5],與傳統的同步模式相比,沒有線程的阻塞、鎖等問題,極大提高了系統的處理性能。
提出的過程控制系統基于Akka設計,當單個計算機無法滿足控制的設備數量需求時,可以通過Akka-Cluster模塊[6],實現多個計算機的集群,將Akka的Actor System向外擴展并跨越許多計算機,從而實現完全分布式處理。
當監控設備增多,單個節點服務器無法創建足夠多的參與者來映射每個設備,可采用Akka集群模塊構建節點群。每個節點上構建參與者系統,在網絡上監聽各個Actor System跨節點的消息傳輸。集群上的參與者可以互相發送消息,處理來自分布式系統中設備的監測數據。
每個節點Akka參與者系統,負責控制和監視該節點的所有參與者。每個參與者映射到物聯網設備,如溫度傳感器、壓力傳感器等設備,負責處理設備數據和執行設備(如流量控制閥等)的狀態。
通過Akka MQTT連接器[7],控制設備通過MQTT協議,通過發送消息將收集到的傳感器數據發送到其對應的Actor參與者。參與者通過定義由郵箱接收消息事件觸發的消息接收方法,并以異步響應式方式接收消息。Actor完全采用異步模型工作,不阻塞線程處理,可以處理大量的設備數據轉換。
Akka中的Actor非常輕量級,每個只消耗幾百個字節。根據Akka文檔,擁有1GB內存的節點可以創建大約250萬個Actor,而傳統的控制系統采用多線程模式只能有1 024個線程,只能支持連接1 020個設備。
在Akka-Cluster集群模塊的支持下,分布式控制系統的每個節點可以隨著需要控制的設備的數量多少進行動態的添加或移除Actor System節點,從而使平臺具有動態集群架構特性。基于Akka的控制系統總體架構如圖1所示。

圖1 基于Akka的控制系統總體架構圖
Actor模型使用發送和接收消息來實現設備間的通信和相互協作,有利于并發性和并行性,Actor是非常簡單的抽象,有利于簡化控制系統的編程。
Actor工作在異步、非阻塞和高性能的事件驅動編程模型中,所有Actor的工作必須通過給Actor發送消息實現。
為了在平臺中呈現實際的設備,使用Scala開發了用于定義設備和設備類型的Actor類,下面的代碼片段中展示了Actor對象的定義。
class DeviceType(name:String,mesureUnit:String){}
class Device(id:String,location:String,type:DeviceType){}
采集數據消息的設備是用Scala語言的case類實現的,當傳感器設備通過MQTT協議向Actor系統發送數據時,內置的Akka MQTT連接器將流轉換為Actor系統消息,該消息定義為以下代碼片段。
case class SensorData(device:DeviceModel,data:Double);
傳感器數據模型中包括采集數據的裝置device及其測量數據值data,最后用device屬性定義傳感器Actor,并重寫用接收到的消息觸發的超類Actor方法receive。
在創建Actor類之后,在Actor系統中創建它的對象,Actor系統運行并監視所有Actor。下面的代碼片段展示了如何使用Scala語言在Akka Actor系統中創建Actor對象,代碼中201為設備的編號。
implicit val system = ActorSystem();
val sensor201=system.actorOf(Props[SensorActor],"NO201");
在Actor對象創建之后,它可以監視自己的郵箱,當郵箱中接收到消息時,事件觸發器receive方法以響應式模式工作,不再阻塞線程。
在集群分布式系統中,參與者可以創建在遠程節點的Actor系統中,Akka Remote模塊實現參與者透明地向遠程參與者發送消息。
為了滿足超大規模控制系統中設備和數據采集處理的需要,必須建立服務器集群。雖然Akka Actor非常輕量級,1GB HEAP的單臺服務器可以容納250萬個Actor,可以支持相同數量的控制設備,但單個節點不支持容錯,還需要集群架構。
Akka集群提供了一種基于點對點的容錯分布式集群成員服務,沒有單點故障或單點瓶頸。Akka集群允許構建分布式應用程序,其中一個應用程序或服務跨越多個節點(實際上是多個Actor系統)。
控制系統應用程序駐留在一個主節點中,主節點管理其他3個成員節點,這些節點可以動態加入集群。在每個節點上,應用程序類路徑群集配置文件應用程序.conf創建為以下代碼段。
akka {
cluster {
seed-nodes = [
"akka.tcp://IoTPlatform@210.30.108.224:2551",
"akka.tcp://IoTPlatform@210.30.108.225:2551",
"akka.tcp://IoTPlatform@210.30.108.226:2551"
]
}
}
akka.extensions=["akka.cluster.metrics.ClusterMetricsExtension"]
akka.cluster.metrics.native-library-extract-folder=${user.dir}/target/native
在Akka的集群系統中,先創建種子節點,再創建普通節點。當新普通節點啟動時,它向所有種子節點發送一條消息,實現與種子節點交互。
在控制系統設備采集層,采用JavaScript框架Johnny Five框架連接傳感器等設備[8],傳感器數據通過Johnny Five獲取后,發送到Kafka服務器[9],并轉換到Actor郵箱。
關鍵是以Apache-Kafka[10]為中心來接收傳感器的監測數據,并向執行器發送動作指令。Apache-Kafka是一個發布/訂閱消息傳遞系統,設計用于分布式集群環境中,Kafka中的數據被持久地、有序地存儲,并且可以被確定地讀取。Kafka常用于實時流數據體系結構,實現數據的實時處理。
對于設備層,當數據被獲取時,發送到Kafka消息主題,Kafka節點是一個節點.js客戶端,與Apache Kafka 集成。
采集的數據發送到Kafka后,本控制系統使用Alpakka-Kafka連接器連接Apache-Kafka,并將Kafka隊列中的數據轉換為Akka-Stream。Alpakka是一個開源項目,用于實現流數據的自動感知和響應式集成數據流管道,它建立在Akka Streams之上,為反應式和面向流的編程提供DSL,同時內置了對背壓的支持,實現高可靠性的數據傳輸。
最后Alpakka消費者訂閱Kafka主題并將消息傳遞到Akka流中。為了連接Kafka,ActorSystem內的ConsumerSettings配置為Akka-Kafka,同時消息的消費者在應用程序.conf文件配置。將Actor被編程為Kafka client,在接收事件時對消息做出反應,然后將Akka消息發送給Webs Socket Actor,將數據發送給Web客戶端顯示。
本文設計并實現了一個基于Akka框架的全新的高可靠分布式和基于響應式編程模型的的過程控制系統。與傳統的基于多線程的控制系統相比,該系統具有消息驅動、彈性、彈性、響應性強等優點,編程模型簡單,編程效率高,開發時間短等優點。
充分利用Akka的Actor模型,每個Actor只使用非常少的內存資源,可以使用實現一個普通PC控制上百萬設備的能力,這是傳統的基于線程的C語言編程模式難以企及的。
在Akka集群和遠程模塊的支持下,系統可以擴展和伸縮,可以支持多個核心CPU和多個服務器。使用Akka Actor模型,開發人員不必使用諸如線程和鎖之類的低級結構,這也是使用傳統編程模式難以實現超大規模的控制系統的原因所在。
在未來的控制系統的開發與應用中,基于角色模型為基礎的Akka技術,必將成為主流的技術和平臺。