2012-10-19 35 views
0

我有一個利用線程的第三方API。我使用Play框架進行編碼,並希望利用Akka實現ASYC功能並實現實時結果。但我不確定將Akka與使用線程的API整合是否合理。使用套接字返回使用,股票代碼爲 從Actor模型框架調用基於線程的API,如AKKA

  • 第三方接收消息,執行使用線程的命令並執行其他任何需要做一個股價

    1. 查詢第三方API:請考慮以下情形。我真的不擔心它是如何做的。只是指出它利用線程。
    2. 第三方API開始分發數據
    3. 返回的過程數據。如果數據與給定用例匹配,則將其保存在數據庫中並將其推送到瀏覽器。

    請您分享一下Akka在這個用例中可以創造價值的地方嗎?非常感謝

  • 回答

    1

    Akka專爲異步處理而設計。 所以它只適用於通過異步非阻塞IO完成與第三方API的通信。這會將您的應用程序與第三方的任何線程細節隔離。

    更新

    我認爲這個問題是在玩遊戲!版本1.x,如Play 2.0 already uses an internal Akka Actor system to handle request processing

    你應該已經know

    遊戲的目的是在非常短的請求工作。它使用固定的 線程池來處理由HTTP連接器排隊的請求。要獲得最佳結果 ,線程池應儘可能小。我們 通常使用nb個處理器的最佳值+1來設置默認池大小 。

    因此,對於任何遠程(或任何潛在的長期的)溝通,你必須做的是正確的異步non-blocking方式或在單獨的線程執行,以防止負載下發揮的微小的線程池耗盡。無論您的第三方API是否使用鎖定。

    另請注意,Play有一些內建的support for async processing。在這種情況下可能是used instead of akka。只需使用異步套接字io庫返回Future,將其轉換爲Promiseawait()它。類似於Play在Web Service client中的做法。

    相關question on java socket nio

    此外,我會建議緩存獲得的股票報價,以進一步提高性能。 Guava Cache是一個很好的候選人。在刷新模式下,即使使用同步API,它也可以用來對更新後的引號執行定期的後臺請求。

    +0

    請您詳細說明一下。第三方API不使用鎖。所以,它不會阻塞線程。 – jsf

    0

    在我的項目中,我經常需要處理阻塞遺留代碼,數據庫調用,舊阻塞網絡通信等。 在這些情況下,我隔離阻塞部分並在單獨的線程中執行它。 此主題由AKKA actor控制。

    所以我得到的是完全控制併發。 我只需要限制這些演員的人數。 另一個勝利是能夠停止阻塞操作,如果它處理中斷。

    最後,這是最重要的特性,我從AKKA演員的失敗容忍中受益。我能夠輕鬆停止或重新啓動子組件,重置外部資源等。

    因此,Akka不僅是異步處理,而且對於容錯系統尤其重要。