BackEnd/Server

자꾸 μ§€κ°ν•˜λŠ” μ΄λ²€νŠΈλŠ” μ–΄λ–»κ²Œ ν•΄μ•Όν• κΉŒ

ddonghyeo 2025. 1. 14. 17:16

 

 

νŠΉμ • μš”κ±΄μ—μ„œλŠ” 이벀트의 μˆœμ„œκ°€ λ°˜λ“œμ‹œ 보μž₯λ˜μ–΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€.

 

 

μ² μˆ˜λŠ” 100원을 가진 μƒνƒœμ—μ„œ 100원을 더 μž…κΈˆν•˜κ³  200원을 κ²°μ œν–ˆλ‹€.

 

ν•˜μ§€λ§Œ μ–΄λ–€ 이유둜 λ¨Όμ € λ°œν–‰λœ(t=5)인 100원 μž…κΈˆ μ΄λ²€νŠΈλ³΄λ‹€ λ‚˜μ€‘μ— λ°œν–‰λœ(t=10) 200원 인좜 μ΄λ²€νŠΈκ°€ λ¨Όμ € λ„μ°©ν–ˆλ‹€.

 

μ² μˆ˜λŠ” μž”μ•‘ λΆ€μ‘±μœΌλ‘œ 결제λ₯Ό μ‹€νŒ¨ν•  것이닀 !!

 

자칫 μ΄λ ‡κ²Œ μˆœμ„œκ°€ μ–΄κΈ‹λ‚˜κ²Œ λ„μ°©ν•˜λŠ” κ²½μš°λŠ” μ•ˆ 일어날 것이라고 생각할 수 μžˆλ‹€.

 

ν•˜μ§€λ§Œ μ ˆλŒ€ μ–΄κΈ‹λ‚˜μ§€ μ•Šμ„ κ²ƒμ΄λΌλŠ” 보μž₯은 μ—†λ‹€.

 

μˆœμ„œλ₯Ό 보μž₯ν•˜μ§€ μ•ŠλŠ” 경우, κ²°κ΅­ λΆ€μ •ν™•ν•œ κ²°κ³Όλ₯Ό μ΄ˆλž˜ν•  수 μžˆλ‹€.

 

μ˜€λŠ˜μ€ 이런 λΉ„μˆœμ°¨ 이벀트, 지각 μ΄λ²€νŠΈμ— λŒ€ν•΄ λ§ν•΄λ³΄κ³ μž ν•œλ‹€.

 

  • μ—¬λŸ¬ νŒŒν‹°μ…˜μ—μ„œ 이벀트λ₯Ό μ†ŒλΉ„ν•  경우, 이벀트 처리 μˆœμ„œλ₯Ό μ–΄λ–»κ²Œ μ •ν•  것인지?
  • μˆœμ„œκ°€ μ–΄κΈ‹λ‚œ 이벀트, 지각 μ΄λ²€νŠΈλŠ” μ–΄λ–»κ²Œ μ²˜λ¦¬ν•  것인지?
  • μ„œλΉ„μŠ€λŠ” 처리 κ²°κ³Όλ₯Ό ν™•μ •μ μœΌλ‘œ 생산할 수 μžˆλŠ”μ§€?

 

1. 확정성을 지킀기 μœ„ν•œ 기반

이벀트 기반 λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€μ˜ 처리 μƒνƒœλŠ” 보톡 λ‹€μŒκ³Ό κ°™λ‹€.

  • 이벀트λ₯Ό μ‹€μ‹œκ°„μ— κ°€κΉκ²Œ 처리
  • κ³Όκ±°λΆ€ν„° 이벀트λ₯Ό μ²˜λ¦¬ν•΄μ„œ ν˜„μž¬λ₯Ό λ”°λΌμž‘κΈ° (catch up)

처리 방식에 관계없이, κ°€μž₯ μ€‘μš”ν•œ λͺ©ν‘œλŠ” λ™μΌν•œ 좜λ ₯을 내도둝 ν•˜λŠ” 것이닀.

 

ν•˜μ§€λ§Œ 이벀트의 지연, ν”„λ‘œλ“€μ„œ/컨슈머 μž₯μ• , λ„€νŠΈμ›Œν¬ 이슈 λ“±μ˜ 이유둜 ν™•μ •μ μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” 방법은 μ—†λ‹€.

 

λ”°λΌμ„œ μ΅œλŒ€ν•œ μš”κ±΄μ„ μΆ©μ‘±ν•˜κΈ° μœ„ν•΄ μ—¬λŸ¬ μ „λž΅μ„ μ‚¬μš©ν•  수 μžˆλ‹€.

 

1-1. νƒ€μž„μŠ€νƒ¬ν”„

이벀트 μŠ€νŠΈλ¦Όμ—μ„œ μ˜€ν”„μ…‹κ³Ό νƒ€μž„μŠ€νƒ¬ν”„λ₯Ό 톡해 이벀트 처리 μƒνƒœλ₯Ό 확인할 수 μžˆλ‹€.

 

μ˜€ν”„μ…‹ (offset)
μ»¨μŠˆλ¨Έκ°€ 이벀트λ₯Ό μ–΄λ””κΉŒμ§€ μ½μ—ˆλŠ”μ§€ λ‚˜νƒ€λ‚΄λŠ” κ°’
νƒ€μž„μŠ€νƒ¬ν”„ (timestamp)
μ΄λ²€νŠΈκ°€ μƒμ„±λœ μ‹œκ°„

 

μ•„λž˜λŠ” 전체 ν”„λ‘œμ„ΈμŠ€μ—μ„œ λ‚˜νƒ€λ‚Έ νƒ€μž„μŠ€νƒ¬ν”„ μˆœμ„œμ΄λ‹€.

 

 

  • 이벀트 μ‹œκ°„ (event time)
    • 이벀트 λ°œμƒ μ‹œμ μ— ν”„λ‘œλ“€μ„œκ°€ μ΄λ²€νŠΈμ— ν• λ‹Ήν•œ 둜컬 νƒ€μž„μŠ€νƒ¬ν”„
  • 브둜컀 μΈμž… μ‹œκ°„ (broker ingestion time)
    • μ΄λ²€νŠΈκ°€ λΈŒλ‘œμ»€μ— μΈμž…λœ μ‹œκ°„
    • λΈŒλ‘œμ»€κ°€ ν• λ‹Ήν•œ νƒ€μž„μŠ€νƒ¬ν”„ or μΈμž… μ‹œκ°„μœΌλ‘œ μ„€μ •
  • 컨슈머 μΈμž… μ‹œκ°„ (consumer ingestion time)
    • μ΄λ²€νŠΈκ°€ μ»¨μŠˆλ¨Έμ— μΈμž…λœ μ‹œκ°„
    • 이벀트 μ‹œκ°„ or μ›”ν΄λŸ­ μ‹œκ°„μœΌλ‘œ μ„€μ •
  • 처리 μ‹œκ°„ (processing time)
    • μ»¨μŠˆλ¨Έκ°€ 이벀트 처리λ₯Ό μ™„λ£Œν•œ μ›”ν΄λŸ­ μ‹œκ°„

 

이벀트 μ‹œκ°„μ΄ 브둜컀λ₯Ό 톡해 μ „λ‹¬λ˜μ–΄ μ»¨μŠˆλ¨Έλ„ 이벀트 생성 μ‹œκ°„μ„ μ•Œ 수 있기 λ•Œλ¬Έμ—, 이벀트 처리 μ‹œμ μ— μ„ ν›„ 관계λ₯Ό νŒŒμ•…ν•  수 μžˆλ‹€.

 

이벀트 νƒ€μž„μŠ€νƒ¬ν”„λŠ” 이벀트 μ‹œκ°„μ΄λ‚˜ 브둜컀 μΈμž… μ‹œκ°„μ„ μ‚¬μš©ν•˜λ©΄ λœλ‹€.
μ›”ν΄λŸ­μ΄λ‚˜ 컨슈머 μΈμž… μ‹œκ°„μ€ μ‹€ν–‰ μ‹œμ μ— 따라 달라지기 λ•Œλ¬Έμ— μ‚¬μš©ν•˜λ©΄ μ•ˆ λœλ‹€.
λŒ€λΆ€λΆ„μ€ 둜컬 μ‹œμŠ€ν…œμ΄ ν• λ‹Ήν•œ 이벀트 μ‹œκ°„μ„ μ‚¬μš©ν•˜λŠ”κ²Œ μ’‹κ³ , λΆˆκ°€λŠ₯ ν•˜λ‹€λ©΄ 브둜컀 μΈμž… μ‹œκ°„μ΄ μ΅œμ„ μ΄λ‹€.

 

 

ν•˜μ§€λ§Œ μ—¬κΈ°μ„œ λ¬Έμ œκ°€ μžˆλŠ”λ°, μ—¬λŸ¬ ν”„λ‘œλ“€μ„œκ°€ μ •ν™•ν•˜κ²Œ μ‹œκ°„ 동기화가 λΆˆκ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ—

μ—¬λŸ¬ ν”„λ‘œλ“€μ„œλ‘œλΆ€ν„° 받은 이벀트의 경우, μ •ν™•ν•˜κ²Œ μ„ ν›„ 관계λ₯Ό κ²°μ •μ§“λŠ”κ²Œ μ–΄λ €μ›Œμ§ˆ 수 μžˆλ‹€.

 

각 ν”„λ‘œλ“€μ„œκ°„ μ‹œκ°„μ„ μ΅œλŒ€ν•œ λ™κΈ°ν™”ν•˜κΈ° μœ„ν•΄ 클럭 νƒ€μž„μ„ λ„€νŠΈμ›Œν¬ νƒ€μž„ ν”„λ‘œν† μ½œ(NTP) μ„œλ²„μ™€ λ™κΈ°ν™”ν•œλ‹€.

 

λ„€νŠΈμ›Œν¬ νƒ€μž„ ν”„λ‘œν† μ½œ (Network Time Protocol)
λ„€νŠΈμ›Œν¬μ˜ λͺ¨λ“  λ””λ°”μ΄μŠ€μ—μ„œ μ‹œκ°„μ„ λ™κΈ°ν™”ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” ν”„λ‘œν† μ½œ.
LAN ν™˜κ²½μ—μ„œ 였차λ₯Ό 15λΆ„λ‹Ή 수 λ°€λ¦¬μ΄ˆ μ •λ„λ‘œ 쒁힐 수 μžˆλ‹€.
μ°Έμ‘° : https://www.ntp.org/

 

λ”°λΌμ„œ, 이벀트λ₯Ό μ²˜λ¦¬ν•˜λŠ” μ‹œμ μ— νƒ€μž„μŠ€νƒ¬ν”„λ₯Ό μ΄μš©ν•΄μ„œ λ°œμƒν•œ μˆœμ„œλŒ€λ‘œ μ •λ ¬ν•˜μ—¬ μ²˜λ¦¬ν•˜λŠ” 이벀트 μŠ€μΌ€μ€„λ§μ„ κ΅¬ν˜„ν•¨μœΌλ‘œμ¨ μž¬μ—° κ°€λŠ₯ν•œ κ²°κ³Όλ₯Ό μΌκ΄€λ˜κ²Œ 얻을 수 μžˆλ‹€.

 

1-2. μ›Œν„°λ§ˆν¬

μ›Œν„°λ§ˆν¬(watermark)λŠ” 이벀트 μ‹œκ°„μ˜ 진행 상황을 μΆ”μ ν•˜κ³ , 주어진 이벀트 μ‹œκ°„κΉŒμ§€μ˜ λͺ¨λ“  데이터가 처리 μ™„λ£ŒλμŒμ„ μ„ μ–Έν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€.

 

μ£Όμš” 슀트림 처리 ν”„λ ˆμž„μ›Œν¬(μ•„νŒŒμΉ˜ 슀파크,ν”Œλ§ν¬, μ‚Όμž, λΉ”)μ—μ„œ ν†΅μš©λ˜κ²Œ μ‚¬μš©λ˜λŠ” 방법이닀.

 

 

t=18인 μ΄λ²€νŠΈλΆ€ν„° t=25인 이벀트λ₯Ό λͺ¨λ‘ μ½μ—ˆκ³ , node1은 t=25인 이벀트λ₯Ό λ§ˆμ§€λ§‰μœΌλ‘œ μ†ŒλΉ„ν•˜κ³  λ‚΄λΆ€ 이벀트 μ‹œκ°„μ„ 25둜 μ—…λ°μ΄νŠΈ ν–ˆλ‹€.

 

각 μ›Œν„°λ§ˆν¬λ₯Ό μˆ˜μ‹ ν•œ λ…Έλ“œλ“€μ€ μžμ‹ μ˜ λ‚΄λΆ€ 이벀트 μ‹œκ°„μ„ μ—…λ°μ΄νŠΈν•˜κ³ , 의쑴 관계에 μžˆλŠ” λ‹€λ₯Έ λ…Έλ“œμ— μ°¨λ‘€λ‘œ μ „νŒŒν•œλ‹€.

 

μ›Œν„°λ§ˆν¬λŠ” νƒ€μž„μŠ€νƒ¬ν”„κ°€ κ·Έ 값보닀 μž‘μ€ μ΄λ²€νŠΈλŠ” 지각 이벀트둜 κ°„μ£Όν•΄μ•Ό ν•œλ‹€λŠ” 것을 μ•Œλ¦΄ 뿐이고, 이벀트 μŠ€μΌ€μ€„λ§μ—λŠ” 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ”λ‹€.

 

μ›Œν„°λ§ˆν¬λŠ” 좔후에 μœˆλ„(window) κ°œλ…κ³Ό λ¬Άμ–΄ ν™œμš©λœλ‹€.

 

2. λΉ„μˆœμ°¨/지각 이벀트 처리

이제 νƒ€μž„μŠ€νƒ¬ν”„λ₯Ό ν™œμš©ν•˜μ—¬ λΉ„μˆœμ°¨/지각 이벀트λ₯Ό κ°μ§€ν•˜λŠ” 것을 μ•Œμ•˜λ‹€.

 

λΉ„μˆœμ°¨/지각 μ΄λ²€νŠΈλŠ” 데이터가 μ–Όλ§ˆλ‚˜ μ€‘μš”ν•œκ°€μ— 따라 μ–΄λ–»κ²Œ μ²˜λ¦¬ν• μ§€ κ²°μ •ν•΄μ•Ό ν•œλ‹€.

 

  • 지각 μ΄λ²€νŠΈκ°€ λ°œμƒν•  κ°€λŠ₯성은?
  • μ„œλΉ„μŠ€λŠ” μ–Όλ§ˆλ‚˜ μ˜€λž«λ™μ•ˆ 지각 이벀트λ₯Ό κΈ°λ‹€λ €μ•Ό ν•˜λŠ”μ§€?
  • 지각 이벀트λ₯Ό λˆ„λ½ν•˜λ©΄ μ–΄λ–€ 영ν–₯을 λ―ΈμΉ˜λŠ”μ§€?
  • 지각 이벀트λ₯Ό μœ„ν•΄ 였래 기닀리면 μ–΄λ–€ μ μ—μ„œ μ΄λ‘œμš΄μ§€?
  • μœ μ§€ν•˜κΈ° μœ„ν•΄ λ””μŠ€ν¬, λ©”λͺ¨λ¦¬κ°€ μ–Όλ§ˆλ‚˜ 많이 ν•„μš”ν•œμ§€?
  • 지각 이벀트λ₯Ό κΈ°λ‹€λ¦¬λŠ” λΉ„μš©μ΄ 그둜 인해 μ–»λŠ” ν˜œνƒμ„ λŠ₯κ°€ν•˜λŠ”μ§€?

 

μ—¬λŸ¬ λΉ„μ¦ˆλ‹ˆμŠ€ μš”κ±΄μ„ 따져보고, μ•„λž˜μ™€ 같은 처리λ₯Ό ν•  수 μžˆλ‹€.

 

  • 이벀트 폐기(drop event) : 이벀트λ₯Ό 버린닀.
  • λŒ€κΈ°(wait) : 일정 μ‹œκ°„ μœˆλ„μš° κ²°κ³Ό 좜λ ₯을 λŠ¦μΆ˜λ‹€. 지연 μ‹œκ°„μ΄ λŠ˜μ–΄λ‚˜λŠ” 만큼 확정성을 λ†’μ΄λŠ” 방법이닀.
  • 유예 κΈ°κ°„(grace period) : μœˆλ„μš°κ°€ μ™„λ£Œλœ κ²ƒμœΌλ‘œ κ°„μ£Όλ˜λ©΄ λ°”λ‘œ κ²°κ³Όλ₯Ό 좜λ ₯ν•˜κ³ , 유예 κΈ°κ°„ λ™μ•ˆ κ°€μš©ν•œ μƒνƒœλ‘œ μ—΄μ–΄λ‘”λ‹€. 지각 μ΄λ²€νŠΈκ°€ 도착할 λ•Œ λ§ˆλ‹€ μ—…λ°μ΄νŠΈ ν•˜μ—¬ μƒˆλ‘œμš΄ 값을 좜λ ₯ν•œλ‹€.
유예 기간은 λŒ€κΈ°μ™€ 달리 지각 이벀트 λ„μ°©μ‹œ μ¦‰μ‹œ μ—…λ°μ΄νŠΈκ°€ λ°œμƒν•œλ‹€λŠ” 차이점이 μžˆλ‹€.

 

 

λŒ€κΈ° μ‹œκ°„, 유예 κΈ°κ°„, 처리 방법 λͺ¨λ‘ 정해진 정닡이 μ—†κ³  데이터 μ€‘μš”λ„μ— 따라 μ„œλΉ„μŠ€λ³„λ‘œ κ΅¬μΆ•ν•˜λ©΄ λœλ‹€.