secondhand-auction

Secondhand-Auction

πŸ“Œ ν”„λ‘œμ νŠΈ λͺ©ν‘œ

  • 객체지ν–₯ 섀계원칙에 따라 RESTful API λ₯Ό 섀계 ν•©λ‹ˆλ‹€.

  • TDDκ°œλ°œλ‘ μ„ μ μš©ν•˜λ©°, ν…ŒμŠ€νŠΈμ˜ μ€‘μš”μ„±μ— λŒ€ν•΄ ν•™μŠ΅ν•©λ‹ˆλ‹€.

  • λŒ€μš©λŸ‰ νŠΈλž˜ν”½κ³Ό λ™μ‹œμ„±μ— λŒ€ν•΄ κ³ λ €ν•˜λ©° κ°œλ°œν•©λ‹ˆλ‹€.

  • μƒˆλ‘œμš΄ 컀밋이 λ°œμƒν•  λ•Œ λ§ˆλ‹€ μ½”λ“œλ¦¬λ·°λ₯Ό 톡해 λ¦¬νŒ©ν† λ§μ΄ ν•„μš”ν•œ 뢀뢄을 μ°Ύμ•„λ‚΄κ³ , κ°œμ„ ν•©λ‹ˆλ‹€.


βœοΈν”„λ‘œμ νŠΈ νŠΉμ§•

κ΅¬ν˜„ν•˜κ³  싢은 κΈ°λŠ₯

μ‚¬μš©μžκ°€ μ°Έμ—¬ν•˜κ³  μžˆλŠ” κ²½λ§€ λˆ„κ΅°κ°€ μž…μ°° ν–ˆμ„ λ•Œ, 경맀에 μ°Έκ°€ν•œ μ‚¬μš©μžλ“€μ—κ²Œ μƒˆλ‘œμš΄ μž…μ°° λ°œμƒ λ©”μ‹œμ§€λ₯Ό 보내고, 접속쀑인 μ‚¬μš©μžμ—κ²ŒλŠ” μ‹€μ‹œκ°„μœΌλ‘œ μ•Œλ¦Όμ„ λ³΄λ‚΄λŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κ³ μž ν–ˆμŠ΅λ‹ˆλ‹€.

문제

  • μƒˆλ‘œμš΄ μž…μ°° λ°œμƒ λ©”μ‹œμ§€λ₯Ό λ³΄λ‚΄λŠ” μž‘μ—…μ€ DB에 μ ‘κ·Ό ν•΄ Insert 쿼리 호좜 ν•΄μ•Όν•˜κ³ , μ‹€μ‹œκ°„ μ•Œλ¦Όμ„ λ°œμ†‘ν•˜κΈ° μœ„ν•΄ Websocket 을 μ‚¬μš©ν•΄ μ ‘μ†ν•œ λŒ€μƒμ„ 체크해 μ•ŒλžŒμ„ 보내야 ν–ˆμŠ΅λ‹ˆλ‹€. κ²½λ§€ μ°Έμ—¬μžκ°€ 증가할 수둝, μž…μ°° 둜직 μˆ˜ν–‰μ‹œκ°„ 보닀 λ©”μ‹œμ§€μ™€ μ‹€μ‹œκ°„ μ•Œλ¦Όμ„ λ³΄λ‚΄κΈ°μœ„ν•œ λŒ€κΈ°μ‹œκ°„μ΄ κΈΈμ–΄μ‘ŒμŠ΅λ‹ˆλ‹€.

ν•΄κ²°λ°©μ•ˆ 및 κ²°κ³Ό

  • κ²½λ§€ μ°Έμ—¬μžκ°€ λ§Žμ•„μ§ˆ κ²½μš°μ—λ„ μž…μ°° 둜직의 μˆ˜ν–‰μ‹œκ°„μ„ λ³΄μ‘΄ν•˜κ³ μž λ©€ν‹°λͺ¨λ“ˆμ„ ν™œμš©, μž…μ°° λ‘œμ§μ„ μˆ˜ν–‰ν•˜λŠ” μ„œλ²„μ™€ κ²½λ§€ μ•Œλ¦Ό λ‘œμ§μ„ μˆ˜ν–‰ν•˜λŠ” μ„œλ²„λ₯Ό 뢄리해 μˆ˜ν–‰ν•˜λ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.
    • κ²½λ§€ μ°Έμ—¬μžκ°€ λ§Žμ•„μ§ˆ κ²½μš°μ—λ„, κ²½λ§€ 등둝 λ‘œμ§μ€ 100ms μ΄λ‚΄λ‘œ μˆ˜ν–‰λ  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 핡심 둜직(κ²½λ§€) 이외 λ¬Έμ œκ°€ λ°œμƒν•˜λ”λΌλ„, λ©”μΈμ„œλ²„μ˜ μ•ˆμ •μ„±μ„ 보μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ„œλ²„ ν™•μž₯이 ν•„μš”ν•  λ•Œ, νŠΈλž˜ν”½μ΄ λͺ°λ¦¬λŠ” νŠΉμ • μ„œλ²„μ— λŒ€ν•΄μ„œλ§Œ ν™•μž₯이 κ°€λŠ₯ν•΄ λΉ„μš© νš¨μœ¨μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€.
    • κΈ°λŠ₯λ³€κ²½ 및 κ°œμ„  μž‘μ—…μ΄ μ΄λ£¨μ–΄μ§ˆ λ•Œ, λ‹€λ₯Έμ„œλ²„에 λ―ΈμΉ˜λŠ” 영ν–₯을 μ΅œμ†Œν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

문제

  • ν•œ κ°€μ§€ κΈ°λŠ₯을 μœ„ν•΄, μ—¬λŸ¬κ°œμ˜ μ„œλ²„μ—μ„œ μž‘μ—…μ΄ 이루어져야 ν–ˆμŠ΅λ‹ˆλ‹€.
  • μ„œλ²„κ°€ 물리적으둜 κ²°ν•©λ˜μ–΄ μžˆμ–΄, μ™ΈλΆ€μ—μ„œ μ„œλ²„μ˜ ꡬ쑰λ₯Ό νŒŒμ•…ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
  • μ„œλ²„κ°€ λ‹€μš΄λ˜κ±°λ‚˜ λ§Žμ€ μš”μ²­μ΄ λͺ°λ¦¬λ”라도, λ©”μ‹œμ§€ 손싀이 λ°œμƒν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

ν•΄κ²°λ°©μ•ˆ 및 κ²°κ³Ό

  • μ„œλ²„μ˜ 연결을 λ©”μ‹œμ§€ 큐(AWS SQS)λ₯Ό 톡해 λ°œν–‰, ꡬ독 ν•˜λ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.
    • μ—¬λŸ¬ μ„œλ²„μ—μ„œ μž‘μ—…μ΄ λΉ„λ™κΈ°μ μœΌλ‘œ 이루어 질 수 μžˆμ–΄, μ‹œμŠ€ν…œμ˜ μ²˜λ¦¬λŸ‰μ„ μ¦κ°€μ‹œν‚€κ³  μ‚¬μš©μžμ—κ²Œ λΉ λ₯Έ μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 각 μ„œλ²„κ°€ 물리적 결합이 μ•„λ‹Œ κ°„μ ‘μ μœΌλ‘œ ν†΅μ‹ λ˜λ―€λ‘œ, μ™ΈλΆ€μ—μ„œ ꡬ쑰λ₯Ό νŒŒμ•…ν•  수 μ—†κ²Œ ν•΄ λ³΄μ•ˆμ μœΌλ‘œ μ•ˆμ „ν•˜κ²Œ μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ„œλ²„κ°€ λ‹€μš΄λ˜κ±°λ‚˜ λ§Žμ€ μš”μ²­μ΄ λͺ°λ¦¬λ”라도, 큐λ₯Ό 톡해 λ©”μ‹œμ§€κ°€ κ΄€λ¦¬λ˜μ–΄, λ©”μ„Έμ§€ 손싀 없이 μ•ˆμ •μ μœΌλ‘œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ’‘ μ€‘κ³ κ±°λž˜ μ˜₯μ…˜ μ„œλ²„ ꡬ쑰도

img_server_structure.png

  • ECS Fargateλ₯Ό μ΄μš©ν•΄ Main, Sender, Broker 3개의 μ„œλΉ„μŠ€λ₯Ό λ„μš°κ³ , ALB 섀정을 톡해 /sender/* 둜 μš”μ²­ λ˜λŠ” 건에 λŒ€ν•΄μ„œλŠ” Notification Sender μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œ, λ‚˜λ¨Έμ§€ μš”μ²­μ€ Main μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œ μš”μ²­λ˜λ„λ‘ κ΅¬μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

  • Redis μ„œλ²„λŠ” ElastiCache λ₯Ό ν™œμš©ν•˜λ©°, Main μ„œλ²„μ—μ„œμ˜ 둜그인 μ„Έμ…˜ 곡유, μΊμ‹±μ²˜λ¦¬, μž…μ°° μ‹œ λ™μ‹œμ„± μ œμ–΄λ₯Ό μœ„ν•œ Lock 으둜 μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

  • AWS SQSλ₯Ό ν™œμš©ν•΄ Main μ„œλ²„μ™€ Broker μ„œλ²„ κ°„μ˜ λ©”μ‹œμ§€ 전달, Sender μ„œλ²„μ™€ Broker μ„œλ²„ κ°„μ˜ λ©”μ‹œμ§€ 전달을 κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.


πŸ“Œ κ²½λ§€μš”μ²­ μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨

img_bidding_sequence.png

  • 둜그인 μ‹œ, 고객은 Sender μ„œλ²„μ™€ Websocket 을 톡해 μ—°κ²°μƒνƒœλ₯Ό μœ μ§€ν•©λ‹ˆλ‹€.

  • 고객이 μž…μ°° μ‹œ, Main μ„œλ²„μ—μ„œλŠ” ν•΄λ‹Ή μš”μ²­μ„ λ°›μ•„ μž…μ°°λ‘œμ§μ„ μˆ˜ν–‰ν•˜κ³ , AWS SQS(sha-message-queue)에 κ²½λ§€ 정보 λ©”μ‹œμ§€λ₯Ό Publish ν•©λ‹ˆλ‹€.

  • Broker μ„œλ²„μ—μ„œλŠ” AWS SQS(sha-message-queue)에 λ©”μ‹œμ§€λ₯Ό λ°›μ•˜μ„ λ•Œ, κ²½λ§€ μ°Έμ—¬μžμ˜ λ©”μ‹œμ§€ν•¨μ— λ©”μ‹œμ§€λ₯Ό μΆ”κ°€ν•˜κ³ , μ•ŒλžŒμ„ μœ„ν•œ 정보λ₯Ό AWS SQS( sha-message-send-queue) 둜 Publish ν•©λ‹ˆλ‹€.

  • Sender μ„œλ²„μ—μ„œλŠ” AWS SQS(sha-message-send-queue)에 λ©”μ‹œμ§€λ₯Ό λ°›μ•˜μ„ λ•Œ, Websocket 을 톡해 μ‹€μ‹œκ°„ μ•ŒλžŒμ„ μ „μ†‘ν•©λ‹ˆλ‹€.


πŸ“Œ Secondhand-Auction μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ 및 CI/CD ꡬ쑰도

img_cicd_structure.png

  • ν”„λ‘œμ νŠΈμ˜ 역할을 λΆ„λ¦¬ν•˜κΈ° μœ„ν•΄ λ©€ν‹°λͺ¨λ“ˆμ„ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. κ³΅ν†΅μ μœΌλ‘œ μ‚¬μš©λ˜λŠ” κΈ°λŠ₯듀을 common λͺ¨λ“ˆλ‘œ κ΅¬λΆ„ν•œ λ’€ ν•΄λ‹Ή λͺ¨λ“ˆμ„ μ‚¬μš©ν•΄ mainκ³Ό broker μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μ„±ν–ˆκ³ , μ‹€μ‹œκ°„ μ•ŒλžŒμ„ μœ„ν•œ SenderλŠ” λ”°λ‘œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

  • TeamCity 의 VCS Trigger λ₯Ό 톡해 Github Main 브런치의 컀밋 이벀트λ₯Ό κ°μ§€ν•˜κ³ , ν•΄λ‹Ή μ΄λ²€νŠΈμ— λŒ€ν•΄ λΉŒλ“œ 및 ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ ν›„ Docker 이미지λ₯Ό ꡬ성해 ECR둜 μ—…λ‘œλ“œν•©λ‹ˆλ‹€.

  • μ—…λ‘œλ“œ 된 Docker 이미지λ₯Ό ECS Fargate 에 λ°°ν¬ν•˜κ³ , ALB λ₯Ό 톡해 μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.


Visit original content creator repository https://github.com/f-lab-edu/secondhand-auction

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *