本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
完成重新碎片動作
在 Amazon Kinesis Data Streams 中任何種類的重新分片程序之後,以及在繼續正常記錄處理之前,需要其他程序和考量。下列小節描述這些情況。
等待串流再次變為作用中
呼叫重新分片作業之後,splitShard
或者mergeShards
,您必須等待串流再次變為作用中狀態。要使用的程式碼與建立串流之後,等待串流變得作用中的程式碼相同。該程式碼如下所示:
DescribeStreamRequest describeStreamRequest = new DescribeStreamRequest(); describeStreamRequest.setStreamName( myStreamName ); long startTime = System.currentTimeMillis(); long endTime = startTime + ( 10 * 60 * 1000 ); while ( System.currentTimeMillis() < endTime ) { try { Thread.sleep(20 * 1000); } catch ( Exception e ) {} try { DescribeStreamResult describeStreamResponse = client.describeStream( describeStreamRequest ); String streamStatus = describeStreamResponse.getStreamDescription().getStreamStatus(); if ( streamStatus.equals( "ACTIVE" ) ) { break; } // // sleep for one second // try { Thread.sleep( 1000 ); } catch ( Exception e ) {} } catch ( ResourceNotFoundException e ) {} } if ( System.currentTimeMillis() >= endTime ) { throw new RuntimeException( "Stream " + myStreamName + " never went active" ); }
在重新碎片之後考慮資料路由、資料持續性和碎片狀態
Kinesis Data Streams 是一項即時資料串流服務。您的應用程式應假設資料持續流過串流中的碎片。執行重新分片時,流動至父碎片的資料記錄會重新路由,以根據資料記錄分割區索引鍵所對應的雜湊索引鍵值,流動至子碎片。不過,重新分片之前在父碎片中的任何資料記錄,會維持在那些碎片中。發生 reshard 時,父碎片不會消失。它們會隨著重新分片之前包含的資料保留。您可以使用 Kinesis 資料串API流中的getShardIterator和getRecords作業或 Kinesis 用戶端程式庫來存取父項碎片中的資料記錄。
注意
資料記錄可供存取的時間是從新增至串流的時間到目前的保留期間。無論在該時間期間對串流中的碎片進行任何變更,都是如此。如需串流保留期間的詳細資訊,請參閱變更資料保留期。
在重新分片的程序中,父碎片會從 OPEN
狀態轉換為 CLOSED
狀態然後為 EXPIRED
狀態。
-
OPEN:在 reshard 操作之前,父分片處於
OPEN
狀態,這意味著可以將數據記錄添加到碎片中並從碎片中檢索。 -
CLOSED:在重新碎片作業之後,父分片會轉換為狀態。
CLOSED
這表示資料記錄不再會新增至碎片。應新增至此碎片的資料記錄,現在會改為新增至子碎片。不過,您仍可以在限定時間內從碎片擷取資料記錄。 -
EXPIRED:在串流的保留期過期後,父項碎片中的所有資料記錄都已過期且無法再存取。此時,碎片本身會轉換為
EXPIRED
狀態。為了列舉串流中碎片對getStreamDescription().getShards
的呼叫,在傳回的清單碎片中不會包含EXPIRED
碎片。如需串流保留期間的詳細資訊,請參閱變更資料保留期。
重新分片發生且串流再次處於 ACTIVE
狀態之後,您可以立即開始從子碎片讀取資料。但是,保留在重新碎片之後的父碎片可能仍然包含您尚未讀取的數據,這些數據在重新碎片之前添加到流中。如果您在從父碎片讀取所有資料之前從子碎片讀取資料,則可以不按資料記錄的序號指定的順序讀取特定雜湊索引鍵的資料。因此,假設資料的順序很重要,在重新分片之後,您應該一律持續從父碎片讀取資料,直至耗盡為止。只有這樣您才應該從子碎片開始讀取資料。當 getRecordsResult.getNextShardIterator
傳回 null
,表示您已讀取父碎片中的所有資料。如果您使用 Kinesis 用戶端程式庫讀取資料,則在重新碎片發生後可能無法依序收到資料。