Paweł Łukasiewicz
2024-02-15
Paweł Łukasiewicz
2024-02-15
Udostępnij Udostępnij Kontakt
Wprowadzenie

Batch write to proces pozwalający na dodawanie i usuwanie wielu elementów jednocześnie. Metoda BatchWriteItem pozwala na dodawanie i usuwanie wielu elementów z jednej lub wielu tabel w jednym wywołaniu. Kroki, które są wymagane do wykonania te operacji (poza standardowymi) to utworzenie instancji klasy BatchWriteItemRequest wraz z opisem operacji (PUT lub DELETEBatchWriteItem z wykorzystaniem powyższego żądania jako parametru tej metody. Ostatni krok to sprawdzenie odpowiedzi – co mam na myśli? Powinniśmy sprawdzić czy w odpowiedzi są jakieś nieprzetworzone elementy żądania. Dodatkowo (o czym pisałem już wcześniej), DynamoDB ogranicza rozmiar żądania i liczbę operacji, które można określić w żądaniu. Jeżeli przekroczymy te limity dojdzie do odrzucenia żądania przez DynamoDB.

Mając w głowie poprzednie wpisy stwórzcie proszę dodatkową tabelę, niech to będzie np. Orders. W ramach naszego przykładu dodamy kolejny element do tabeli CarCatalog a w tym samym żądaniu do drugiej tabeli dodamy informacje o zamówieniach przy czym jedno z nich usuniemy, żeby sprawdzić możliwości metody BatchWriteItem. W kodzie możecie utworzyć sobie pomocniczą metodę do tworzenia nowych tabel gdzie podmienimy tylko nazwę tabeli i zdefiniujemy atybuty (spójrzcie poniżej):

private async Task<ActionResult<string>> CreateSampleTable()
{
    var request = new CreateTableRequest
    {
        TableName = TableName3, // Podmieniamy nazwę parametru na 'kolejną tabelę'
        AttributeDefinitions = new List<AttributeDefinition>() // określamy atrybuty
        {
            new AttributeDefinition
            {
                AttributeName = "Id",
                AttributeType = "N"
            },
            new AttributeDefinition
            {
                AttributeName = "CarOrder",
                AttributeType = "N"
            },
            new AttributeDefinition
            {
                AttributeName = "Message",
                AttributeType = "S"
            },
            new AttributeDefinition
            {
                AttributeName = "KeywordTags",
                AttributeType = "S"
            }
        },
        KeySchema = new List<KeySchemaElement>
        {
            new KeySchemaElement
            {
                AttributeName = "Id",
                KeyType = "HASH" // partition key
            },
            new KeySchemaElement
            {
                AttributeName = "ReplyDateTime",
                KeyType = "RANGE" //sort key
            }
        },
        ProvisionedThroughput = new ProvisionedThroughput
        {
            ReadCapacityUnits = 5,
            WriteCapacityUnits = 10
        }
    };

    var response = await _amazonDynamoDB.CreateTableAsync(request);

    var tableDescription = response.TableDescription;

    StringBuilder sb = new StringBuilder();
    sb.AppendLine($"Tabela: {tableDescription.TableName} | Status: {tableDescription.TableStatus}");
    sb.AppendLine($"ReadCapacityUnit: {tableDescription.ProvisionedThroughput.ReadCapacityUnits}");
    sb.AppendLine($"WriteCapacityUnit: {tableDescription.ProvisionedThroughput.WriteCapacityUnits}");

    WaitUntilTableReady(TableName3);

    return sb.ToString();
}
Po wykonaniu powyższego kodu możemy sprawdzić czy rzeczywiście tabela została utworzona a my mamy do dyspozycji dwie tabele: DynamoDB: tworzenie nowej tabeli Drugi krok to przygotowanie kodu:
public async Task<ActionResult<string>> WriteItemBatch()
{
    var request = new BatchWriteItemRequest()
    {
        RequestItems = new Dictionary<string, List<WriteRequest>>
        {
            {
                TableName1, new List<WriteRequest>
                {
                    new WriteRequest
                    {
                        PutRequest = new PutRequest
                        {
                            Item = new Dictionary<string, AttributeValue>
                            {
                                { "Id", new AttributeValue {N = "2"} },
                                { "Brand", new AttributeValue {S = "Audi"} },
                                { "Model", new AttributeValue{S = "R8"} },
                                { "Color", new AttributeValue {S = "Progressive Red"} },
                                { "Price", new AttributeValue { S = "1 064 000"} },
                            }
                        }
                    }
                }
            },
            {
                TableName2, new List<WriteRequest>
                {
                    new WriteRequest
                    {
                        PutRequest = new PutRequest
                        {
                            Item = new Dictionary<string, AttributeValue>
                            {
                                { "Id", new AttributeValue {N = "1"} },
                                { "CarOrder", new AttributeValue {N = "2"} },
                                { "Message", new AttributeValue{S = "You order has beed completed!"} },
                                { "KeywordTags", new AttributeValue {S = "Audi R8, Progressive Red, 1 064 000"} },
                            }
                        }
                    },
                    new WriteRequest
                    {
                        DeleteRequest = new DeleteRequest
                        {
                            Key = new Dictionary<string, AttributeValue>
                            {
                                { "Id", new AttributeValue {N = "2"} },
                            }
                        }
                    }
                }
            }
        }
    };

    var response = await _amazonDynamoDB.BatchWriteItemAsync(request);

    return Json(response);
}
Po wykonaniu powyższego kodu możemy zobaczyć, że wszystkie elementy zostały poprawnie przeprocesowane: DynamoDB: odpowiedz z metody BatchWriteItem

W kolejnym wpisie pobierzemy wiele elementów z jednej lub wielu tabel.