截至目前我們所寫的關于角色的例子中,所有角色及其用戶端都運作于同一JVM程序中。但在現實生活中,有一部分開發者認為角色也應該像在Erlang中那樣被用于程序間通信。而另一部分開發者則像我們在前面所示範的那樣隻将其應用于程序内通信。值得說明的一點是,Scala和Akka同時兼顧了這兩個陣營的需求。
在Akka中,遠端角色的用法與程序内角色的用法十分相似,唯一的差別就在于我們如何通路角色。Akka在底層使用了JBoss Netty和Google Protocol Buffers庫來實作遠端操作與本地調用的無縫銜接,使我們可以跨越程序邊界,将任意角色所産生的序列化消息和引用傳遞給任意的遠端角色。Akka提供了通過程式設計和配置選項兩種方式來配置主機名、端口号、消息幀的大小、安全設定等配置資訊。這些配置資訊的詳情可以參閱Akka的幫助文檔,為了簡單起見,在本節的示例中我們将隻使用預設設定。
為了能夠遠端通路角色,我們需要對角色進行注冊以便将角色與一個名字或ID綁定起來,進而使用戶端能夠借此識别所需通路的遠端角色。在完成注冊之後,用戶端就可以通過注冊ID、主機名和端口号來給角色發請求了。發送給角色的請求既可以是單向消息也可以是雙向消息,形式上與和本地角色的互動基本類似。
下面讓我們一起來建立一個使用遠端角色的例子。過去我曾是一個系統管理者,有很多單機系統名額如可用磁盤空間、系統性能、CPU使用率等等都是系統管理者經常需要關注的。除此之外,通過在機房各處安裝的傳感器,我們可以通過監測室内溫度、濕度等環境名額來保證高性能計算實驗室可以一直正常運作。此時如果能有一個應用程式可以幫我從這些遠端機器上把這些資訊收集彙總起來就更好了,下面就讓我們一起來寫一個吧。
我們令Monitor 角色負責接收從各個遠端用戶端發來的系統資訊。部署于各台機器上的用戶端可以自行決定何時向Monitor發送這一資訊。在本例中,上述用戶端每次都會将系統資訊分作幾組資料發送給Monitor。
下面就讓我們先從Monitor類開始入手。該角色就是各個用戶端将要與之互動的遠端角色: