[AWS] DynamoDB: Streams

Dynamo Streams๋Š” DynamoDB๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ œ๊ณต๋˜๋Š” CDC ๊ธฐ๋ฐ˜ ์ŠคํŠธ๋ฆผ ์„œ๋น„์Šค๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ€์–ด๋„ฃ๊ณ  consumeํ•˜๋Š” Kinesis๋‚˜ Kafka ๊ฐ™์€ ์—ญํ• ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ Lambda์™€ ํ†ตํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์šฉ์ดํ•˜๋‹ค.
๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘๋ณต์—†์ด ๋‹จ ํ•œ๋ฒˆ๋งŒ ์ „์†ก๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๊ณ , ์‹ค์ œ ์‚ฝ์ž…๋œ ์ˆœ์„œ์— ๋”ฐ๋ผ FIFO ํ˜•ํƒœ๋กœ ๋™์ž‘ํ•œ๋‹ค.
Kafka์˜ ๊ฐ€๋ณ๊ณ  ์ €๋ ดํ•œ ๋Œ€์ฒด์žฌ๋กœ ์“ฐ๊ธฐ์— ๊ดœ์ฐฎ๋‹ค.




๋น„์šฉ

https://aws.amazon.com/ko/dynamodb/pricing/on-demand/
๋น„์šฉ ๋‹จ์œ„๋Š” DynamoDB์™€ ๊ฑฐ์˜ ๋™์ผํ•˜๊ณ , ์ถ”๊ฐ€ ์š”๊ธˆ์ด ๋”ฐ๋กœ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋ƒฅ ๊ธฐ์กด ์ฝ๊ธฐ ์š”๊ธˆ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋‚ธ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.


ํ•œ๋ฒˆ ์ง์ ‘ ์‚ฌ์šฉํ•ด๋ณด์ž




Dynamo Stream ํ™œ์„ฑํ™”

๋จผ์ € DynamoDB ํ…Œ์ด๋ธ”์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์ ์ ˆํžˆ ๋ˆ ์•ˆ๋‚˜๊ฐ€๊ฒŒ ์˜จ๋””๋งจ๋“œ๋กœ๋งŒ ๋งŒ๋“ค์–ด์ค€๋‹ค.

"๋‚ด๋ณด๋‚ด๊ธฐ ๋ฐ ์ŠคํŠธ๋ฆผ" ํƒญ์„ ๋ณด๋ฉด

์ŠคํŠธ๋ฆผ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค. ์ด๊ฑธ ์ผ ๋‹ค.


์ŠคํŠธ๋ฆผ ํŠธ๋ฆฌ๊ฑฐ์—์„œ ์–ด๋–ค ๊ฐ’์„ ๋ฐ›์„์ง€ ์ •ํ•œ๋‹ค.
์ผ๋‹จ ํ‚ค๋งŒ ๋ฐ›๋„๋ก ํ–ˆ๋‹ค.


๊ทธ๋Ÿผ ์ŠคํŠธ๋ฆผ ARN์ด ๋งŒ๋“ค์–ด์ง€๋Š”๋ฐ, ์ €๊ฑธ aws sdk๋ฅผ ํ†ตํ•ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDBStreams.html
ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” Lambda ๊ธฐ๋ฐ˜์œผ๋กœ ์ œ๊ณต๋˜๋Š” ์ž๋™ํ™”๋œ ํ†ตํ•ฉ๋งŒ ์‚ฌ์šฉํ•ด๋ณด๊ฒ ๋‹ค.




Lambda๋กœ ํŠธ๋ฆฌ๊ฑฐ ๋“ฑ๋ก

๋จผ์ € ํŠธ๋ฆฌ๊ฑฐ์— ์‚ฌ์šฉํ•  Lambda ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์ค€๋‹ค.

์ด๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†ก๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ๋งก๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.
์ผ๋‹จ์€ ๋กœ๊ทธ๋งŒ ์ฐ์—ˆ๋‹ค.


{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "Statement1",
			"Effect": "Allow",
			"Action": [
				"dynamodb:GetRecords",
				"dynamodb:GetShardIterator",
				"dynamodb:DescribeStream",
				"dynamodb:ListStreams"
			],
			"Resource": "*"
		}
	]
}

Lambda ๊ถŒํ•œ์€ ์ด์ •๋„ ์ฃผ๋ฉด ๋œ๋‹ค.

์ด์ œ ์ €๊ฑธ ํŠธ๋ฆฌ๊ฑฐ๋กœ ๊ฑธ๋ฉด ๋œ๋‹ค. Dynamo Stream ํ•˜๋‹จ์œผ๋กœ ์ด๋™ํ•ด์„œ

ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.
๋ฐฐ์น˜ ํฌ๊ธฐ๋Š” ํ•œ๋ฒˆ์— ์ตœ๋Œ€ ๋ช‡๊ฐœ์”ฉ์„ ๋ฐ›์„์ง€๋ฅผ ์ •ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค.


๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ ์—ฐ๋™๋  ๊ฒƒ์ด๊ณ 


Dynamo ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฝ์ž…, ์ˆ˜์ •, ์‚ญ์ œ๋ ๋•Œ๋งˆ๋‹ค ๋ฐ˜์‘ํ•ด์„œ ๋ฉ”์„ธ์ง€๋ฅผ ์ „์†กํ•˜๊ฒŒ ๋œ๋‹ค.
๋Œ€์ถฉ ํ•˜๋‚˜ ๋„ฃ์–ด๋ดค๋‹ค.


๊ทธ๋Ÿผ ์ƒํƒœํ™•์ธ๋„ ํ•ด์ฃผ๋Š”๋ฐ


์™€์„œ ๋ณด๋ฉด ์‚ฝ์ž…์ •๋ณด์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ๊ฐ€ ์ฐํ˜€์žˆ์Œ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
ํ‚ค๋งŒ ๋ฐ›๋Š” ๊ฒƒ์œผ๋กœ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ‚ค๊ฐ’๋งŒ ๋„˜์–ด์™”๋‹ค. ์ €๊ฑฐ ์กฐํšŒํ•ด์„œ ์ž˜ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋œ๋‹ค.

์ŠคํŠธ๋ฆผ ํƒ€์ž…์„ ๋‹ค๋ฅธ๊ฑธ๋กœ ์ƒ์„ฑํ•œ๋‹ค๋ฉด

์ด๋Ÿฐ ๋А๋‚Œ์œผ๋กœ ์˜จ๋‹ค. ์ด๊ฑด ์ด์ „ ์ƒํƒœ์™€ ํ˜„์žฌ ์ƒํƒœ๊ฐ€ ๋‹ค ๋‚˜์™€์„œ ์ถ”๊ฐ€ ์กฐํšŒ ์—†์ด๋„ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.




์žฌ์‹œ๋„

Dynamo Stream์€ ์‹คํ–‰ํ•œ Lambda๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์‹คํŒจ ์ƒํƒœ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์„ฑ๊ณตํ• ๋•Œ๊นŒ์ง€ ์žฌ์‹œ๋„๋ฅผ ํ•œ๋‹ค.

์‹คํ–‰ ๋กœ๊ทธ ๋ณด๋‹ˆ๊นŒ ์ฒ˜์Œ์—๋Š” ์ดˆ๋‹จ์œ„๋กœ ๋น ๋ฅด๊ฒŒ ์žฌ์‹œ๋„๋ฅผ ํ•˜๋‹ค๊ฐ€ ๋ช‡๋ฒˆ ์ด์ƒ ์‹คํŒจํ•˜๋ฉด ๊ธด ๊ฐ„๊ฒฉ์œผ๋กœ ์žฌ์‹œ๋„๋ฅผ ํ•˜๋”๋ผ




ํŠธ๋ฆฌ๊ฑฐ ์„ค์ • ๋ณ€๊ฒฝ

Lambda์˜ ํŠธ๋ฆฌ๊ฑฐ ํƒญ์œผ๋กœ ์ด๋™ํ•˜๋ฉด Dynamo<>Lambda ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ ์„ค์ •์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.


๋ฐฐ์น˜ ์˜ต์…˜์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜


์žฌ์‹œ๋„ ๊ฐ™์€ ๋ช‡๊ฐ€์ง€ ์˜ต์…˜์„ ์กฐ์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
์ด๊ฒŒ ์•ž์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํŒจํ•˜๋ฉด ๊ทธ๊ฒŒ ์„ฑ๊ณตํ• ๋•Œ๊นŒ์ง€ ๊ณ„์† retry๋ฅผ ํ•˜๋ฉด์„œ ์ดํ›„ ์ฒ˜๋ฆฌ๋ฅผ ๋ธ”๋ฝํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์žฌ์‹œ๋„๋ฅผ usecase์— ๋”ฐ๋ผ ์กฐ์ •ํ•˜๋Š”๊ฒŒ ์ค‘์š”ํ•˜๋‹ค.

Retry attempts๋Š” ์ตœ๋Œ€ ์žฌ์‹œ๋„ ํšŸ์ˆ˜๋‹ค. ๊ธฐ๋ณธ๊ฐ’ -1๋Š” ๊ณ„์† ์‹œ๋„ํ•˜๋Š”๊ฑฐ๋‹ค.
On-failure destination๋Š” ์žฌ์‹œ๋„๊ฐ€ ๋๋‚˜๊ณ  ์ตœ์ข…์ ์œผ๋กœ ์‹คํŒจํ–ˆ์„๋•Œ ๋ฉ”์„ธ์ง€๋ฅผ ์–ด๋””๋กœ ๋ณด๋‚ผ์ง€๋ฅผ ์ง€์ •ํ•œ๋‹ค. ๋ณดํ†ต SNS๋‚˜ SQS๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

Split batch on error๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฐฐ์น˜๋ฅผ ๋” ์ž˜๊ฒŒ ๋‚˜๋ˆ ์„œ ์žฌ์‹œ๋„ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค.
๋ฐฐ์น˜ ๋‹จ์œ„๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์„œ ์„ฑ๋Šฅ์  ๋ฌธ์ œ๋กœ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธธ๋•Œ ๊ฝค ํšจ๊ณผ์ ์œผ๋กœ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

Concurrent batches per shard๋Š” ํ•œ ์ƒค๋“œ์—์„œ ๋™์‹œ์— ๋ช‡๊ฐœ์˜ ๋ฐฐ์น˜๋ฅผ ๋Œ๋ฆด์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ๋””ํดํŠธ๋Š” 1์ด๋ฏ€๋กœ ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ ๋ฐฐ์น˜๋งŒ ๋Œ๋ฆฐ๋‹ค.
๋™์‹œ์— ์‹คํ–‰๋˜์–ด๋„ ๋˜๊ณ  ์ˆœ์„œ๊ฐ€ ๊ผฌ์—ฌ๋„ ๋œ๋‹ค๋ฉด ์ €๊ฑธ ๋†’์ด๋Š”๊ฒŒ ์„ฑ๋Šฅ์ƒ ์œ ๋ฆฌํ•  ๊ฒƒ์ด๋‹ค.



์ฐธ์กฐ
https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/Streams.html
https://stackoverflow.com/questions/38571922/difference-between-kinesis-stream-and-dynamodb-streams
https://stackoverflow.com/questions/48676604/dynamodb-stream-in-ordering-processing
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html
https://docs.aws.amazon.com/lambda/latest/dg/with-ddb.html