(SDD407) Amazon DynamoDB: Data Modeling and Scaling Best Practices | AWS re:Invent 2014
-
Upload
amazon-web-services -
Category
Technology
-
view
1.108 -
download
0
description
Transcript of (SDD407) Amazon DynamoDB: Data Modeling and Scaling Best Practices | AWS re:Invent 2014
November 13, 2014 | Las Vegas, NV
David Yanacek, Amazon DynamoDB
Cache read-heavy items
Product A Product B
Shopper
ProductCatalog Table
Product A Product B
Shopper
SELECT Id, Description, ...FROM ProductCatalogWHERE Id=“Product A”
ProductCatalog Table
Need to scale
for the sale
Administrator (You)
ProductCatalog Table
Administrator (You)
Provision 5000 read capacity units
ProductCatalog Table
Administrator (You)
2500 read capacity units (each)
Provision 5000 read capacity units
Partition 1 Partition 2
ProductCatalog Table
Administrator (You)
(no sharing)
Partition 1 Partition 2
ProductCatalog Table
Provision 5000 read capacity units
Partition 1 Partition 2
ProductCatalog Table
Administrator (You)
ProductCatalog Table
Provision 100,000 read capacity units
Partition 1
2000 RCU
Partition K
2000 RCU
Partition M
2000 RCU
Partition 50
2000 RCU
Product A Product B
Shoppers
Partition 1
2000 RCU
Partition K
2000 RCU
Partition M
2000 RCU
Partition 50
2000 RCU
ProductCatalog Table
Partition 1
2000 RCU
Partition K
2000 RCU
Partition M
2000 RCU
Partition 50
2000 RCU
Product A Product B
Shoppers
ProductCatalog Table
Partition 1
2000 RCU
Partition K
2000 RCU
Partition M
2000 RCU
Partition 50
2000 RCU
Product A Product B
Shoppers
ProductCatalog Table
Partition 1
2000 RCU
Partition K
2000 RCU
Partition M
2000 RCU
Partition 50
2000 RCU
Product A Product B
Shoppers
ProductCatalog Table
Size Throughput
# 𝑜𝑓 𝑃𝑎𝑟𝑡𝑖𝑡𝑖𝑜𝑛𝑠 =𝑇𝑎𝑏𝑙𝑒 𝑆𝑖𝑧𝑒 𝑖𝑛 𝑏𝑦𝑡𝑒𝑠
10 𝐺𝐵(𝑓𝑜𝑟 𝑠𝑖𝑧𝑒)
# 𝑜𝑓 𝑃𝑎𝑟𝑡𝑖𝑡𝑖𝑜𝑛𝑠(𝑓𝑜𝑟 𝑡ℎ𝑟𝑜𝑢𝑔ℎ𝑝𝑢𝑡)
=𝑅𝐶𝑈𝑓𝑜𝑟 𝑟𝑒𝑎𝑑𝑠
3000 𝑅𝐶𝑈+
𝑊𝐶𝑈𝑓𝑜𝑟 𝑤𝑟𝑖𝑡𝑒𝑠
1000𝑊𝐶𝑈
(𝑓𝑜𝑟 𝑡ℎ𝑟𝑜𝑢𝑔ℎ𝑝𝑢𝑡)(𝑓𝑜𝑟 𝑠𝑖𝑧𝑒)(𝑡𝑜𝑡𝑎𝑙)
100,000𝑅𝐶𝑈50𝑃𝑎𝑟𝑡𝑖𝑡𝑖𝑜𝑛𝑠
≈ 𝟐𝟎𝟎𝟎 𝑟𝑒𝑎𝑑 𝑐𝑎𝑝𝑎𝑐𝑖𝑡𝑦 𝑢𝑛𝑖𝑡𝑠 𝑝𝑒𝑟 𝑝𝑎𝑟𝑡𝑖𝑡𝑖𝑜𝑛
Partition 1
2000 RCU
Partition K
2000 RCU
Partition M
2000 RCU
Partition 50
2000 RCU
ProductCatalog Table
Space Time
Part
itio
n
Time
Heat
0
400
800
1200
1600
Cap
ac
ity U
nit
s
Time
Provisioned Consumed
“save up” unused capacity
consume saved up capacity
0
400
800
1200
1600
Cap
ac
ity U
nit
s
Time
Provisioned Consumed Attempted
Burst capacity: 300 seconds
(1200 × 300 = 3600 CU)
Throttled requests
Partition 1
2000 RCU
Partition K
2000 RCU
Partition M
2000 RCU
Partition 50
2000 RCU
Product A Product B
Shoppers
ProductCatalog Table
Req
uests
Per
Seco
nd
Item Primary Key
Request Distribution Per Hash Key
DynamoDB Requests
Req
uests
Per
Seco
nd
Item Primary Key
Request Distribution Per Hash Key
DynamoDB Requests Cache Hits
Partition 1 Partition 2
ProductCatalog Table
User
DynamoDB
User
SELECT Id, Description, ...
FROM ProductCatalog
WHERE Id="POPULAR_PRODUCT"
Substitute indexes for filters
GameId Date Host Opponent Status
d9bl3 2014-10-02 David Alice DONE
72f49 2014-09-30 Alice Bob PENDING
o2pnb 2014-10-08 Bob Carol IN_PROGRESS
b932s 2014-10-03 Carol Bob PENDING
ef9ca 2014-10-03 David Bob IN_PROGRESS
Games Table
GameId Date Host Opponent Status
d9bl3 2014-10-02 David Alice DONE
72f49 2014-09-30 Alice Bob PENDING
o2pnb 2014-10-08 Bob Carol IN_PROGRESS
b932s 2014-10-03 Carol Bob PENDING
ef9ca 2014-10-03 David Bob IN_PROGRESS
Games Table
IN_PROGRESS DONEPENDING
Secondary Index
Bob
Opponent Status GameId Date Host
Alice DONE d9bl3 2014-10-02 David
Carol IN_PROGRESS o2pnb 2014-10-08 Bob
Bob IN_PROGRESS ef9ca 2014-10-03 David
Bob PENDING 72f49 2014-10-03 Alice
Bob PENDING b932s 2014-09-30 Carol
Secondary Index
Opponent Status GameId Date Host
Alice DONE d9bl3 2014-10-02 David
Carol IN_PROGRESS o2pnb 2014-10-08 Bob
Bob IN_PROGRESS ef9ca 2014-10-03 David
Bob PENDING 72f49 2014-10-03 Alice
Bob PENDING b932s 2014-09-30 Carol
Bob
Secondary Index
Opponent Status GameId Date Host
Alice DONE d9bl3 2014-10-02 David
Carol IN_PROGRESS o2pnb 2014-10-08 Bob
Bob IN_PROGRESS ef9ca 2014-10-03 David
Bob PENDING 72f49 2014-10-03 Alice
Bob PENDING b932s 2014-09-30 Carol
Bob
SELECT * FROM Game
WHERE Opponent='Bob'
AND Status='PENDING'
Bob
SELECT * FROM Game
WHERE Opponent='Bob'
AND Status='PENDING'
ORDER BY Date?
Opponent Status GameId Date Host
Alice DONE d9bl3 2014-10-02 David
Carol IN_PROGRESS o2pnb 2014-10-08 Bob
Bob IN_PROGRESS ef9ca 2014-10-03 David
Bob PENDING 72f49 2014-10-03 Alice
Bob PENDING b932s 2014-09-30 Carol
Secondary Index
SELECT * FROM Game
WHERE Opponent='Bob'
AND Status='IN_PROGRESS'
ORDER BY Date?
(hash)
(range)
(?)
Secondary Index
Opponent Date GameId Status Host
Alice 2014-10-02 d9bl3 DONE David
Carol 2014-10-08 o2pnb IN_PROGRESS Bob
Bob 2014-09-30 72f49 PENDING Alice
Bob 2014-10-03 b932s PENDING Carol
Bob 2014-10-03 ef9ca IN_PROGRESS David
Bob
Secondary Index
Bob
Opponent Date GameId Status Host
Alice 2014-10-02 d9bl3 DONE David
Carol 2014-10-08 o2pnb IN_PROGRESS Bob
Bob 2014-09-30 72f49 PENDING Alice
Bob 2014-10-03 b932s PENDING Carol
Bob 2014-10-03 ef9ca IN_PROGRESS David
SELECT * FROM Game
WHERE Opponent='Bob'
ORDER BY Date DESC
FILTER ON Status='PENDING'
(filtered out)
Bob
Bob
StatusDate
DONE_2014-10-02
IN_PROGRESS_2014-10-08
IN_PROGRESS_2014-10-03
PENDING_2014-09-30
PENDING_2014-10-03
Status
DONE
IN_PROGRESS
IN_PROGRESS
PENDING
PENDING
Date
2014-10-02
2014-10-08
2014-10-03
2014-10-03
2014-09-30
Secondary Index
Opponent StatusDate GameId Host
Alice DONE_2014-10-02 d9bl3 David
Carol IN_PROGRESS_2014-10-08 o2pnb Bob
Bob IN_PROGRESS_2014-10-03 ef9ca David
Bob PENDING_2014-09-30 72f49 Alice
Bob PENDING_2014-10-03 b932s Carol
Opponent StatusDate GameId Host
Alice DONE_2014-10-02 d9bl3 David
Carol IN_PROGRESS_2014-10-08 o2pnb Bob
Bob IN_PROGRESS_2014-10-03 ef9ca David
Bob PENDING_2014-09-30 72f49 Alice
Bob PENDING_2014-10-03 b932s Carol
Secondary Index
Bob
SELECT * FROM Game
WHERE Opponent='Bob'
AND StatusDate STARTS_WITH 'PENDING'
Status + Date
Distribute large items
Messages
Table
Messages app
David
Recipient Date Sender Message
David 2014-10-02 Bob …
… 48 more messages for David …
David 2014-10-03 Alice …
Alice 2014-09-28 Bob …
Alice 2014-10-01 Carol …
(Many more messages)
MessagesTable
Recipient Date Sender Message
David 2014-10-02 Bob …
… 48 more messages for David …
David 2014-10-03 Alice …
Alice 2014-09-28 Bob …
Alice 2014-10-01 Carol …
(Many more messages)
David
MessagesTable
SELECT *
FROM Messages
WHERE Recipient='David'
LIMIT 50
ORDER BY Date DESC
Recipient Date Sender Message
David 2014-10-02 Bob …
… 48 more messages for David …
David 2014-10-03 Alice …
Alice 2014-09-28 Bob …
Alice 2014-10-01 Carol …
(Many more messages)
David
MessagesTable
Cost of query?
SELECT *
FROM Messages
WHERE Recipient='David'
LIMIT 50
ORDER BY Date DESC
Recipient Date Sender Message
David 2014-10-02 Bob …
… 48 more messages for David …
David 2014-10-03 Alice …
Alice 2014-09-28 Bob …
Alice 2014-10-01 Carol …
(Many more messages)
MessagesTable
Average item size = 256 KB
Large message bodies
Attachments?
David
SELECT *
FROM Messages
WHERE Recipient='David'
LIMIT 50
ORDER BY Date DESC
Recipient Date Sender Message
David 2014-10-02 Bob …
… 48 more messages for David …
David 2014-10-03 Alice …
Alice 2014-09-28 Bob …
Alice 2014-10-01 Carol …
(Many more messages)
David
MessagesTable
50 items × 256 KB each
SELECT *
FROM Messages
WHERE Recipient='David'
LIMIT 50
ORDER BY Date DESC
Items evaluated by query
Average item size
Conversion ratio
Eventually consistent reads
Messages
Table
Inbox
Table
Messages app
Recipient Date Sender Subject MsgId
David 2014-10-02 Bob Hi!… afed
David 2014-10-03 Alice RE: The… 3kf8
Alice 2014-09-28 Bob FW: Ok… 9d2b
Alice 2014-10-01 Carol Hi!... ct7r
Inbox Table Messages Table
MsgId Body
9d2b …
3kf8 …
ct7r …
afed …
(Bulk message data)(Message metadata, indexed by recipient)
Recipient Date Sender Subject MsgId
David 2014-10-02 Bob Hi!… afed
David 2014-10-03 Alice RE: The… 3kf8
Alice 2014-09-28 Bob FW: Ok… 9d2b
Alice 2014-10-01 Carol Hi!... ct7r
Inbox Table Messages Table
MsgId Body
9d2b …
3kf8 …
ct7r …
afed …
David1. Query Inbox: 1 RCU
(50 sequential items at 128 bytes)
Recipient Date Sender Subject MsgId
David 2014-10-02 Bob Hi!… afed
David 2014-10-03 Alice RE: The… 3kf8
Alice 2014-09-28 Bob FW: Ok… 9d2b
Alice 2014-10-01 Carol Hi!... ct7r
Inbox Table Messages Table
MsgId Body
9d2b …
3kf8 …
ct7r …
afed …
David1. Query Inbox: 1 RCU
2. BatchGetItem Messages: 1600 RCU
(50 separate items at 256 KB)
(50 sequential items at 128 bytes)
Messages
Table
Inbox
Table
David
PutItem
{
MsgId: 123,
Body: ...
}
PutItem
{
Recipient: Steve,
Date: 2014-10-23,
MsgId: 123,
...
}
Messages
Table
Inbox
Table
David
PutItem
{
MsgId: 123,
Body: ...
}
PutItem
{
Recipient: Steve,
Date: 2014-10-23,
MsgId: 123,
...
}
David
PutItem
{
MsgId: 123,
Body: ...,
Recipient: Steve,
Sender: David,
Date: 2014-10-23,
...
}
Inbox
Global secondary
index
Messages
Table
Inbox
Global secondary
index
Messages
Table
David
Outbox
Global secondary
index
Coming soon:
Inbox
Messages
De-normalize schemas
Design for retries
User HighScore
Chuck 20
Alice 1000
Bob 470
Dave 850
Erin 580
Friends Table HighScores Table
User Friend
Bob Alice
Bob Chuck
Alice Bob
Alice Chuck
Alice Erin
User HighScore
Chuck 20
Alice 1000
Bob 470
Dave 850
Erin 580
Friends Table HighScores Table
User Friend
Bob Alice
Bob Chuck
Alice Bob
Alice Chuck
Alice Erin
Alice
User HighScore
Chuck 20
Alice 1000
Bob 470
Dave 850
Erin 580
Friends Table HighScores Table
User Friend
Bob Alice
Bob Chuck
Alice Bob
Alice Chuck
Alice Erin
1. Query 2. BatchGetItemAlice
User Friend H.S.
Bob Alice 1000
Bob Chuck 20
Alice Bob 470
Alice Chuck 20
Alice Erin 580
User HighScore
Chuck 20
Alice 1000
Bob 470
Dave 850
Erin 580Table
FriendScores Table HighScores Table
User Friend H.S.
Bob Alice 1000
Bob Chuck 20
Alice Bob 470
Alice Chuck 20
Alice Erin 580
User HighScore
Chuck 20
Alice 1000
Bob 470
Dave 850
Erin 580
User H.S. Friend
Bob 20 Chuck
Bob 1000 Alice
Alice 20 Chuck
Alice 470 Bob
Alice 580 Erin
Table Local Secondary Index
FriendScores Table HighScores Table
User Friend H.S.
Bob Alice 1000
Bob Chuck 20
Alice Bob 470
Alice Chuck 20
Alice Erin 580
User HighScore
Chuck 20
Alice 1000
Bob 470
Dave 850
Erin 580
User H.S. Friend
Bob 20 Chuck
Bob 1000 Alice
Alice 20 Chuck
Alice 470 Bob
Alice 580 Erin
Table Local Secondary Index
FriendScores Table HighScores Table
Query
FROM FriendScores-Index
WHERE User=Alice, DESC, LIMIT 10Alice
ScoresFriends
User HighScore
Chuck 30
Alice 1000
Bob 470
Dave 850
Erin 580
User Friend H.S.
Bob Alice 1000
Bob Chuck 30
Alice Bob 470
Alice Chuck 30
Alice Erin 580
FriendScores Table HighScores Table
1. UpdateItem
2. UpdateItem(s)
Chuck
User HighScore
Chuck 30
Alice 1000
Bob 470
Dave 850
Erin 580
User Friend H.S.
Bob Alice 1000
Bob Chuck 30
Alice Bob 470
Alice Chuck 20
Alice Erin 580
FriendScores Table HighScores Table
1. UpdateItem
2. UpdateItem(s)
Chuck
User H.S. Updating
Chuck 20
Alice 1000
Bob 470
Dave 850
Erin 580
User Friend H.S.
Bob Alice 1000
Bob Chuck 20
Alice Bob 470
Alice Chuck 20
Alice Erin 580
FriendScores Table HighScores Table
true while updating the high score
User H.S. Updating
Chuck 30 true
Alice 1000
Bob 470
Dave 850
Erin 580
User Friend H.S.
Bob Alice 1000
Bob Chuck 20
Alice Bob 470
Alice Chuck 20
Alice Erin 580
FriendScores Table HighScores Table
1. UpdateItemChuck
User H.S. Updating
Chuck 30 true
Alice 1000
Bob 470
Dave 850
Erin 580
User Friend H.S.
Bob Alice 1000
Bob Chuck 30
Alice Bob 470
Alice Chuck 20
Alice Erin 580
FriendScores Table HighScores TableChuck
2. UpdateItem(s)
User H.S. Updating
Chuck 30 true
Alice 1000
Bob 470
Dave 850
Erin 580
User Friend H.S.
Bob Alice 1000
Bob Chuck 30
Alice Bob 470
Alice Chuck 20
Alice Erin 580
FriendScores Table HighScores TableChuck
3. GetItem
User H.S. Updating
Chuck 30 true
Alice 1000
Bob 470
Dave 850
Erin 580
User Friend H.S.
Bob Alice 1000
Bob Chuck 30
Alice Bob 470
Alice Chuck 30
Alice Erin 580
FriendScores Table HighScores TableChuck
4. UpdateItem(s)
User H.S. Updating
Chuck 30
Alice 1000
Bob 470
Dave 850
Erin 580
User Friend H.S.
Bob Alice 1000
Bob Chuck 30
Alice Bob 470
Alice Chuck 30
Alice Erin 580
FriendScores Table HighScores Table
5. UpdateItemChuck
PutItemRequest acceptBob;
PutItemRequest acknowledgeChuck;
Transaction t = txManager.newTransaction();
t.putItem(acceptBob);
t.putItem(acknowledgeChuck);
t.commit();
Friends TableTransactions
Table
Transaction Images
Table
Transaction
Client
Bob
Your app
FriendScores
Table
HighScores
Table
Your app
FriendScores
Table
HighScores
Table
Your
Kinesis-enabled
app
Your app
FriendScores
Table
HighScores
DynamoDB
Stream
HighScores
Table
User H.S.
Chuck 20
Alice 100
HighScores Table
Chuck
Seq User Old New
1 Chuck 10 20
2 Alice 80 90
3 Alice 90 100
HighScores Stream
User H.S.
Chuck 30
Alice 100
HighScores Table
Chuck
Seq User Old New
1 Chuck 10 20
2 Alice 80 90
3 Alice 90 100
HighScores Stream
User H.S.
Chuck 30
Alice 100
HighScores Table
Chuck
Seq User Old New
1 Chuck 10 20
2 Alice 80 90
3 Alice 90 100
4 Chuck 20 30
HighScores Stream
User H.S.
Chuck 30
Alice 100
HighScores Table
Chuck
Seq User Old New
1 Chuck 10 20
2 Alice 80 90
3 Alice 90 100
4 Chuck 20 30
HighScores Stream
User H.S.
Chuck 30
Alice 100
HighScores Table
User Friend H.S.
Bob Chuck 20
Alice Chuck 20
FriendScores Table
Friend User
Chuck Alice
Chuck Bob
Table Global Secondary Index
Seq User Old New
1 Chuck 10 20
2 Alice 80 90
3 Alice 90 100
4 Chuck 20 30
HighScores Stream
Your
Kinesis-enabled
app
User H.S.
Chuck 30
Alice 100
HighScores Table
User Friend H.S.
Bob Chuck 20
Alice Chuck 20
FriendScores Table
Friend User
Chuck Alice
Chuck Bob
Table Global Secondary Index
Seq User Old New
1 Chuck 10 20
2 Alice 80 90
3 Alice 90 100
4 Chuck 20 30
HighScores Stream
Your
Kinesis-enabled
app
User H.S.
Chuck 30
Alice 100
HighScores Table
User Friend H.S.
Bob Chuck 30
Alice Chuck 30
FriendScores Table
Friend User
Chuck Alice
Chuck Bob
Table Global Secondary Index
Seq User Old New
1 Chuck 10 20
2 Alice 80 90
3 Alice 90 100
4 Chuck 20 30
HighScores Stream
Your
Kinesis-enabled
app
User H.S.
Chuck 30
Alice 100
HighScores Table
User Friend H.S.
Bob Chuck 30
Alice Chuck 30
FriendScores Table
Friend User
Chuck Alice
Chuck Bob
Table Global Secondary Index
Seq User Old New
1 Chuck 10 20
2 Alice 80 90
3 Alice 90 100
4 Chuck 20 30
HighScores Stream
Your
Kinesis-enabled
app
Streams
Checkpoint
Table
Shard write-heavy items
Design for retries
Candidate A
Votes: 20
Candidate B
Votes: 30
Voter
Votes Table
Candidate A
Votes: 21
Candidate B
Votes: 30
Votes Table
UPDATE VotesSET Votes = Votes + 1WHERE Id=“Candidate A”Voter
(aka atomic increment)
Need to scale
for the election
Administrator (You)
Votes Table
Administrator (You)
Provision 200,000 write capacity units
Partition 1
1000 WCU
Partition K
1000 WCU
Partition M
1000 WCU
Partition N
1000 WCU
Votes Table
Candidate A Candidate B
Voters
Partition 1
1000 WCU
Partition K
1000 WCU
Partition M
1000 WCU
Partition N
1000 WCU
Votes Table
Partition 1
1000 WCU
Partition K
1000 WCU
Partition M
1000 WCU
Partition N
1000 WCU
Votes Table
Candidate A Candidate B
Voters
Candidate A
Candidate A_2
Candidate A_1
Candidate A_3
Candidate A_4Candidate A_7
Candidate A_6 Candidate A_8
Candidate A_5
Candidate A_2
Candidate B_1
Candidate B_2
Candidate B_3
Candidate B_5
Candidate B_4
Candidate B_7
Candidate B_6
Candidate A_1
Candidate A_3
Candidate A_4Candidate A_7 Candidate B_8
Candidate A_6 Candidate A_8
Candidate A_5
Voter
Votes Table
Candidate A_2
Candidate B_1
Candidate B_2
Candidate B_3
Candidate B_5
Candidate B_4
Candidate B_7
Candidate B_6
Candidate A_1
Candidate A_3
Candidate A_4Candidate A_7 Candidate B_8
UpdateItem: “CandidateA_” + rand(0, 10)
ADD 1 to Votes
Candidate A_6 Candidate A_8
Candidate A_5
Voter
Votes Table
Votes Table
Candidate A_2
Candidate B_1
Candidate B_2
Candidate B_3
Candidate B_5
Candidate B_4
Candidate B_7
Candidate B_6
Candidate A_1
Candidate A_3
Candidate A_4
Candidate A_5
Candidate A_6 Candidate A_8
Candidate A_7 Candidate B_8
Periodic
Process
Candidate A
Total: 2.5M
1. Sum
2. Store Voter
UserId Candidate Date
Alice A 2013-10-02
Bob B 2013-10-02
Eve B 2013-10-02
Chuck A 2013-10-02
RawVotes Table
Voter
UserId Candidate Date
Alice A 2013-10-02
Bob B 2013-10-02
Eve B 2013-10-02
Chuck A 2013-10-02
RawVotes Table
Segment Votes
A_1 23
B_2 12
B_1 14
A_2 25
AggregateVotes Table
Voter
1. Record vote and de-dupe, retry 2. Increment candidate counter
UserId Candidate Date
Alice A 2013-10-02
Bob B 2013-10-02
Eve B 2013-10-02
Chuck A 2013-10-02
RawVotes Table
Segment Votes
A_1 23
B_2 12
B_1 14
A_2 25
AggregateVotes Table
Voter
AggregateVotes
Table
Voters
RawVotes Table
Voting app
AggregateVotes
Table
Amazon
Redshift Amazon EMR
Your
Kinesis-enabled
app
Voters RawVotes TableVoting app RawVotes
DynamoDB
Stream
AggregateVotes
Table
Amazon
Redshift Amazon EMR
Your
Kinesis-enabled
app
Voters RawVotes TableVoting app RawVotes
DynamoDB
Stream
AggregateVotes
Table
Amazon
Redshift Amazon EMR
Your
Kinesis-enabled
app
Voters RawVotes TableVoting app RawVotes
DynamoDB
Stream
AggregateVotes
Table
Amazon
Redshift Amazon EMR
Your
Kinesis-enabled
app
Voters RawVotes TableVoting app RawVotes
DynamoDB
Stream
AggregateVotes
Table
Amazon
Redshift Amazon EMR
Your
Kinesis-enabled
app
Voters RawVotes TableVoting app RawVotes
DynamoDB
Stream
Status + Date
Inbox
Messages
ScoresFriends
http://bit.ly/awsevals