본문 바로가기
C.W.K.
Stream
Lesson 04 of 04 · published

서비스로 만들지 말아야 할 때

~13 min · architecture, decision-making, operational-cost, defaults

Level 0불 꺼진 작업장
0 XP0/35 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

대부분의 프로젝트가 건너뛰는 질문

도구에 디렉터리가 생길 무렵이면 이미 누군가 '이건 서비스다'라고 정해둔 뒤야. 근데 그걸 정한 기억이 있는 사람은 거의 없어. 프레임워크랑 같이 오고, 템플릿이랑 같이 오고, 튜토리얼이랑 배포 대상이랑 같이 오거든. 그리고 아래쪽 전부가 그걸 전제하니까, 그 전제는 끝까지 시험대에 안 올라가.

소리 내서 물어볼 값어치가 있는 질문은 좁아. 아무도 미리 안 정한 순간에, 이것한테서 답을 받아야 하는 게 있나? 있으면 항상 떠 있어야 하고, 그건 서비스야. 모든 호출이 하나도 빠짐없이 '사람이 돌리기로 했다'로 거슬러 올라가면 가용성은 애초에 요구사항이 아니었고, 포트는 반대편에 아무것도 없는 비용이야.

포트가 실제로 얼마인가

만드는 값은 하찮고, 그게 요점도 아냐. 진짜 비용은 존재하기 시작한 다음부터 붙어서 안 떨어져:

  • 관리할 생명주기 — 부팅 때 떠야 하고, 죽으면 다시 살아나야 하고, 밑에 깔린 런타임을 올려도 버텨야 해.
  • 생사 질문 — 언젠가 누군가 '이거 떠 있냐'고 물어야 하고, 그럼 헬스 엔드포인트가 필요하고, 그걸 읽는 것도 필요해.
  • 지켜야 할 주소 — 예약된 번호 하나, 피해야 할 충돌 하나, 누가 여기 닿을 수 있냐는 결정 하나.
  • 암묵적 계약 — 이게 제일 비싸. 닿을 수 있는 건 언젠가 반드시 의존 대상이 되고, 두 번째 호출자는 허락을 안 구하고 와.

마지막 비용 때문에 이 거부가 취향이 아니라 규칙으로 적혀 있어. 서비스가 된 배치 도구는 기능을 얻은 게 아냐. 자기가 동의한 적 없는 기대를 가진, 끝을 모르는 미래 호출자 무리를 떠안은 거야.

정직한 반대편

서비스가 나쁘다는 얘기가 아니고, 그런 척하는 강의는 쓸모가 없어. 서비스가 필요한 진짜 방아쇠는 말하기 쉬워. 독립된 클라이언트 여럿이 같은 답을 필요로 할 때. 지연이 중요해서 프로세스 뜨는 시간조차 못 봐줄 때. 상태를 호출자들 사이에서 공유하고 조율해야 할 때. 네 통제 밖의 뭔가가 일을 시작시킬 때. 이 중 하나만 걸려도 그 값은 번 거야. Beacon 은 하나도 안 걸려. 호출자는 정확히 하나고, 분 단위 렌더 앞에서 기동 시간은 의미가 없고, 상태는 디렉터리 하나고, 모든 실행은 사람에서 시작해.

이걸 어디든 가져갈 수 있는 교훈으로 만드는 건 추론의 순서야. "이건 무슨 형태여야 하지?"에서 시작하지 마. "누가, 언제 일을 시작시키지?"에서 시작해. 형태는 그 답에서 떨어져 나오고, 가끔은 서비스가 나와. 실패는 질문을 건너뛰는 거야. 기본 답은 항상 예스고, 비용은 항상 영구적이니까.

Code

실제로 써먹을 수 있는 판정표·text
Does something outside your control initiate the work?
  yes -> service.        (a webhook, another system, a user request)
  no  -> keep going.

Do multiple independent clients need the same answer?
  yes -> service.        (shared state, shared cache, one source of truth)
  no  -> keep going.

Is process startup time unacceptable for the workload?
  yes -> service.        (per-request latency budget in milliseconds)
  no  -> keep going.

Must state be coordinated across concurrent callers?
  yes -> service.        (locking, sequencing, transactions)
  no  -> WORKSHOP.

# Beacon walks this table and falls out the bottom every time:
#   one caller, minutes-long jobs, state is a directory,
#   and every run begins with a person deciding it should.

External links

Exercise

네가 관리하는 시스템에서 돌고 있는 서비스를 전부 세어봐. 하나씩, 지금 어떻게 배포돼 있는지는 안 보고 판정표의 네 질문에 답해봐. 그다음 비교해. 몇 개가 질문이 예스라서 서비스고, 몇 개가 쓰일 당시에 그 형태밖에 없어서 서비스야? 운영 현실이 허락한다면 강등하고 싶은 제일 비싼 놈 하나를 골라서 한 문단 써봐.
Hint
티가 나는 건 유일한 호출자가 너도 같이 소유한 스케줄 작업인 서비스야. 그건 네트워크 인터페이스를 뒤집어쓴 배치 파이프라인이야. 네가 통제하는 일정에 맞춰 클라이언트 하나가, 그냥 함수로 불러도 됐을 호출을 하려고, 가용성의 영구 비용을 통째로 치르고 있는 거지.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.