2016-04-05 45 views
0

我正在研究使用Kinesis客戶端庫(KCL)從AWS Kinesis Stream中讀取和處理事件的應用程序。我不希望事件生產者端遭受延遲,因此使用KinesisAsyncClient發送事件。但是爲了讓我的事件處理正常工作,我需要在生產者端處理「我稱爲putRecordAsync的命令」中的均衡器。這些信息作爲每個Kinesis記錄中的時間戳字段提供。如何在KCL中重新排序異步發送Kinesis Events

除了切換使用阻塞同步Kinesis客戶端,還有其他解決方案可以有效地對流式事件進行排序嗎?

+0

讀者將按照它們在流中的順序獲取事件。您只能控制生產者事件的順序。您可以使用putRecords(注意s),它將多個事件按順序排列。您還可以使用上一個事件的seq-id將下一個事件放在後面。這對你有意義嗎? – Guy

+0

@Guy使用Kinesis的Async Client執行putRecordsAync是否也能保證事件的順序? – SuSanD

+0

使用PutRecords(sync或async)對Kinesis進行的API調用將保留呼叫有效內容中事件的順序。如果您正在客戶端代碼中執行額外的批處理以創建不同的API調用,則這些事件可能不是按順序你在多次調用中調用異步。 – Guy

回答

0

如果訂購很重要,請使用異步客戶端,而不是

異步客戶端只是使用封面下的線程池進行完全相同的調用 - 因爲它是多線程的,所以無法保證這些線程的執行順序,因此您無法控制這些線程的順序記錄由Kinesis收到。現在

,如果延遲是真正爲您製作一個問題:

  1. 確保你打電話(而不是PutRecord)在可能的情況PutRecords - 這肯定會爲你節省網絡往返。

  2. 與其直接調用客戶端,只是將有序記錄放入本地隊列中,並使用後臺線程定期輪詢該隊列以調用PutRecords。

一些其他的事情要記住 - 如果這是不夠快,讓您在處理隊列接近空,表示你有一個足夠大的數據吞吐量,你需要多線程投入數據,你不再有確切的順序。如果是這種情況,我強烈建議提供序列號與您的記錄,所以你可以重新排序,如果需要在消費者方面(也可以考慮SQS作爲一個起點,而不是Kinesis在這種情況下)