2013-08-21 22 views
3

Joe Armstrong's dissertation,他指定一個基於Actor的程序應該按照以下三個步驟進行設計。事情是,我不明白這些步驟如何映射到現實世界的問題或如何應用它們。這是喬的原始建議。如何設計和構建一個使用Actor的程序

  1. 我們確定我們現實世界活動中的所有真正併發活動。
  2. 我們確定併發活動之間的所有消息通道。
  3. 我們寫下所有可以在不同消息通道上流動的消息。 現在我們編寫程序。程序的結構應該嚴格遵循問題的結構。每個真實世界的併發活動都應該映射到我們的編程語言中的一個併發進程。如果將問題映射到程序的1:1映射,我們說程序與問題是同構的。

映射精確到1:1非常重要。原因是它最大限度地減少了問題與解決方案之間的概念差距。如果這個映射不是1:1,那麼程序將很快退化並變得難以理解。當使用非CO語言解決併發問題時,經常會觀察到這種退化。通常,讓程序運行的唯一方法是強制幾個獨立的活動由相同的語言線程或進程來控制。這導致不可避免的清晰度損失,並且使得節目容易受到複雜且不可重現的干擾錯誤的影響。

我覺得#1很容易搞清楚。它是#2(和3)我迷路的地方。爲了說明我的沮喪,我在這個要點中提出了一項小服務(Ruby service with callbacks)。

看看這個示例服務,我可以看到如何回答#1。我們有5個併發服務。

  1. 開始
  2. LoginGateway
  3. LogoutGateway
  4. 停止
  5. 訂閱

其中一些服務不工作(或不應該)取決於服務狀態如果服務尚未開始,則登錄/註銷/訂閱沒有意義。這種狀態信息與喬的3個步驟有什麼關係嗎?

無論如何,鑑於該要點中的示例/模擬服務,我想知道有人會設計一個程序來以Actory方式封裝這個服務。我只想看看如何應用喬的3個步驟的指南列表。寫一些代碼(任何語言)的獎勵點數。

回答

9

通常,在構建應用程序以使用參與者時,您必須識別應用程序的併發功能,這可能會非常棘手以致於無法解決問題。你確定5個併發的 「服務」:

  1. 開始
  2. LoginGateway
  3. LogoutGateway
  4. 停止
  5. 訂閱

1,4和5似乎是類型的郵件,可以流過系統,2和3我不確定如何描述。你要點是相當大的,而不是超級我清楚,但看起來你已經有了某種消息隊列系統。一個用戶可以採取的行動是:

  1. 登錄到系統
  2. 註銷系統的
  3. 訂閱消息的隊列

我假設登錄和註銷需要一些認證步驟。我會進一步假設,如果用戶未通過身份驗證步驟,則他們的連接中斷,但創建連接並不足以進行身份​​驗證。

行動的系統需要有:

  1. 處理用戶行動
  2. 將消息路由到一個隊列

的用戶。如果這不是廣泛的真實,讓我知道,我會改變這個答案。 (我假設是被髮送給用戶的信息是由用戶生成但卻是系統的內在組成部分,也許我們討論的監控服務。)總之,什麼是併發嗎?有幾件事情:

  1. 用戶獨立的行爲另一個
  2. 隊列具有獨立的國家

一個演員基礎架構代表每個併發實體作爲自己的進程。所述用戶是一個有限狀態機進行認證,預訂隊列,或者接收消息和預訂多個隊列,並最終斷開。在Erlang/OTP中,我們用gen_fsm來表示這個。該用戶過程進行與客戶,如果我們在網絡上公開服務,將是一個插座交互所需的所有狀態。

認證意味着系統本身就是一個「過程」,不過,較有可能是真的,其在二郎山/ OTP我們稱之爲​​處理一個集合。我離題了。爲了簡化,我們假設系統本身就是一個單獨的進程,它具有一些定義良好的協議和保持用戶憑證的狀態。 用戶登錄是的話,從一個用戶過程系統處理的明確定義的消息和從其的響應。如果沒有身份驗證,我們不需要系統作爲與相關的唯一狀態,用戶將是套接字。

仔細的讀者會問我們在哪裏接受每個插座連接用戶?啊,好問題。還有一個沒有提及的併發實體,我們在這裏稱之爲監聽器。這是另一種的過程,監聽連接,會爲每個新建立的套接字,並移交所有權用戶用戶過程,然後循環回聽。

隊列也是一個有限狀態機。從其開始狀態,它通過明確的協議接受用戶訂閱請求,向訂閱者廣播消息或接受來自用戶進程的取消訂閱請求。這意味着隊列有一個內部存儲用戶進程,其細節是非常依賴於語言和需要。二郎/ OTP,例如,每個隊列過程將是一個gen_server其中存儲用戶進程ID - 或PID的 - 在每個消息中的列表和用於向發送根本多發送到每個用戶進程列表中。 (在Erlang/OTP中,我們希望用戶監督者確保進程保持活動狀態並在死亡時重新啓動,這大大簡化了Erlang開發人員爲確保基於角色的體系結構中的可靠性而必須執行的工作量)。

基本上重申什麼喬寫的,基於演員的架構可以歸結爲以下幾點:

  • 識別併發實體在系統中,並代表他們通過流程的實施,
  • 決定你的流程將如何發送消息(原始操作n在Erlang/OTP中,但是必須在C或Ruby中明確實現)以及在隱藏狀態修改的系統中的實體之間創建定義明確的協議

據說互聯網是世界上最成功的演員爲基礎的建築,真的,這並不遙遠。

相關問題