반응형

개요

  • 내가 이걸 다하나?
  • 손이 너무 많이 간다... (고도화 전략 - %로 주기)
  • MYSQL Version Upgrade (5.7 -> 8.0)
  • 역시 손이 너무 많이간다 ... (고도화 전략 - Terraform 활용하기)

내가 이걸 다하나?


현재 회사에서 근무한지는 어언 11개월이 넘어가고

Devops 파트에서 팀리드가 된지는 6개월이 넘어가는 시점

나는, 우리는 DB를 어떻게 관리했고 앞으로는 어떻게 관리할건지 얘기해보겠다.

 

사실 DB는 각 회사에 DBA분이 다 하시는건지 알았다. (예전회사는 그랬으니... <- 바보같은 생각)

History가 굉장히 많지만, Database 에 대한 권한제어는 DevOps 파트에서 관리한다.

 

초반에는 아래와 같은 이유로 굉장히 손이 많이 갔었다.

  • 신규입사자 및 퇴사자 계정 추가 및 제거
  • 유저별 권한 추가 및 제어
  • 인덱스 별 쿼리 제어 및 DML 쿼리의 대한 검증

 

신규입사자 및 퇴사자 계정 추가 및 제거

## 유저생성
create user <username>@'%' identified by '<password>';


## 유저삭제
DROP user '<username>'@'%';

 

뭐 어떻게 보면 별거는 아니다.

신규입사자가 오면 유저를 생성하고, 퇴사자는 유저를 Drop 하면 된다.

 

뭐 금방금방 처리할수는 있지만, 갑자기 바쁠때 처리할라고하면 굉장히 은근 귀찮다.

해당 관련해서 다른 팀원들이 유저를 제거하기 위해 아래와같은 쿼리를 사용했다.

## mysql.user 에서 유저삭제?
DELETE FROM mysql.user WHERE user = <username>;

 

근데, 이렇게 하면 유저는 삭제되지만 부여된 권한이 삭제가 되지 않는다.

즉... 제대로 삭제가 안된다

 

유저별 권한 추가 및 제어

## 권한 추가
GRANT SELECT ON `prd_database`.table TO '<username>'@'%';

## 이거 꼭 해줘야 함
flush privileges; 

## 해당 유저에 권한 보기
SHOW GRANTS FOR <username>;

유저별 권한은 팀마다 챕터마다 사용하는 DB.Table 추가해주면 된다.

사실 이것도 크게 어렵진 않다. 하지만 물론 이것도 하다보면 손이 꽤 많이간다.

 

테이블이 없어지거나, 관리가 안된다면... 은근 빡세다

인덱스 별 쿼리 제어 및 DML 쿼리의 대한 검증

이건 크게 관리포인트라기 보다는...

우리회사 특이점 인지는 몰라도, 인덱스 및 쿼리검증은 Devops가 한다 (이게맞나? 싶지만 그것에 대한 의문은 하지않는다 -> 그게프로니까)

 

보통 인덱스 같은 경우, 아래와 같은 프로세스를 사용해서 진행한다

  1. RDS에 스냅샷 생성 (index-test)
  2. 생성된 스냅샷 DB에 인덱스 진행
  3. 인덱스 시간 및 process 점유 파악
  4. 금방끝나거나 가벼운작업이라면 진행하지만, 시간이 꽤 걸리는 작업이라면 공지하고 18시~19시 이후에 진행

쿼리에 대한검증도 보통... 위와같이 진행할 수 있다.

가끔 한방쿼리를 사용하는 사람도 있어서...


 

손이 너무 많이 간다 (고도화전략 - % 로 주기)

회사마다 다르겠지만 현재 우리회사의 DB.Table 숫자는 아래와 같았다.

  • Database : 40 + a
  • Table : 100 + a

이렇다보니.. 각 유저별 DB.Table 권한을 세세하게 주기가 너무어려웠다.

어떻게 하면 편하게 줄 수 있을까 해서... 편법이 떠올랐다.

## prd_database 구성된 테이블에 SELECT 권한 전체주기
GRANT SELECT ON `prd_database`.* TO '<username>'@'%';
flush privileges;

## prd로 시작하는 전테 데이터베이스.Table에 SELECT 권한 전체주기
GRANT SELECT ON `prd%`.* TO '<username>'@'%';
flush privileges;

 

이야... 이렇게 하니까 편하긴한데 문제는 여러가지가 발생하였다.

 

DB가 안돼요

가끔 Data Engineer 분이 본인 쿼리가 안된다고 한다.

근데 또 DB IDE를 껐다 키면 또 됐다가 안됐다가 오락가락 한다.

 

그 이유를 보니 권한 구성을 살펴보니 아래와 같았다.

개판...

그냥 내가 봤을때는 개판이었다.

빨간줄로 슥슥 그었지만, %와 raw 하게 권한을 준것이 짬뽕이되어, 뭔가 꼬이는게 아닐까 하는생각이 들었고,

%로 구성된 권한을 제외하니까 다시는 해당 이슈가 발생하지 않았다....

 

보안상 이슈

일단 결론적으로 말하면 % 형태로 권한을 부여하는것은 솔직히 좋지 않다.

특히 보안상... 왜냐하면 {prefix}% 시작하는 모든 DB.Table에 대해서는 부여된 권한을 사용할 수 있기 때문이다.

그럼 어떻게 해야할까...

어떻게 하면 보안상으로 훌륭하고, 우리팀의 손을 덜수 있을까? 


 

MYSQL Version Upgrade (5.7 -> 8.0) 

업무를 하다보니... 올때가 왔다.

대충 요약하면 MYSQL 5.7 버전이 이제 지원을 종료 하니 8.0 으로 버전을 올려라 이런 얘기다 

( 종료는 아니고 표준지원이 종료되니 -> 5.7을 사용할거면 돈을 더 내라... )

 

별다른 대책이 없다.

그래서 공지하고 기존 5.7 -> 8.0 으로 DB를 업그레이드 했다 (Blue/Green 방법 활용)

관련해서는 추후에 글을 한번 써볼예정임 -> 다사다난했음


역시 손이 너무 많이 간다 ( 고도화전략 - Terraform 활용하기 )

8.0 으로 버전을 올리면서 MYSQL에 내가 몰랐던 기능이 하나 추가되었다.

Role 추가

이 전까진 유저에 대해서 권한을 주고 뺐다 보니까, 굉장히 불편했다.

그런데 Role이 추가된다니... 나름 신세계 

AWS 를 주로사용하는 나로서는 RBAC 같은 기능을 나름 잘 사용했기 때문에 회사에 한번 적용해보기로 하였다.

Role 관련 쿼리

## Role 생성
CREATE ROLE 'role_name';

## Role 권한 부여
GRANT SELECT, INSERT, UPDATE ON database_name.* TO 'role_name';

## 유저에 관련 Role 부여
GRANT 'role_name' TO 'user_name'@'host';

## Role 삭제
DROP ROLE 'role_name';

## Role에 대한 권한 확인
SHOW GRANTS FOR 'role_name';

 

오우... 유저에 권한을 부여하고 하는것보다 더 간단하다고 생각했다.

Role을 사용하면 팀으로 공통된 역할을 부여하는것이 가능할거라고 생각했다.

 

적용 Architecture

위 구성을 보면 설명은 아래와 같다.

  • ADMIN_ROLE은 말 그대로 DB 전체적인 권한
  • DATA_ROLE은 DB 에 DML / DDL 권한 및 DBA 수준의 역할을 부여
  • *_TEAM_ROLE은 팀마다 관리하는 DB.Table 별 DML 권한 부여
  • *_TEAM_READONLY_ROLE은 팀마다 관리하는 DB.Table 별 SELECT 권한 부여

이렇듯 Role 자체를 미리 만들어두면 유저별로 권한을 부여해주는 귀찮은 짓은 안해도 된다.

그럼? Role 관리는 어떻게 할까?

 

테라폼을 활용하자 (MYSQL Provider)

테라폼 + MYSQL Provider를 활용하여 Role Base로 관리하기

이 회사에 테라폼 마스터인 내가 있으니... 어떤것도 무섭지 않지

Role 자체에 대한 정의를 미리 만들어놓고 users.tf에다가 해당 값을 매핑시킨다면 크게 어려운것은 없었다

 

## provider.tf

terraform {
  required_providers {
    mysql = {
      source = "petoju/mysql"
    }
    random = {
      source  = "hashicorp/random"
      version = "~> 3.0"
    }
  }
}

variable "HOST" {
 
}

variable "DB_USER" {
  
}

variable "DB_PASSWORD" {

}

provider "mysql" {
  endpoint = "${var.HOST}:3306"
  username = var.DB_USER
  password = var.DB_PASSWORD
}

provider "aws" {
  profile = ########
  region  = "ap-northeast-2"
}

terraform {
  backend "s3" {
    bucket  = "shared-state"
    key     = "database/prd/prd-cluster/terraform.tfstate"
    region  = "ap-northeast-2"
    profile = #######
  }
}

 

 ## roles.tf
 
 ROLES = {
    ADMIN : {
      "%" : "ADMIN"
    },
    "STANDARD" : {
      "prod%" : "READ_ONLY",
      "prd%" : "READ_ONLY"
    },
    "DBA" : {
      "performance_schema" : "READ_ONLY"
    },
    "DATA" : {
      "prod%" : "ALL_DATA",
      "prd%" : "ALL_DATA"
    },
  }

  // DML (CRUD)
  TEAM_ROLES = {
    "REFUND" : {
      "refund.p" : "TEAM_DML",
      "refund.pV2" : "TEAM_DML",
      "refund.pLog" : "TEAM_DML",
      "refund.history" : "TEAM_DML",
      "refund.fail" : "TEAM_DML",
      "refund.status" : "TEAM_DML"
    },
    "CARE" : {},
    "OP" : {},
    "CORE" : {},
    "REFUND_READONLY" : {},
    "CARE_READONLY" : {},
    "OP_READONLY" : {},
    "CORE_READONLY" : {},    
  }

 

users.yml

user:
  display_name: user lee
  email: user@company_workspace.kr
  given_name: user
  family_name: lee
  group: developer
  role:
    shared:
      - developer-service
    dev:
      - zent-sso
  db:
    prd-database:
      - STANDARD ## Role
      - REFUND   ## Role

 

provider로 MYSQL을 정의하고

roles.tf에 관련된 Role을 정의한다

그리고 users.yml 을 정의 한후 yamldecode 메서드를 사용해서 기존 role과 매핑시켜주면 된다. (매핑하는 로직이 꽤 빡셀수 있음)

결과는 아래와 같다

Role 부여

유저자체가 가지는 권한에 대해서는 손쉽게 Role로써 부여가 가능하다.

또 이를 Terraform으로 한번더 추상화하니, 더 쉽게 관리가 가능해졌다.


 

반응형
반응형

프로젝트

https://github.com/zkfmapf123/Wip

 

GitHub - zkfmapf123/Wip: Git Simple Commit and Push

Git Simple Commit and Push . Contribute to zkfmapf123/Wip development by creating an account on GitHub.

github.com

 

무슨툴인가?

  • Git Commit / Push 자동화 툴

 

왜 만들었는가?

  • 혼자 개발할때, 간단하게 Push 하고싶을때 아래 명령어가 귀찮아서..
  • git add . && git commit -m "wip" && git push origin main

 

어떻게 사용하는가?

  • 위 홈페이지 참조
## tap
brew tap zkfmapf123/homebrew-tap
brew search wip

## friends 설치
zkfmapf123/tap/wip

 

 

그래서... 쓸만한가?

4.5 / 5.0 ( 나는 잘 쓰고 있으나, 회사에서는 왠만하면 사용하지 말길...)

반응형

'개발 툴 소개' 카테고리의 다른 글

Wake up friends  (0) 2024.12.23
반응형

프로젝트 

https://github.com/zkfmapf123/Wakeup-Friends

 

GitHub - zkfmapf123/Wakeup-Friends: Wakeup-Friends (EC2)

Wakeup-Friends (EC2). Contribute to zkfmapf123/Wakeup-Friends development by creating an account on GitHub.

github.com

 

무슨 툴인가?

  • 현재 구성된 환경에 EC2 Instance에 상태를 CLI로 볼수있음
  • CLI를 활용해서 중지 및 실행을 구성

 

왜 만들었는가?

  • EC2 키고 끌때마다 직접 AWS Console 들어가서 하기 귀찮음 
  • Event Bridge + Lambda 활용해서 하는 방법은 Too Much
  • Cloud9을 활용하고 싶으나, AWS Console 자체를 그냥 들어가기 귀찮음..

 

어떻게 사용하는가?

  • 위 홈페이지 참조 (사용 방법)
## tap
brew tap zkfmapf123/homebrew-tap
brew search friends

## friends 설치
zkfmapf123/tap/friends

 

그래서... 쓸만한가?

4.0 / 5.0 (간단하게 쓴다면 좋은듯?)

반응형

'개발 툴 소개' 카테고리의 다른 글

Wip  (0) 2024.12.23
반응형

AWS에서 효율적으로 Global Infra 구성하기 (채널톡)

개요

  • 글로벌 서비스
  • 글로벌 서비스를 구성하기 위한 AWS Service

느리다…

채널톡의 AWS Infra

  • 여기서 중요한건, DB는 다 ap-northeast-2에 존재한다.
  • 어떻게 하면 미국에 있는 사용자가 효율적으로 Serving이 가능할까?

문제를 해결하는 여러가지 방법

1) Application Side

  • Bundle Size 줄이기
  • Caching 잘 이용하기
  • Request를 병렬로 처리
  • UX도 개선 (빠르게 느끼게 하기 위해서…)

2) Infra Side

  • 최적의 지연시간
  • Request Caching

CloudFront

  • CDN 서비스
  • Content Delivery 해주는 서비스
  • 이미지, 동영상 뿐만 아니라 HTTP도 Content로 제공해준다
  • 즉, CF → 뒤에 ALB를 붙혀서 사용할 수도 있다.
  • 근데… 많이 비쌈… → Caching 서버 → 웹 서비스의 경우 HTTP라서 Caching을 못한다 → 그럼 비용이 너무 비쌈

Global Accelerator

  • 최대 60% 가까이 빨라짐
  • 그리고 테스트를 할수있는 페이지도 있음이것만 앞에 붙히면 되겠다. → 끝?
  • 근데 AWS Global Accelerator의 동작방식과 VPC Peering을 보면?
    • 똑같다.
    • 그리고 채널톡에서 원한거 → Caching을 원했었다.
    • 그럼 중간에 proxy 서버를 하나 두면되는거 아닌가?
    • 보통 HTTP는 Cors과정에서 OPTION method를 먼저 요청한다 이걸 (preflight 라고한다)
    • 그래서 보통 CORS과정은 브라우저단에서 1개의 POST요청을 보내는것 같지만
      • OPTION → PreFlight → 요청 받음 → CORS 허용?
      • POST → 요청
    • 그 얘긴 즉슨 미국으로 요청할때, OPTIONS + POST 두번 허용하는데 이걸 한번으로 줄이면 어떨까?

개선된 인프라

  • 값싸고
  • Caching이 가능하고
  • OPTIONS + POST 통신이 아닌 한번의 통신이 가능한 인프라구조
    • Route53의 GeoLocation을 사용하면 각각 연결하게 된다.
      • 한국 → 한국
      • 미국 → 미국

  • VPC Peering이 더 빠르다…
  • OPTION 메서드를 빼고 + VPC Peering이 더 빠르다

Wrap up

  • 인프라를 변경한다거나, 백엔드를 변경할 순 없다
  • 인프라를 변경하지 않고도 해결하는 방법을 고민해봐야 한다
  • 문제를 해결하는 방법은 여러가지다.
  • AWS Managed Service를 잘 조합하면 더 좋은 결과를 얻을 수 있다.
  • VPC Peering + HTTP 기반의 CORS PreFlight OPTION 메서드제외

Reference

[Global Expansion] Show Me Your Startup! Channel Corp. - AWS에서 효율적으로 글로벌 인프라 사용하기

반응형
반응형

K8s 도입하면서 겪은 일들

쿠버네티스, 도입배경과 배포

사용한 리소스

  • Pod
  • Service
  • Node
  • Ingress Controller (ALB)
  • Deployment

왜 사용?

  • 기존 VM에 유지했다가 → K8s로 운영을 하기위해서

도입 후 장단점

장점

  • 설치없음
  • 배포 편리 함
  • 롤백에 대한 스트레스 ( IaC )
  • Self Healing (OOM이 진짜 자주 발생함)

단점 : Pod / Deployment

  • 마스터노드 / 워커노드 여러군데에 배포를 하니 → 결국 마스터노드에 CPU / MEM이 부족해져서 클러스터가중단되었음 → 워커노드에만 배포할 수 있도록 구성함 (taint)
  • 노드가 먹통이 됨
    • 주황색이 리소스를 너무 먹어서 → Node 가다 죽음
    • 각 파드에 리소스 Limit을 넣어주면 됨

  • 변경사항이 적용되지 않음 (배포)
    • watch로 보고있었는데 → 배포가 안됨 → 요지부동…
    • 자바 코드를 변경하지 않고 propery만 변경해서 → Docker Image가 변경되지 않았다고 판단했음
      • kubectl rollout restart deployment mynginx
  • 심각 : 내 Pod가 다른 배치작업에 영향을 받았음 
    • 새벽에 배치작업을 하는 노드들이 장애가 발생함 (CPU, Memory) → 그 과정에서 다른 노드에서 문제가 됨…
    • operation = true 라는 레이블을 설정하면서, 노드중에 operation=true에만 배포하면 됨

  • 내 pod가 한 노드에서만 구성이 되는경우가 발생…
    • K8s는 어차피 계속 운영할 수 있도록 옮겨줌 → 다만 1~2분간의 순단이 발생함
    • 노드에 배치를 잘 해주면 됨
    • podAntiAffinity
  • 재배포가 안되는 상황
    • 파드가 2분동안 배포가 안되는 상황….
    • 새로운 파드가 배포될 곳이 없어서 기다리는 상태임 → 노드를 하나더 사용하면 됨…

단점 : Ingress

  • ACL 문제
    • MSA구성하다보면 → 포트로 서비스를 분류한다
    • 주로 밤에 ACL문제가 발생한다.

 

  • 포트가 기억이 안나는 문제
    • mynginx : 30010
    • yournginx: 30020
    • 기억이 안남 몇개월후면 → …
    • Ingress 기반의 Path 기반 라우팅을 사용한다면 해결됨 (Cluster IP)
      • FQDN (Fully Qualifeid Domain Name)

단점 : Liveness Probe / Readiness Probe

  • 어플리케이션은 살아있는데 (Pod) 서비스가 비정상인 경우
    • Liveness Probe를 활용해서 → Pod를 HealthCheck를 해서 자동 재시작을 하게끔 해야함
  • K8s는 배포하면 순단이 발생한다
    • Readiness Probe를 사용 → 컨테이너 준비 상태인지 확인을 하고 → 그 전까지는 트래픽을 보내지 않는다..
    • 준비가 되어야 트래픽을 보낸다

K8s 운영 팁

  • Pod를 좀더 자세히보자
  • 로그를 편하게 보자 - stern
반응형
반응형

AWS Lambda in GO

ASIS

  • Slack Webhook을 받는 파이선 메인 서비스 존재
  • Slack Webhook 서비스가 늘어남에 따라, 다른 요청들도 밀림 → 장애전파

  • 분당 20,000건

  • Slack 메시지가 밀리면서 장애 발생 DB 부하 → 모놀리틱서버였음…
  • Scale-up을 해서 해결했으나 → 굉장히 별로였음…

어떻게 고쳐야할까?

  • 서버리스로 구성하자…
  • Queue를 사용하자…
    • 요청을 받는 그대로 사용하면 DB가 죽으니 → 천천히 Consume 하자
    • 실패의 대한 모니터링 + 재처리를 구성해야 함

TOBE

AWS Resource

  • API Gateway → 가장 먼저 요청을 받고
  • AWS Lambda → MSK로 전달
  • Amazon MSK → 큐로 핸들링
    • 메시지를 처리해도 → 왠만하면 남아있음…

어떻게 개발했나?

  • golang으로 구성된 람다를 사용할때는 Kafka Producer를 사용하게 되는데
    • IBM/sarama를 사용 → 가능한 C Binding을 사용하지 않는 Pure Go를 선택
    • Confluenct는 Go를 사용하는데 → 인터페이스 과정에서 성능병목이 존재 + 크로스플랫폼 빌드가 존재…
  • 람다 핸들러를 쉽게 구현하기 위해 → aws/aws-lambda-go를 활용

결론

  • Golang 람다 최종용량은 6.8MB
    • 코드크기가 50MB를 초과하면 S3를 이용해야 하는데 → Go Build는 용량이 작아 편리 → Docker로 배포가 더 편함
    • 평균 실행시간 500ms ~ 3000ms (카프카 플러쉬로 인해서 큼)
  • Refactoring 해야할 부분
    • 실행시간을 줄이기 위해 → ARM 프로세서를 고려 (AWS Gravition 2)
    • 처리시간 줄이기 위해 → Lambda SIGTERM → Kafka flush 고민 중
반응형
반응형

Amazon EKS 아키텍처 구성하기 (심리스)

개발 & 운영을 하면서 겪는 문제

  • 운영 배포가 실패했습니다.
    • 내 컴퓨터에서는 되는데?
    • Test / QA에서는 되는데?
    • 왜 운영에서는 장애가 나지?
    • 개발팀과 운영팀 내에서 책임과 회피가 발생한다
      • “너가 코드 바꿈”
      • “Devop가 배포 잘못한거 아님?”
      • 점점 풀수없는 문제들이 심화됨
  • 배포 작업자의 실수로 서버가 날라감 (Terraform destory)
    • 통제불능이 되버림…

그렇다면 운영환경의 실수를 줄이기 위해서는 → GitOps

  • Git Repository를 활용한 방법론
  • Git Repository에서는 어떤 원하는상태의 근거로 사용한다
  • Pull Request로 코드로 관리한다
  • 의도한 상태 + 관찰된 상태 모두 자동화된 형태로 운영한다
  • Git Repository를 활용해서 배포 / 관리를 진행한다
  • Infrastructure as a Code
    • Terraform
    • Cloud Formation
    • CDK

왜 git 이어야 하는가?

  • Git 자체는 기록이 모두 남기 때문에 모든 배포 과정이 graph로 그려진다.
  • PR 자체를 사용하여 배포를 하기때문에 명확하다
  • 배포 장애에 굉장히 신속하고 정확하게 대응이 가능한

GitOps 도구

  • FluxCD
    • EKS Anywhere
    • MSA Operator
    • EventTrigger + Polling
    • Slack 외부 기타 시스템 Alert + Webhook
    • ECR을 쳐다보게 할 수 있음..
    • 개발자가 PR의 대한 자동화를 해줌

Progressive Delivery

  • 지속적인 배포 → CI / CD의 속도를 기반으로 하는 배포 프로세스
  • 정합성을 지속적으로 검사

Argo Rollouts

  • 트래픽 형성기능 활용하여 업데이트 중에 트래픽을 점진적으로 제공
  • 다양한 메트릭을 쿼리를 사용하여 + 롤백유도할수 있는 기능제공
  • Kubernetes CRD를 통하여 A/B 테스트 가능
  • 배포작업이 자동화 → Progressive Delivery

  • 최고의 조합은
    • Istio + Argo Rollouts

정리

  • Giops
    • Git을 활용하여 Operation Practice를 통칭
    • Continouse Deployment를 형상화하는 운영방법론
  • Progressive Delivery
    • Continouse Deployment 진화된 형태
    • 기존 CD + Canary + BlueGreen 등 고급배포 방법론을 제공
    • Flagger
    • Argo Rollouts

 

반응형
반응형

EKS + Kinesis = CQRS (강남언니) 2024.6.6

EKS를 이용한 SAAS 서비스 아키텍쳐

해결해야 했던 문제

  • Saas 효율화를 위한 → Multi Tenancy 환경을 구축해야 한다
    • Multi Tenancy → 단일 인스턴스가 여러 고객에게 서비스를 제공하는…
  • 복잡한 도메인 서비스를 빠르게 개발 → 운영할 수 있어야 한다
  • 각 제품의 대한 분리된 인프라 제공
    • 데이터 분리

Architecture

어떻게 시스템 분리를 하였는가? → Namespace 분리

EventSourcing + CQRS

  • 강남언니는 어떤 요구때문에 CQRS를 적용했는가?
  • 병원의 요구사항
    • 누가, 언제, 어떤 작업을 했는지 → 감사로그 → 필요
    • 매출 통계, 결제 내역 등 과거의 기반한 통계 → Zent에서도 필요
  • 제품적 요구사항
    • 발생한 이벤트의 따라 달라지는 프로세스
    • 이벤트별로 제공되어야 하는 푸쉬알림이나 문자 메시지 → Zent랑 얼추 비슷함?

EventSourcing

  • 일반적인 DB는 상태를 저장하고 → 상태를 계속 변경함 (Update…)
  • EventSourcing 상태를 발생하기위한 모든 이벤트를 저장 → 상태 자체를 이벤트기반으로…
    • 이 이벤트를 차례대로 재생하면 현재의 상태를 알수있다
    • 계속 남긴다 그냥

디테일한 예시 (예약변경)

1. 고객은 예약변경을 하고싶어 한다 → 예약변경 API를 호출한다
2.예약변경이란 명령이 HeadSpring으로 전달된다. ( 이건 SQS인가? )
3. HeadSpring은 변경명령이 왔다면 → EventStore를 통해서 지금까지 모든 이벤트를 조회를 한다
4. 조회된 이벤트를 스케쥴 이란 상태로 만들어낸다

    • 가장 최신의 이벤트로 만들어 낸다.
    • 스케쥴이란 → 고객이 점유한 데이터를 그냥 스케쥴이라고 명명

5.예약변경 명령 실행기에 전달해서 → 이벤트를 만들고 → 이벤트 스토어에 저장한다. → MessageBus를 이용해서 Kinesis에 전달한다

  • Kinesis를 Message Broker로 사용함

 

그런데, 허들이 있었다.

  • 예를들어서 2월 13일의 스케쥴을 알고싶어
  • 그럼 2월 13일에 모든 데이터를 읽어서 → 스트림 재생과정을 거쳐서 → 필터링 → 부하

허들을 극복 → CQRS (효율적인 조회모델)

  • 명령과 조회를 각각의 모델을 사용함
  • EventSourcing → EventSourcing 모델
  • 조회 → 조회모델
  • Kinesis DataStream을 구독하기 위해서 → Spring Cloud + Kinesis Client Library

왜 Kinesis Data Stream을 Message Broker로 사용했을까?

  • MSK, Kafka, SQS 많은 서비스가 있는데 왜? KDS일까?
  • 원래는 Apache Kafka를 고민했지만 → Kafka Cluster를 관리하는 리소스가 너무 큼
  • 그리고 Kineiss가 더 쌈
  • 메시지 처리량
    • SNS + SQS 기준은 선입선출 (초당 처리량의 한계가 존재함)
    • Kinesis는 충분한 Shard가 존재한다면 → 무제한임

Reference

반응형

+ Recent posts