ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • dynamodb write
    개발/AWS 2024. 8. 20. 08:45

    dynamodb에서 write의 경우 로우별 write와 데이터를 묶어서 write를 할 수 있는 기능이 있다.

    그 중 데이터를 묶어서 write를 하는 경우를 보려고 한다. 

    모든 api가 그렇듯 네트워크 비용이 증가하면 그만큼 지연이 발생한다 

    대량건을 빠른 시간 내에 처리를 해야하는 구조라면 로우별 write 보단 bulk 별 write를 고려할 수 있다. 

    nosql인 dynamodb의 경우 key value 형태로 데이터가 저장되므로 aws model인 AttributeValue로 데이터를 변환하는 과정을 거쳐야 한다 

    AttributeValue 에는 다양한 형태가 있다 

    1. withS - 말 그대로 String 형태로 변환하는거로 tmp : "123" 같은 형태로 들어간다. 

    2. withL - List 형태로 들어간다  , tmp : 0 - "11" , 1 - "22"

    3. withM -Map 형태로 들어간다  , tmp : kk , aa , cc 

     

    예를 들어보자 

    class AModel{
    	String temp;
     	BModel bmodel;
        List<CModel> cModelList;
    }
    
    class BModel{
    	List<String> b;
    }
    
    class CModel{
    	String c;
    }

     

    위 AModel을 Attribute로 변환 하기 위해 

    temp 는 withS , BModel은 withM , CModel은 withL 이 필요하다 

     

    AttributeValue로 변환 후에는 이를 PutRequest에 넣어 삽입 대상을 정한다 

    Map<String, AttributeValue> stringAttributeValueMap;
    new WriteRequest().withPutRequest(new PutRequest().withItem(stringAttributeValueMap));

     

    bulk의 경우 25개 단위로 가능하므로 25개 단위로 partition을 분리한다. 

    List<List<WriteRequest>> partition = Lists.partition(writeRequestList, 24);

     

    그 후 이를 transaction write에 넣어 write를 한다. 

    partition.forEach(writeRequests -> {
    
        List<TransactWriteItem> transactWriteItems = writeRequests.stream()
              .map(writeRequest->new TransactWriteItem()
                    .withPut(new Put()
                          .withTableName("대상테이블")
                          .withItem("bulkWriteAttributeMap")
              .collect(Collectors.toList());
        TransactWriteItemsRequest transactWriteItemsRequest = new TransactWriteItemsRequest()
              .withTransactItems(transactWriteItems);
        dynamoDB.transactWriteItems(transactWriteItemsRequest);
    
    });

     

    cf) bulk의 경우 update 요소만이 아닌 전체를 엎어치는 과정을 거치므로 주의하여 사용한다. 

    '개발 > AWS' 카테고리의 다른 글

    S3 쓰기  (4) 2024.09.06
    카프카  (0) 2022.03.13
    DynamoDB 활용기  (0) 2021.12.28
    DynamoDB  (0) 2021.12.16
    Athena  (0) 2021.12.16

    댓글

Designed by Tistory.