第二部分 使用Reactive Streams,Akka Streams, Akka HTTP, and Alpakka將工作負(fù)載流化(Streaming)
最受歡迎的Akka OSS模塊之一出現(xiàn)于幾年前,它就是Akka Streams≌暝叮基于
Reactive Streams,Lightbend與Netflix吮成,Oracle,Pivotal等公司的工程師共同發(fā)起辜梳,使得Reactive Streams可以處理帶背壓(backpressure)的數(shù)據(jù)流粱甫。類似TCP, 背壓可以防止生產(chǎn)者給下游的消費(fèi)者過載的數(shù)據(jù)以至于無法處理。
Reactive Streams and Akka Streams
在圖11中作瞄,左邊是Reactive Stream(Java9)茶宵,包括一個(gè)發(fā)布者,一個(gè)訂閱者和一個(gè)處理器粉洼。在jdK9中节预,不傾向于直接使用這些組件,而是作為streaming的基礎(chǔ)單元属韧。Akka Streams構(gòu)建于Reactive Streams標(biāo)準(zhǔn)之上安拟,額外添加了更多的功能。
在圖11的右邊宵喂,Akka Steams使用的術(shù)語是sources, sinks, 和 flows糠赦。對(duì)應(yīng)Java的publisher, subscriber, 和 processor。 它們的功能是類似的锅棕,Akka Streams基于灣光公司 Akka團(tuán)隊(duì)和OSS社區(qū)的經(jīng)驗(yàn)拙泽,在flow這一塊添加了功能。Akka Streams 提供了對(duì)于函數(shù)式編程人員很熟悉的功能裸燎,例如filter, fold, 和 map顾瞻。這些方法支持在流中flow環(huán)節(jié)進(jìn)行數(shù)據(jù)的轉(zhuǎn)換。
Akka Streams, Akka HTTP, 和Alpakka
Akka HTTP 構(gòu)建于Akka Streams之上, Akka Streams天然適合于HTTP請(qǐng)求轉(zhuǎn)換到HTTP響應(yīng)的場景(見圖12). 轉(zhuǎn)換發(fā)生在steam的Flow模塊中德绿,此模式同樣適合websocket荷荤,使用Akka Stream或Akka HTTP在消息進(jìn)入或者送出的時(shí)候進(jìn)行處理。
對(duì)于企業(yè)集成移稳,可以選擇另一項(xiàng)目Alpakka蕴纳,采用響應(yīng)式(Reactive)的,基于Akka Streams方案个粱,代替Apache Camel古毛。 和Camel社區(qū)版類似,開源社區(qū)大力構(gòu)建了不同的連接器都许,用來將背壓(backpressure)能力帶到傳統(tǒng)的Camel端點(diǎn)稻薇。
例如嫂冻,以維基百科圖像為來源,Alpakka能夠“豐富數(shù)據(jù)” 并推送到各種連接器颖低,例如Amazon S3, Apache Kafka或者M(jìn)icrosof Azure存儲(chǔ)隊(duì)列絮吵。
連接器列表:
Alpakka用簡潔的代碼提供了強(qiáng)大的能力弧烤,背后使用 Akka Streams和Akka actors忱屑,避免直接處理底層內(nèi)部控制。使用Akka Streams暇昂,更多的用函數(shù)式編程處理事物流莺戒,數(shù)據(jù)流過不同的函數(shù)來進(jìn)行不同的轉(zhuǎn)換操作。
總結(jié)
? Reactive Streams旨在為流負(fù)載提供背壓(backpressure)能力急波,避免生產(chǎn)者或消費(fèi)者過載从铲。
? Akka Streams 是Reactive Streams的實(shí)現(xiàn),提供了一系列的流程處理轉(zhuǎn)換澄暮。
? 基于Akka Streams, Akka HTTP和Alpakka具備背壓(backpressure)能力名段。作為Akka生態(tài)系統(tǒng)的一部分,提供了彈性的HTTP服務(wù)和企業(yè)集成功能泣懊。