公共云計算鼓勵使用分布式應用程序,這使得企業用戶能夠充分利用大量服務器的優勢來運行多個系統——從大型企業應用程序到有針對性的微服務。但是,管理員們應當如何輕松地把所有這些數據遷往相應的服務器呢?其中一種方法就是通過通訊總線,同時如果某個管理員希望從多個來源以近乎實時的速度遷移大容量數據,那么他應當考慮一下亞馬遜的Kinesis。
亞馬遜Kinesis是亞馬遜網絡服務(AWS)所提供的一項托管通訊服務,它可為實時數據處理應用提供高性能和低管理開銷。該服務是專為接受來自于大量來源并把數據分發到各種應用程序的應用而設計的。Kinesis是基于Apache Kafka的,后者提供了一個“發布-訂閱”的通訊服務。
亞馬遜Kinesis的設置
設置亞馬遜Kinesis“發布-訂閱”平臺的第一步就是定義一個Kinesis流。這一工作通常在AWS管理控制臺上完成。
所謂Kinesis流,是指一組接受、存儲和傳遞消息的來源。高容量數據流可以按多個分塊進行劃分,這一點與使用多個服務器進行服務器集群的擴容過程很相似。實際所需的分塊數量取決于消息的平均大小、寫操作記錄的速度以及用戶應用程序的數量。AWS管理控制臺提供了一個可以幫助管理員估計用于滿足他們需求所需分塊數量的工具。
與其他所有的AWS資源一樣,用戶需要定義訪問控制措施。Kinesis的訪問控制措施可允許客戶自行定義用戶和角色的權限,從而讓他們可以在隊列中設置消息、獲取隊列的狀態信息和詳細內容,并從隊列中讀取所需信息。
生產應用程序可被授權向Kinesis隊列寫消息。一個消息中包括了:一個可被交付的數值或有效負載(例如一個JavaScript Object Notation結構和鍵值對)以及一個分塊鍵。一個分塊最高每秒可以接受一千個消息;而分開鍵可以最多為256個字符長。Kinesis的API提供了一個PutRecord的函數,這個功能函數可以一次向一個隊列增加一個消息;PutRecords函數可供批量增加消息使用。
用戶應用程序則涉及GetRecords API函數。一般來說,針對性的應用程序可以在一個循環中持續不斷地運行這個函數。每個記錄的容量最多可支持50KB。該系統則可在一個單一的分塊中每秒支持2MB的數據。如果用戶需要更多的數據流量,可在他的流中增加更多的分塊。GetRecords函數還支持一個LIMIT參數,該參數主要用于指定在單一的一次調用中支持的最大記錄數。管理員們可以使用這個功能函數來設置用戶應用程序所接受的數據量,尤其是在高峰期向消息隊列執行寫操作時。
亞馬遜Kinesis的短板
當談及實時數據處理應用時,Kinesis還有這一些局限性。該服務最多可保留消息24小時。這一點不同于Kafka,后者可以按照實際要求進行配置,其存儲周期可更長。IT團隊應當為應用程序的運行分配足夠的資源以便于應用程序能夠在24小時內讀取所有的消息。
AWS CloudWatch可以幫助監控一個消息隊列的載入以及用戶應用程序的流量。AWS彈性負載平衡器或自動擴展功能可以幫助確保有足夠的計算資源跟上消息流。
如果用戶在實際使用中超過了消息接收的上限,那么用戶將會收到一個被稱為ProvisionedThroughtputExceed的錯誤;然后該消息將被拒絕。如果在讀操作過程中超出了這個閾值,那么用戶同樣也會收到一個ProvisionedThroughtputExceed的錯誤。如果需要增加容量,那么用戶需要在他們的流中增加更多的分塊。
為了向一個流增加分塊,用戶可分拆現有的分塊。每一次分拆操作只需要幾秒鐘的時間,但是,每次只能拆分一個分塊。如果有數以百計的分塊,那么這就會成為一個問題,因為增加流的相對容量將顯著增加所需的時間。
開發與集成
Kinesis提供了一個REST API,這樣用戶就可以使用幾乎任何的編程語言來完成對消息隊列的讀寫操作。AWS軟件開發工具還為Kinesis功能函數提供了特定語言的綁定。
AWS提供了多個接口以簡化與其他服務的集成,具體包括DynamoDB、Redshift、簡單存儲服務以及ElasticSearch。Kinesis是以分塊時間(每小時0.015美元)和PUT運行次數(0.028美元/百萬PUT)進行計費的。