チェックポイントの動作の例
Streamsのサンプル出力に示されているように、チェックポイントを実装する理由は、Streamsアプリケーションが実行されるたびにストリームの先頭から操作を使用しないようにするためです。チェックポイントが実装されたので、このアプリケーションは、最後に保存されたチェックポイントからストリーミングを開始します。
100個の操作の初期実行時には、アプリケーションの動作は、チェックポイントを除いて元のアプリケーションと変わりません。(簡潔にするために出力は切り捨てられています。)
> java pubsub.GSGStreamExample
Subscriber created to stream 100 operations.
Start stream 100 operations from table Users
Found a put. Row is:
UID: 0
Quantity: 10
myArray: [19,10,3,6,14,17,20,8,7,20]
Found a put. Row is:
UID: 1
Quantity: 5
myArray: [2,3,10,12,5]
Found a put. Row is:
UID: 2
Quantity: 9
myArray: [16,6,19,17,6,11,19,1,6]
... skipped ops for brevity ...
Found a put. Row is:
UID: 9
Quantity: 1
myArray: [2]
Finish checkpoint at position {kvstore(id=1500857641631):
[rg1(vlsn=69)]}
Checkpoint succeeded after 10 operations at position
{kvstore(id=1500857641631): [rg1(vlsn=69)]}, elapsed time in ms 36
Found a put. Row is:
UID: 10
Quantity: 3
myArray: [4,7,9]
Found a put. Row is:
UID: 11
Quantity: 5
myArray: [14,9,14,14,12]
... skipped ops for brevity ...
Found a delete. Row is:
Del OP [seq: 233, shard id: 1, primary key: {
"uid" : 54
}]
Found a put. Row is:
UID: 88
Quantity: 6
myArray: [4,12,2,2,11,9]
Found a put. Row is:
UID: 89
Quantity: 1
myArray: [4]
Fail to checkpoint at position {kvstore(id=1500857641631):
[rg1(vlsn=249)]}, cause: Cannot do checkpoint because there
is a concurrently running checkpoint for subscriber 1_0
Finish checkpoint at position {kvstore(id=1500857641631):
[rg1(vlsn=249)]}
Checkpoint succeeded after 100 operations at position
{kvstore(id=1500857641631): [rg1(vlsn=249)]}, elapsed time in ms 42
Publisher closed normally.
All done.
上の出力では、同時に実行されているチェックポイントがすでにあったため、1つ以上のチェックポイントを完了できなかったことに注目してください。このようなことが起こったのは、この例ではあまりにも頻繁にチェックポイントを取得しているためです。その結果、前のチェックポイントが終了する前にチェックポイントを取得しようとしていました。チェックポイントの間隔を長くしてより適切にすると、エラー状況が解消されます。
サンプル・プログラムの1回の実行が完了すると、前の実行が中断された場所から後続の実行が開始されます。この実行例では、UID 89の行を作成したデータベース書込みで前のストリームが中断されています。次の実行は、行UID 90を作成した書込み操作から始まります。
> java pubsub.GSGStreamExample
Subscriber created to stream 100 operations.
Start stream 100 operations from table Users
Found a put. Row is:
UID: 90
Quantity: 3
myArray: [3,1,8]
Found a put. Row is:
UID: 91
Quantity: 4
myArray: [2,9,6,13]
Found a put. Row is:
UID: 92
Quantity: 6
myArray: [2,3,9,9,7,3]
... skipped ops for brevity ...