Ваше ограничение, по-видимому, на стороне писателя, я написал небольшой скрипт Python для создания и загрузки тестовой таблицы.
Мы видим, что DynamoDB легко масштабируется до 4000 WRU с 8 рабочими процессами, затем немного замедляется, а затем снова масштабируется. Чтобы получить большую пропускную способность, мне пришлось бы добавить больше процессов записи:
Вот скрипт для вашего удобства:
import multiprocessing
import typing
import uuid
import boto3
import boto3.dynamodb.conditions as conditions
from botocore.exceptions import ClientError
TABLE = "speed-measurement"
NUMBER_OF_WORKERS = 8
def create_table_if_not_exists(table_name: str):
try:
boto3.client("dynamodb").create_table(
AttributeDefinitions=[{"AttributeName": "PK", "AttributeType": "S"}],
TableName=table_name,
KeySchema=[{"AttributeName": "PK", "KeyType": "HASH"}],
BillingMode="PAY_PER_REQUEST"
)
except ClientError as err:
if err.response["Error"]["Code"] == 'ResourceInUseException':
# Table already exists
pass
else:
raise err
def write_fast(worker_num):
table = boto3.resource("dynamodb").Table(TABLE)
counter = 0
with table.batch_writer() as batch:
while True:
counter += 1
result = batch.put_item(
Item={
"PK": str(uuid.uuid4())
}
)
if counter % 1000 == 0:
print(f"Worker: #{worker_num} Wrote item #{counter}")
def main():
create_table_if_not_exists(TABLE)
with multiprocessing.Pool(NUMBER_OF_WORKERS) as pool:
pool.map(write_fast, range(NUMBER_OF_WORKERS))
if __name__ == "__main__":
main()
Просто запустите его с помощью Python 3 и остановите, нажав Ctrl+C, как только увидите нужные показатели. Он создаст таблицу и просто запишет ее так быстро, как только сможет, за 8 процессов. Вы также можете увеличить это число.
Источник графики CloudWatch:
{
"metrics": [
[ { "expression": "m2/60", "label": "Write Request Units", "id": "e1", "color": "#2ca02c" } ],
[ "AWS/DynamoDB", "WriteThrottleEvents", "TableName", "speed-measurement", { "yAxis": "right", "id": "m1" } ],
[ ".", "ConsumedWriteCapacityUnits", ".", ".", { "stat": "Sum", "period": 1, "id": "m2", "visible": false } ]
],
"view": "timeSeries",
"stacked": false,
"region": "eu-central-1",
"stat": "Maximum",
"period": 60,
"yAxis": {
"left": {
"label": "Consumed Write Request Units",
"showUnits": false
},
"right": {
"label": "Write Throttle Events",
"showUnits": false
}
},
"annotations": {
"horizontal": [
{
"color": "#9edae5",
"label": "Initial Limit",
"value": 4000,
"fill": "below"
}
]
},
"legend": {
"position": "bottom"
},
"setPeriodToTimeRange": true
}
person
Maurice
schedule
26.05.2021
ProvisionedThroughputExceeded
исключений или что-то в этом роде? В противном случае ограничением является инструмент, который записывает в таблицу, а не сама служба. Здесь общий подход будет заключаться в увеличении количества потоков/процессов и распараллеливания в целом. - person Maurice   schedule 26.05.2021