天天看點

《Akka應用模式:分布式應用程式設計實踐指南》讀書筆記9

性能

  這也是一個比較大的問題,因為性能不一定是Akka本身的問題,還可能是你代碼寫的有問題。

  優化的第一步就是找出性能的瓶頸,隔離出應用程式裡面比較耗時的部分,然後嘗試對其優化,減少需要耗費的時間成本。其實有時候對性能進行度量往往比優化性能還重要,因為你在度量性能的時候,已經在思考哪些可能是性能瓶頸了,這過程中就會不由自主的對其進行了優化。性能測試往往是找出那些超出預期的性能問題。

隔離瓶頸

  性能優化的第一步就是識别瓶頸,這是一個技術活。

優化Akka

  隻有在确定了是Akka的問題之後再動手優化Akka,但大部分情況優化的都是業務邏輯和代碼邏輯,跟Akka本身關系不大。

減少或隔離阻塞型操作

  個人感覺使用Akka就一定要遵守Actor模型的幾個限制,其中一個很重要的限制就是每條消息處理一定要快,且最好是異步通信。這一點對于Akka新手來說,并不太好了解,或者了解的不夠深刻。如果一個操作耗時不長,就沒必要用Actor模型了,如果耗時太長,Actor又要求盡量要快,這不就是沖突麼?還要Akka幹啥。其實這是我剛開始學Akka時候的疑問和不解。不過用下來才發現,如果你有一個目标:Actor消息處理一定要快。你就會無形中對一個操作盡可能的拆分,使其異步、短小,當然了帶來的問題就是消息類型比較複雜。

  使用Akka時,不可避免的用到JDBC或檔案等IO操作,這類操作有可能很慢且都是阻塞性操作,但并不代表不能把他設計成異步、非阻塞的。比如有一個流程如下:1.寫資料庫;2.寫入成功後執行後續操作。我們往往是同步、阻塞的操作,但其實可以用future或異步JDBC将其拆分成兩步:寫資料庫、成功後執行操作。比如把寫入消息發送給單獨的actor,該actor收到寫入消息,對其進行寫入然後把結果異步的傳回給原來的actor,原actor收到寫入成功的消息後執行後續操作。雖然并不一定解決阻塞的問題,但把阻塞的問題進行了隔離,因為阻塞隻有在資料庫actor才會有。但原actor卻可以處理更多的消息。由于寫資料庫相關的消息都被封裝到單獨的actor,那麼我們可以采取批量的方法,把資料插入資料庫,以提高插入的性能和吞吐量。如果還與原actor的業務邏輯混到一塊,就很難優化了。

  再進一步,還可以将插入資料庫的actor放到單獨的派發器,提高原actor的并發量。

縮短消息處理時間

  這和你顯然是一句廢話。但确實一個優化的方向,如何縮短呢?還是那個“分而治之”的思想,具體的方法大家就各自參悟吧,^_^。

增加處理消息的actor

  這其實也是一個好方法,無形中增加了并行數量。當然前提是各個actor沒有争用資源,即使有争用也要對其進行解耦,減少争用時間和範圍。Akka叢集中增加actor數量,還可以充分利用各個節點的資源。當然了,這會增加系統的複雜性,不過使用Akka本身就是解決複雜系統的,簡單的系統用Akka好像沒啥必要。

派發器

  派發器是優化Akka的關鍵元件。這一點需要對派發器有深入的了解,剛開始時候我并沒有認識到這一點,導緻系統性能不太好。關于派發器建議大家讀一下官方的文檔。

标準派發器

  這是最常用、通用的派發器。預設是fork-join。還可以配置成thread-pool的形式。不過具體情況可以具體分析。但要認識到線程的讓步都會執行一次上下文的切換,如果經常發生切換,對于系統來說是一個比較昂貴的開銷。你看其他語言建立了自己的線程排程器就知道優化的必要了。

固定派發器

  固定派發器不再為actor使用線程池,而是每個actor配置設定一個固定線程,這樣就不會有上下文切換的問題了。這種隻對actor比較少的系統有用。

平衡派發器

  平衡派發器通過使用共享郵箱來執行這樣的重配置設定操作。不常用,就不分析了。

calling-thread派發器

  主要用于測試。它不會配置設定線程池,所有操作都在發送消息的同一個線程上執行。

何時使用單獨的派發器

  根據我的經驗來看,前期不要考慮這個問題,先實作業務邏輯,等有性能問題的時候再考慮。但有一個卻可以提前考慮,那就是與資料庫相關的阻塞操作可以使用單獨的派發器,這樣不會影響原有actor的線程吞吐量。

提高并行性

  提高并行性是對業務的優化,就是提前考慮算法能否用“分而治之”的思想進行拆分,然後并行處理。但并不是所有的算法都能拆分,這點就靠大家自行分析了。

結論

  Akka是一個好的架構,它基本考慮了分布式 環境下遇到的所有方面的問題。Akka的很多進階特性都是基于最基礎的Actor模型,可以使用它建構高并發、穩定的分布式系統,但有一點大家需要注意。Akka是一個分布式架構,系統的很多功能都需要自行設計,而且系統的穩定性和品質都取決于有沒有合理的使用Actor模型。該書雖然描述了最重要的actor模式,但并不詳細,很多章節都需要我們根據自己的實際場景來設計的。目前并沒有關于Akka最佳實踐的材料,即使有也都在各公司内部。是以我準備在未來的時間内寫一點關于Akka最佳實踐的部落格,希望大家捧場。