重新分片之後 - Amazon Kinesis Data Streams

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

重新分片之後

在 Amazon Kinesis Data Streams 中任何種類的重新分片程序之後,以及在繼續正常記錄處理之前,需要其他程序和考量。下列小節描述這些情況。

等待串流再次變得作用中

呼叫重新分片操作 (splitShardmergeShards) 之後,您需要等待串流再次變得作用中。要使用的程式碼與建立串流之後,等待串流變得作用中的程式碼相同。該程式碼如下所示:

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 是一項即時資料串流服務,具體而言,您的應用程式應該假設資料會持續在串流中的碎片間流動。執行重新分片時,流動至父碎片的資料記錄會重新路由,以根據資料記錄分割區索引鍵所對應的雜湊索引鍵值,流動至子碎片。不過,重新分片之前在父碎片中的任何資料記錄,會維持在那些碎片中。換句話說,發生重新分片時,父碎片不會消失。它們會隨著重新分片之前包含的資料保留。父碎片中的資料記錄可使用 Kinesis Data Streams API 中的 getShardIterator 和 getRecords 操作或透過 Kinesis Client Library 存取。

注意

資料記錄可供存取的時間是從新增至串流的時間到目前的保留期間。無論在該時間期間對串流中的碎片進行任何變更,都是如此。如需串流保留期間的詳細資訊,請參閱變更資料保留期間

在重新分片的程序中,父碎片會從 OPEN 狀態轉換為 CLOSED 狀態然後為 EXPIRED 狀態。

  • OPEN:重新分片操作之前,父碎片會處於 OPEN 狀態,這表示資料記錄可同時新增至碎片和從碎片中擷取。

  • CLOSED:重新分片操作之後,父碎片會轉換為 CLOSED 狀態。這表示資料記錄不再會新增至碎片。應新增至此碎片的資料記錄,現在會改為新增至子碎片。不過,您仍可以在限定時間內從碎片擷取資料記錄。

  • EXPIRED:在串流的保留期過期之後,父碎片中的所有資料記錄會過期,並不再可供存取。此時,碎片本身會轉換為 EXPIRED 狀態。為了列舉串流中碎片對 getStreamDescription().getShards 的呼叫,在傳回的清單碎片中不會包含 EXPIRED 碎片。如需串流保留期間的詳細資訊,請參閱變更資料保留期間

重新分片發生且串流再次處於 ACTIVE 狀態之後,您可以立即開始從子碎片讀取資料。但是,保留在重新碎片之後的父碎片可能仍然包含您尚未讀取的數據,這些數據在重新碎片之前添加到流中。如果您在從父碎片讀取所有資料之前從子碎片讀取資料,則可以不按資料記錄的序號指定的順序讀取特定雜湊索引鍵的資料。因此,假設資料的順序很重要,在重新分片之後,您應該一律持續從父碎片讀取資料,直至耗盡為止。只有這樣您才應該從子碎片開始讀取資料。當 getRecordsResult.getNextShardIterator 傳回 null,表示您已讀取父碎片中的所有資料。如果您使用 Kinesis 用戶端程式庫讀取資料,則在重新碎片發生後可能無法依序收到資料。