DynamoDB Streams
https://gyazo.com/43fe03672e58969a97bf6928105eed7d
特徴
DynamoDBの1テーブルで1ストリームが設定できる
ストリームはストリームレコードで構成される
ストリームレコードは1件のデータ変更を表す
項目の変更前・変更後の状態を参照できる
ほぼリアルタイム
1回の変更で1ストリームレコードが流れることが保証される
ストリームレコードの出現順序は保証される
設定を有効にしてもDynamoDB自体のパフォーマンスに影響はない
ストリームレコードの例
code: payload.json
{
"Records": [
{
"eventID": "7de3041dd709b024af6f29e4fa13d34c",
"eventName": "INSERT",
"eventVersion": "1.1",
"eventSource": "aws:dynamodb",
"awsRegion": "us-west-2",
"dynamodb": {
"ApproximateCreationDateTime": 1479499740,
"Keys": {
"Timestamp": {
"S": "2016-11-18:12:09:36"
},
"Username": {
"S": "John Doe"
}
},
"NewImage": {
"Timestamp": {
"S": "2016-11-18:12:09:36"
},
"Message": {
"S": "This is a bark from the Woofer social network"
},
"Username": {
"S": "John Doe"
}
},
"SequenceNumber": "13021600000000001596893679",
"SizeBytes": 112,
"StreamViewType": "NEW_IMAGE"
},
"eventSourceARN": "arn:aws:dynamodb:us-east-1:123456789012:table/BarkTable/stream/2016-11-16T20:42:48.104"
}
]
}
eventName
INSERT
MODIFY
REMOVE
イベントのコンシューマが
Lambdaだったら、イベントソースとしてDynamoDB Streamsを指定できるのでそれを使う。
Adapterがフィットしにくい要件であればDynamoDB StreamsのAPIを直接使う(そんな要件があるかは不明)
以下、情報量の少ないメモたち
Lambdaのイベントソースとして指定するとポーリングでイベントを取ってくるようになるらしいので、リアルタイム性は下がるのかな?→いや、Kinesisにしたところで結局Kinesis Client Libraryを使ってポーリングするだけなので実質的に変わらない気がする。
Kinesisは使ったことないからよくわからないけど、ぱっと見た感じコンシューマがEC2なのがスタンダードらしいからインスタンスを管理しないといけないっぽい。
(普通にAPI呼び出しでStreamsを使う場合はARNを指定して、シャードを指定して、レコードを取得するらしいけど面倒なのであんまり直接使うことはなさそう、、、。同じシャードに複数の読み取りクライアントがいるとスロットリングが発生する場合がある。API呼び出しで使う場合はストリームレコード作成されてから24時間はデータが取り出せるらしい。色々考慮するのがめんどいので思考停止してとりあえずKinesis Adapter使っとくのが良さそう。)