我是Akka的新手(Java lib,v2.3.9)。我試圖遵循supervisor hierarchy best practices,但由於這是我的第一個Akka應用程序,我在某處遇到了精神障礙。如何確定Akka actor/supervisor層次結構?
在我的第一個Akka應用程序(真正意圖在多個應用程序中重複使用的庫)中,來自外部世界的輸入顯示爲傳遞給actor的Process
消息。使用我的應用程序的開發人員將提供一個基於文本的配置文件,最終配置哪些參與者發送實例,哪些不參與實例。換句話說,說這些都是我的演員類:
// Groovy pseudo-code
class Process {
private final Input input
Process(Input input) {
super()
this.input = deepClone(input)
}
Input getInput() {
deepClone(this.input)
}
}
class StormTrooper extends UntypedActor {
@Override
void onReceive(Object message) {
if(message instanceof Process) {
// Process the message like a Storm Trooper would.
}
}
}
class DarthVader extends UntypedActor {
@Override
void onReceive(Object message) {
if(message instanceof Process) {
// Process the message like Darth Vader would.
}
}
}
class Emperor extends UntypedActor {
@Override
void onReceive(Object message) {
if(message instanceof Process) {
// Process the message like the Emperor would.
}
}
}
// myapp-config.json -> where the actors are configured, along with other
// app-specific configs
{
"fizzbuzz": "true",
"isYosemite": "false",
"borderColor": "red",
"processors": [
"StormTrooper",
"Emperor"
]
}
正如你可以在配置文件中看到,只有StormTrooper
和Emperor
選擇接受Process
消息。最終結果是零(0)DarthVader
演員正在創建。這也是我的意圖,這將導致正在作出一個Set<ActorRef>
可被填充了StormTrooper
和Emperor
,像這樣的應用程序:
class SomeApp {
SomeAppConfig config
static void main(String[] args) {
String configFileUrl = args[0] // Nevermind this horrible code
// Pretend here that configFileUrl is a valid path to
// myapp-config.json.
SomeApp app = new SomeApp(configFileUrl)
app.run()
}
SomeApp(String url) {
super()
config = new SomeAppConfig(url)
}
void run() {
// Since the config file only specifies StormTrooper and
// Emperor as viable processors, the set only contains instances of
// these ActorRef types.
Set<ActorRef> processors = config.loadProcessors()
ActorSystem actorSystem = config.getActorSystem()
while(true) {
Input input = scanForInput()
Process process = new Process(input)
// Notify each config-driven processor about the
// new input we've received that they need to process.
processors.each {
it.tell(process, Props.self()) // This isn't correct btw
}
}
}
}
所以,你可以(希望)看,我們擁有所有這些演員(實際上,許多十幾個UntypedActor
impls)處理Process
消息(這反過來從一些來源捕獲Input
)。至於哪些演員甚至還活着/在線來處理這些Process
消息完全由配置驅動。最後,每次應用收到Input
時,它都會被注入到Process
消息中,並且該消息被髮送到所有已配置/生存的角色。
以此作爲給定的背景/設置,我無法確定「演員/監督員層級」應該是什麼。在我的使用案例中,所有參與者都是真正平等的,沒有監督結構。 StormTrooper
只是簡單地收到Process
消息,如果該類型的actor被配置爲存在。其他演員子類相同。
我完全錯過了什麼嗎?如果所有角色相同且層次結構本質上是「平坦」/水平的,如何定義監督層次結構(用於容錯目的)?
借用Viktor Klang的一個流程,想想如果你只有普通人而不是電腦,那麼你會怎麼做,然後想象每個人都是演員。哪些人監督哪些人? – Ryan
謝謝@Ryan(+1) - 如果我有真人作爲演員,而不是電腦,我會有一個擁有'StormTrooper','DarthVader'和'Emperor'的控制單元。當有人想發送信息給這個控股單位的居民時,他們必須在一張紙上寫下同樣的信息,每人一張紙。如果他們希望向「StormTrooper」和「Emperor」發送消息,他們會在兩張紙上寫下完全相同的消息。然後,他們會將所有/任何文件遞給我,我會將此信息傳達給適用的各方。 – smeeb
換句話說,這裏仍然沒有管理員層次結構。 :-) – smeeb