2014-01-05 29 views
1

我們正在構建的應用程序有一個非常簡單的概念:它接收來自數據庫的傳入事件,併爲每個事件打開一個交互式會話與客戶端(在事件中)菜單。根據客戶的反應,我們進入下一個狀態或採取一些具體行動(例如轉移資金)。使用演員/ AKKA的面向會話的異步架構

會話是相互獨立的。例如,假設我們從數據庫中獲取兩個事件,即客戶A和B已達到零帳戶餘額狀態。針對這一事件,我們建立了兩個連接A和B顯示的菜單看起來像下面這樣:

Please select an option: 
1. Get $5 
2. Get $10 
3. Ignore 

對於選項1和2,我們在秒菜單的形式,要求確認。

Are you sure? 
1. yes 
2. no 

在這種情況下,我們將有兩個會話。客戶A可能會選擇選項1(1. Get $5),而客戶B選擇選項3 [在第一個菜單中]。在客戶A的情況下,我們將提供第二個菜單(上面),如果回覆爲1. yes,我們將採取一些具體措施,如轉賬和關閉會話。

所有客戶端通信都由第三方系統完成,該系統採用JSON(包括客戶端地址,菜單文本)並將響應返回給我們。它負責實際維護會話,而我們只需要做響應關聯和處理會話狀態。

我們預計會同時處理50,000個此類會話

此前,我們使用SEDA模型設計了Java系統。聽說過Actor,我們願意檢查它們並編寫一個快速的PoC項目(Java/AKKA)。我的問題是:

  1. 有沒有人有建立此類應用程序的經驗嗎?對於AKKA來說,是否有50,000個同時進行的會話太多? (注意,我們只是在等待迴應,當答案出現時,根據回答,我們跳到下一個階段,所以應該可以)。

  2. 哪種建築風格/範例最適合AKKA的這個問題?這種問題有沒有框架?

+2

首先,阿卡不是首字母縮略詞。其次,如果避免全局狀態,縮放Akka非常簡單。它使橫向擴展非常簡單,很可能不會成爲你的瓶頸(這幾乎肯定會成爲數據庫)。 – Ryan

回答

3

這實際上是一個相當簡單的Akka集羣用例。 50K會話表示爲每個Actor實例並不是很高的負載。使用羣集的原因僅用於容錯。

架構背後的想法是有一個Web層來處理對應於會話的RESTful請求。這些請求將被髮送到Akka羣集,並通過會話ID路由到相應的會話Actor,或者創建一個新的請求。會話完成後,您停止與其關聯的演員。

請注意,會話參與者應該通過調度器發送自己的超時消息。在完成處理新消息時,演員應該通過ActorSystem調度器爲自己預定一個消息15分鐘(或任何超時時間)。當收到新的會話消息時,應該取消該計劃的任務,處理新的更新,然後計劃新的超時。在這裏有一個合理的競爭條件,因爲超時消息可能在會話消息的會話參與者的郵箱隊列中,但是如果超時消息包含計劃時間(15分鐘前)的時間,則可以檢查並忽略它並重新安排另一個(就像避免內存泄漏的安全機制一樣)。如果時間超過15分鐘,那麼你停止演員。

要了解如何實施工作分配給會話參與者,請參閱Typesafe的Activator中的「分佈式工作人員使用Akka和Java」模板。您將擁有一個完全運行的羣集Akka應用程序,您可以根據上述描述來定製該羣集以執行會話管理。然後,您可以導出項目並在Eclipse/IntelliJ/Sublime/TextMate /等工作。要下載Activator,請參閱here