V2 Reproduction KO - k-p2p-lab/kpl-v3 GitHub Wiki

v2 ์‹œ๋‚˜๋ฆฌ์˜คยท๋„คํŠธ์›Œํฌ ์‹คํ—˜ ์žฌํ˜„ ๋ฒ”์œ„

Wiki home โ€บ ํ•œ๊ตญ์–ด ๋ฌธ์„œ ยท ์˜์–ด ์›๋ฌธ

๋ฌธ์„œ ์•ˆ๋‚ด ยท ์†Œ์Šค ์ €์žฅ์†Œ

๊ฒ€ํ†  ๊ธฐ์ค€์€ kpl-v2์˜ ์‹ค์ œ Controller/Peer ์ฝ”๋“œ์™€ exp/exp-2603_churn-02.sh์ž…๋‹ˆ๋‹ค. ์„ค๋ช… ๋ฌธ์„œ์™€ ์‹คํ–‰ ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅผ ๋•Œ๋Š” ์‹คํ–‰ ์ฝ”๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‚ผ์•˜์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์„ค์ •์œผ๋กœ ์‹คํ—˜์˜ ์ฃผ์š” ์กฐ๊ฑด์„ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ๊ณผ๊ฑฐ ์‹คํ–‰์˜ ํŒจํ‚ท ์ˆœ์„œ๋‚˜ ํ† ํด๋กœ์ง€๊ฐ€ ๋™์ผํ•ด์ง€๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ด ํ˜ธํ™˜์„ฑ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ v3์—์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๊ณตํ†ต ๋ฒ„์ „ ์ด๋ ฅ๊ณผ ์—ฐ๊ตฌ ๋ฐฐ๊ฒฝ์€ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

์ปจํ…Œ์ด๋„ˆ ๊ฒฉ๋ฆฌ์™€ ๋ฐฐ์น˜

์–‘์ชฝ ๋ชจ๋‘ ํ”ผ์–ด ํ•˜๋‚˜๋ฅผ ์ปจํ…Œ์ด๋„ˆ ํ•˜๋‚˜๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. v2๋Š” Swarm Service, v3๋Š” Agent๊ฐ€ ์ƒ์„ฑํ•˜๋Š” Docker ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค. v3 Peer์—๋Š” ํ˜ธ์ŠคํŠธ ํฌํŠธ, ํ˜ธ์ŠคํŠธ ํŒŒ์ผ์‹œ์Šคํ…œ, Docker socket์„ ๊ณต์œ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ Peer์˜ network namespace์—๋งŒ qdisc๋ฅผ ์„ค์น˜ํ•˜๋ฉฐ, ํ•„์š”ํ•œ Peer์—๋งŒ NET_ADMIN์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. CPUยท๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์€ v2์—๋„ ์—†์—ˆ์œผ๋ฉฐ, ํ˜ธ์ŠคํŠธ ๋ถ€ํ•˜๊นŒ์ง€ ๊ฒฉ๋ฆฌ๋œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

v2์˜ parallel join์€ ํ•œ Worker ํ˜ธ์ŠคํŠธ๋ฅผ ๋ฌด์ž‘์œ„ ์„ ํƒํ•œ ๋’ค ServiceCreate ์š”์ฒญ์„ ์ˆœ์ฐจ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. v3์—์„œ ์ด์— ๋Œ€์‘ํ•˜๋Š” ์„ค์ •์€ parallel: true, parallelism: 1, placement: single-agent์ž…๋‹ˆ๋‹ค. v2์˜ sequential join์€ ๋…ธ๋“œ๋งˆ๋‹ค ํ˜ธ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ์„ ํƒํ•˜๋ฏ€๋กœ parallel: false, placement: random์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. agentId๋ฅผ ์ง€์ •ํ•˜๋ฉด ํŠน์ • Agent์— ๊ณ ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ placement: balanced๋Š” ๋ถ€ํ•˜ ๋ถ„์‚ฐ ์ •์ฑ…์ž…๋‹ˆ๋‹ค.

Swarm์€ ์„ ํƒํ•œ ๋…ธ๋“œ๋งˆ๋‹ค Agent ํ•˜๋‚˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ Peer ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ณตํ†ต attachable overlay๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ฆฌ ํ˜ธ์ŠคํŠธ ๊ฐ„ ์ง€์—ฐ ์‹คํ—˜์—๋Š” Swarm ์ ˆ์ฐจ๋กœ Agent ๋…ธ๋“œ๋ฅผ ์ตœ์†Œ ๋‘ ๊ฐœ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค. Agent capacity ๋Œ€๊ธฐ, Docker CLI ๋น„์šฉ, ์‹ค์ œ ๋จธ์‹  ๋ถ€ํ•˜์— ๋”ฐ๋ผ ๋ชฉํ‘œ join rate์™€ ์‹ค์ œ ์‹œ์ž‘ rate๋Š” ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. v2์˜ Swarm ์ž๋™ ๋ณต๊ตฌ์™€ v3์˜ ์ข…๋ฃŒ ์ƒํƒœ ๊ธฐ๋ก๋„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

Swarm ๋‹ค์ค‘ ์„œ๋ฒ„์šฉ ๋ฐฐํฌ ๊ตฌ์„ฑ๊ณผ ํ™•์žฅ์„ฑ ๊ฒ€ํ† ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. Swarm์€ global Agent๋ฅผ ์„œ๋ฒ„๋ณ„๋กœ ๋ฐฐ์น˜ํ•˜๊ณ  Controller๊ฐ€ Peer๋ฅผ ๋ถ„๋ฐฐํ•ฉ๋‹ˆ๋‹ค. Agent task ์žฌ์‹œ์ž‘์€ ๋‹ด๋‹น Peer๋ฅผ ์ •๋ฆฌํ•˜๋ฉฐ, v2์˜ Peer Service ์žฌ์Šค์ผ€์ค„๋ง์„ ๊ทธ๋Œ€๋กœ ์žฌํ˜„ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. Peer ๊ด‘๊ณ  ์ฃผ์†ŒยทAgent๋ณ„ ์ง์ ‘ ์ ‘๊ทผยท์‚ญ์ œ ์™„๋ฃŒ๊นŒ์ง€์˜ capacity ๋ณด์กดยท์ „์ฒด Agent ๋ชจ๋‹ˆํ„ฐ๋ง์„ ๋ฐ˜์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ƒ์„ฑ ๋„์ค‘ ์‹คํ—˜์„ ์ทจ์†Œํ•˜๋”๋ผ๋„ Docker create์˜ ์‘๋‹ต์„ ์ œํ•œ์‹œ๊ฐ„ ๋‚ด ๊ธฐ๋‹ค๋ ค ์ปจํ…Œ์ด๋„ˆ ID๋ฅผ ํ™•๋ณดํ•œ ๋’ค ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. CLI๋งŒ ๋จผ์ € ์ข…๋ฃŒํ•˜์—ฌ daemon์— ๋Šฆ๊ฒŒ ์ƒ์„ฑ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‚จ๊ธฐ๋Š” ๊ฒฝํ•ฉ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. Docker๊ฐ€ ์‚ญ์ œ ์ง„ํ–‰ ์ค‘์ด๋ผ๊ณ  ์‘๋‹ตํ•˜๋ฉด ์‹ค์ œ ์†Œ๋ฉธ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ jobShutdownTimeout์€ 3m์ด๋ฉฐ job ์ข…๋ฃŒ์™€ Peer ์ •๋ฆฌ์— ๊ฐ๊ฐ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. Swarm์€ Controller ์ข…๋ฃŒ ์œ ์˜ˆ๋ฅผ 10m, ๊ฐ Agent ์ข…๋ฃŒ ์œ ์˜ˆ๋ฅผ 4m๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ข…๋ฃŒ ์ ˆ์ฐจ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค. Docker admission ์ž์ฒด์˜ deadline ์ดˆ๊ณผ๋‚˜ daemon ์žฅ์• ๋Š” ์˜ค๋ฅ˜๋กœ ๋ณด๊ณ ํ•˜๋ฉฐ, ์ดํ›„ ์žฌ์‹œ์ž‘ ์‹œ ์†Œ์œ  label๋กœ ์ž”์—ฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋„คํŠธ์›Œํฌ ์กฐ๊ฑด ๋Œ€์‘

v2 ์„ค์ •/๋™์ž‘ v3 ์„ค์ •
eth0 ์ „์ฒด ์†ก์‹ ์— netem ์ ์šฉ network.scope: all (๊ธฐ๋ณธ p2p๋Š” P2P TCP๋งŒ ์ ์šฉ)
delay.distribution์—์„œ ํ”ผ์–ด๋‹น ๊ฐ’ ํ•˜๋‚˜ ์ถ”์ถœ network.delayDistribution
delay.deviation ๋ฐ€๋ฆฌ์ดˆ, ํŒจํ‚ท jitter jitter: 5ms, jitterDistribution: uniform
loss, corrupt lossPercent, corruptPercent
reorder.percentage, reorder.chance reorderPercent, reorderCorrelationPercent
tbf.rate, tbf.burst, tbf.latency tbf.rateMbps, tbf.burstKbit, tbf.latency

v2์˜ chance๋Š” ์‹ค์ œ tc ๋ช…๋ น์—์„œ๋Š” ์žฌ์ •๋ ฌ ์ƒ๊ด€๊ณ„์ˆ˜์ž…๋‹ˆ๋‹ค. rateMbps ๋‹จ๋…์€ netem์˜ ํŒจํ‚ท ์ง๋ ฌํ™” ์ง€์—ฐ์ด๋ฉฐ TBF์™€ ๋™๋“ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. TBF์™€ ์–‘์ˆ˜ rateMbps๋Š” ํ•จ๊ป˜ ์„ค์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. TBF latency๋Š” tc๊ฐ€ ์ง€์›ํ•˜๋Š” 1us~4294967295us ๋ฒ”์œ„์ด๋ฉฐ ์†Œ์ˆ˜ ๋งˆ์ดํฌ๋กœ์ดˆ๋Š” ์˜ฌ๋ฆผํ•ฉ๋‹ˆ๋‹ค.

network:
  scope: all
  delayDistribution:
    model: normal
    mean: 50ms
    sigma: 10ms
    min: 1ms
  jitter: 5ms
  jitterDistribution: uniform
  lossPercent: 1
  reorderPercent: 2
  reorderCorrelationPercent: 25
  tbf:
    rateMbps: 10
    burstKbit: 64
    latency: 100ms

delayDistribution๋Š” Peer seed๋กœ ํ•œ ๋ฒˆ ์ƒ˜ํ”Œ๋งํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ท๋งˆ๋‹ค ๋ฐ”๋€Œ๋Š” jitter์™€ ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค. delay์™€๋Š” ๋ฐฐํƒ€์ ์ด๋ฉฐ, jitter/reorder๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด ์–‘์ˆ˜ min์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. v2๋Š” ์ดˆ ๋‹จ์œ„ ์ƒ˜ํ”Œ์„ ์ •์ˆ˜ ms๋กœ ์ž˜๋ž์ง€๋งŒ v3๋Š” Go duration ์ •๋ฐ€๋„๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. v2์˜ ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ๋‚œ์ˆ˜ ๋ฐ gamma ๊ตฌํ˜„ ์˜ค๋ฅ˜๊นŒ์ง€ ๋ณต์ œํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

scope: all์€ ์ œ์–ด API ์‘๋‹ตยทbootstrap ์กฐํšŒยทtelemetry๋„ ์ง€์—ฐ์‹œํ‚ค๊ฑฐ๋‚˜ ์œ ์‹ค์‹œํ‚ต๋‹ˆ๋‹ค. ํฐ ์†์‹ค๋ฅ ์—์„œ wait-ready๋‚˜ ๋ฐœํ–‰ HTTP ์š”์ฒญ์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋„ ์‹คํ—˜ ์กฐ๊ฑด์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. ์–‘์ชฝ ๋ชจ๋‘ ์†ก์‹  ๋ฐฉํ–ฅ shaping์ž…๋‹ˆ๋‹ค. ๋‘ Peer์— delay๋ฅผ ์„ค์ •ํ•˜๋ฉด ์™•๋ณต ๊ฒฝ๋กœ์—๋Š” ๋‘ ์†ก์‹  ์ง€์—ฐ์ด ๋”ํ•ด์ง‘๋‹ˆ๋‹ค. ์ปค๋„ offload, TCP ์žฌ์ „์†ก, ํ ์ƒํƒœ ๋•Œ๋ฌธ์— application ๋ฉ”์‹œ์ง€ ์†์‹ค๋ฅ ์ด packet loss ์„ค์ •๊ฐ’๊ณผ ๊ฐ™์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ์—ฌยท์ดํƒˆยท๋ฐœํ–‰ ์Šค์ผ€์ค„

์˜๋ฏธ ๋Œ€์‘/์ฃผ์˜์ 
์ˆœ์ฐจ interval v2๋Š” ์™„๋ฃŒ ํ›„ ๋Œ€๊ธฐ. v3๋Š” ์žฅ๊ธฐ churn์—์„œ ์ ‘์ˆ˜ยท์š”์ฒญ ์ง€์—ฐ์ด ๋ˆ„์ ๋˜์ง€ ์•Š๋„๋ก batch ์‹œ์ž‘ ๊ธฐ์ค€ ๋ˆ„์  ์˜ˆ์•ฝ ์‹œ๊ฐ์„ ์‚ฌ์šฉ. ๋Šฆ์–ด์ง„ ์ž‘์—…์€ ๋ˆ„๋ฝ ์—†์ด ์ˆœ์„œ๋Œ€๋กœ ๋”ฐ๋ผ์žก์œผ๋ฉฐ ๋งˆ์ง€๋ง‰ ์ž‘์—… ๋’ค ๋Œ€๊ธฐ๋Š” ์—†์Œ.
parallel join/leave interval ๋ฌด์‹œ
parallel publish ๋ฐœํ–‰์ž๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ ์‹œ์ž‘ ์ง€์—ฐ, interval ์ƒ๋žต ์‹œ 1์ดˆ
publish/leave replicas ํ›„๋ณด ์ˆ˜๋กœ ์ œํ•œ, ์ค‘๋ณต ์„ ํƒ ์—†์Œ
v2 ๊ธฐ๋ณธ await=false YAML์—์„œ๋Š” await: false๋ฅผ ๋ช…์‹œ (v3 ๊ธฐ๋ณธ true)
v2 async for-loop ์„œ๋กœ ๋‹ค๋ฅธ job phase๋กœ ํŽผ์นจ; repeat๋Š” ํ•œ job์˜ ์ˆœ์ฐจ ๋ฐ˜๋ณต
churn ์ค‘ ๋ฐœํ–‰ ๋Œ€์ƒ ์†Œ๋ฉธ onError: continue๋กœ ํ•ด๋‹น ์‹คํŒจ๋งŒ ๊ธฐ๋กํ•˜๊ณ  ๊ณ„์†
๋‹จ์ผ ์‹คํ–‰์˜ ์ •์ƒ ์™„๋ฃŒ ํ›„ ์ „์ฒด Peer ์ •๋ฆฌ ๋งˆ์ง€๋ง‰ stop-all์„ ๋ช…์‹œ. ๋ฐ˜๋ณต ์‹คํ–‰(repetitions > 1)์€ ํšŒ์ฐจ ์‚ฌ์ด์—๋„ ์ž๋™ ์ •๋ฆฌ

onError: continue๋Š” publish/leave์—๋งŒ ์ ์šฉํ•˜๋ฉฐ, ํ›„๋ณด 0๊ฐœ๋„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…๋ณ„ ์‹คํŒจ๋Š” phase-operation-failed ์ด๋ฒคํŠธ์— ๋‚จ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ทจ์†Œ์™€ phase deadline์€ ๊ณ„์† ์ „ํŒŒ๋˜๋ฉฐ, ๊ฐœ๋ณ„ HTTP ์š”์ฒญ timeout์€ ํ•ด๋‹น ์ž‘์—…์˜ ์‹คํŒจ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ fail์€ ๊ธฐ์กด v3์ฒ˜๋Ÿผ ์‹คํŒจ ์‹œ ์‹คํ—˜์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

Docker Peer lifetime์€ v2์˜ ServiceCreate ๋ฐ˜ํ™˜์— ๋Œ€์‘ํ•˜๋Š” Docker create ์„ฑ๊ณต ์‹œ์ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. config copy, ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘, bootstrap์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ lifetime์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ready๋ถ€ํ„ฐ์˜ ์˜จ๋ผ์ธ ์ˆ˜๋ช…์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋…ธ๋“œ metadata์˜ lifetime, lifetimeBasis, containerCreatedAt, containerStartedAt, readyAt, stopRequestedAt, stoppedAt์œผ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์‹œ๊ฐ์€ Agent๊ฐ€ ํ•ด๋‹น ์ƒํƒœ๋ฅผ ๊ด€์ธกํ•œ ์‹œ๊ฐ์ด๋ฉฐ startedAt์€ ์ƒ์„ฑ ์š”์ฒญ ์ˆ˜๋ฝ ์‹œ๊ฐ์ž…๋‹ˆ๋‹ค. ์ข…๋ฃŒ๋Š” ๊ฐ•์ œ ์ดํƒˆ์ด๋ฉฐ, v2 Peer์—๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜์ค€์˜ ์ •์ƒ ์ข…๋ฃŒ ์ ˆ์ฐจ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

examples/v2-churn.yaml์€ ๊ธฐ์กด churn ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ๊ตฌ์กฐ๋ฅผ ์ž‘์€ ๊ทœ๋ชจ๋กœ ์˜ฎ๊ธฐ๊ณ  ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•œ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ์›๋ž˜ 10,000๊ฐœ join ์š”์ฒญ๊ณผ ์ˆ˜๋ฐฑ ๊ฐœ ๋™์‹œ Peer ๊ทœ๋ชจ์˜ ์„ฑ๋Šฅ ์žฌํ˜„ ๊ฒฐ๊ณผ๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐ ์—ฐ๊ฒฐ๊ณผ ๋ฉ”์‹œ์ง€ ํฌ๊ธฐ

Peer๋Š” v2์ฒ˜๋Ÿผ TCP/Noise/Yamux๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Worker๋Š” bootstrap ํ›„๋ณด๋ฅผ seed๋กœ ์„ž๊ณ  ์ฒซ ์—ฐ๊ฒฐ ์„ฑ๊ณต์—์„œ ์ดˆ๊ธฐ ์ ‘์†์„ ๋๋ƒ…๋‹ˆ๋‹ค. bootstrap ์ „์ฒด timeout์€ ๋ชฉ๋ก ์กฐํšŒ์™€ dial์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. PubSub ์‹œ์ž‘ ํ›„ v3๋Š” Controller์˜ ๋™์ผ runยท์ •ํ™•ํ•œ topic discovery registry๋„ 3์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ์กฐํšŒํ•˜์—ฌ transport ์—ฐ๊ฒฐ์„ ๋ณด์ถฉํ•ฉ๋‹ˆ๋‹ค. ํ›„๋ณด ์ˆœ์œ„ยท์—ฐ๊ฒฐ ์˜ˆ์‚ฐยท์‹คํŒจ ์žฌ์‹œ๋„๋Š” internal/peer/discovery.go์— ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฉฐ ์‹ค์ œ mesh๋Š” GossipSub๊ฐ€ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด ์ถ”๊ฐ€ discovery ๊ฒฝ๋กœ๋Š” v2์™€ ๋‹ค๋ฅด๋ฏ€๋กœ DHT/GossipSub ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๊ฐ™๋”๋ผ๋„ ์—ฐ๊ฒฐ ๊ตฌ์กฐ์™€ churn ๋ณต๊ตฌ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

v2์˜ size๋Š” PubSub์— ์ „๋‹ฌ๋˜๋Š” ๋ฌด์ž‘์œ„ ๋ฐ”์ดํŠธ ๊ธธ์ด์ž…๋‹ˆ๋‹ค. v3์—์„œ payloadEncoding: raw๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด payloadSize๊ฐ€ ์ •ํ™•ํžˆ ๊ทธ ๊ธธ์ด์ž…๋‹ˆ๋‹ค. libp2p framing, ์„œ๋ช…, TCP/IP ํ—ค๋”๊นŒ์ง€ ํฌํ•จํ•œ ํŒจํ‚ท ํฌ๊ธฐ๋ฅผ ๋œปํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ envelope๋Š” ์ „ํŒŒ ์ง€์—ฐ ๊ณ„์ธก์„ ์œ„ํ•œ JSON๊ณผ base64 ๋•Œ๋ฌธ์— ๋” ํฝ๋‹ˆ๋‹ค. topic: '*'๋Š” ์„ ํƒํ•œ ๋…ธ๋“œ๊ฐ€ ๊ฐ€์ง„ ๋ชจ๋“  ๋ฐœํ–‰ ๊ฐ€๋Šฅํ•œ topic์— ๊ฐ๊ฐ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค.

raw ๋ฐœํ–‰ยท์ˆ˜์‹ ยท์ค‘๋ณต ์ด๋ฒคํŠธ๋Š” pubsub- ๋’ค์— native PubSub ๋ฉ”์‹œ์ง€ ID๋ฅผ 16์ง„์ˆ˜๋กœ ๋ถ™์—ฌ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ธฐ๋ณธ ID๋Š” origin๊ณผ sequence๋ฅผ ๊ฒฐํ•ฉํ•˜๋ฏ€๋กœ raw ๋ฐ”์ดํŠธ๊ฐ€ ๊ฐ™์€ ๋‘ ๋ฐœํ–‰๋„ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค. ๋‚ด์šฉ ๊ธฐ๋ฐ˜ ๋ฉ”์‹œ์ง€ ID๋ฅผ ๋ช…์‹œํ•˜๋ฉด ๊ฐ™์€ ๋‚ด์šฉ์ด ํ•ฉ์ณ์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฉ”์‹œ์ง€ ID ์„ค์ •์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค. ๋ฉ”์‹œ์ง€์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ๊ฐ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ raw ์ˆ˜์‹ ์—๋Š” ์ง€์—ฐ๊ฐ’์„ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ‰๊ท /P95 ๊ณ„์‚ฐ์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. raw ํŠธ๋ž˜ํ”ฝ์„ ์‚ฌ์šฉํ•˜๋Š” run์€ ์ „์šฉ topic๊ณผ ๋„คํŠธ์›Œํฌ๋กœ ๋ถ„๋ฆฌํ•˜์‹ญ์‹œ์˜ค. envelope์˜ run ID ํ•„ํ„ฐ๋ฅผ raw ๋ฐ”์ดํŠธ์—๋Š” ์ ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. internal/peer/publish.go๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

๊ด€์ธก๊ณผ ๋‚จ์€ ์ฐจ์ด

  • wait-ready๋Š” ์ดˆ๊ธฐํ™”/API ์ค€๋น„๋ฅผ ๋œปํ•˜๋ฉฐ mesh ์ˆ˜๋ ด์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ์•ˆ์ •ํ™” ๋Œ€๊ธฐ๋ฅผ ๋‘ก๋‹ˆ๋‹ค.
  • dashboard ํ† ํด๋กœ์ง€๋Š” ํ˜„์žฌ Peer ์ƒํƒœ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ transport, Kademlia ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”, topic๋ณ„ GossipSub mesh๋ฅผ ๋ณ„๋„๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. TopicPeers๋Š” len(pubsub.ListPeers(topic))์ด๋ฉฐ ๋กœ์ปฌ์—์„œ ์•Œ๊ณ  ์žˆ๋Š” topic peer ์ˆ˜์ž…๋‹ˆ๋‹ค. mesh ์ฐจ์ˆ˜๋‚˜ ์›๊ฒฉ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ๋… ์„ธ์…˜์˜ ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ ๋ถ„์„์—๋Š” ์ €์žฅ๋œ graft/prune, add_peer/remove_peer, join/leave ์ด๋ฒคํŠธ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ณ  telemetry ๋ˆ„๋ฝ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๊ฒฐ๊ณผ์˜ observations.jsonl์—๋Š” ๊ทธ๋ฃน๋ณ„ ์š”์•ฝ๊ณผ ํ‘œ๋ณธ ๋…ธ๋“œยท๊ฐ„์„ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ ํ”„๋กœํ† ์ฝœ ๊ทธ๋ž˜ํ”„๋Š” ์—ฌ๋Ÿฌ ํ† ํ”ฝ์˜ ๊ด€๊ณ„๋ฅผ ํ•ฉ์น˜๋ฉฐ ๊ฐœ๋ณ„ ์‹œ์ ์˜ ๋ชจ๋“  routingยทmesh ์ „์ด๋ฅผ ๋ณด์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ €์žฅ ํ˜•์‹์€ ํ† ํด๋กœ์ง€๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.
  • v3์˜ ํƒ€์ž…๋ณ„ RPC ์ˆ˜๋Š” v2์˜ physical IHAVE/IWANT counter, ๋ฉ”์‹œ์ง€ ID ์ฐธ์กฐ ์ˆ˜๋Š” logical counter์— ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค. v3๋Š” protobuf entry ์ˆ˜, IDONTWANT, ๋กœ์ปฌ ์†ก์‹  ์ „ drop, PRUNE peer-exchange record, ํ˜ผํ•ฉ RPC ์•ˆ์˜ ๋ชจ๋“  ํƒ€์ž…๋„ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. v2๋Š” ์ด ๊ฒฝ์šฐ๋“ค์„ ๋ˆ„๋ฝํ•˜๊ณ  IHAVE topic ์ •๋ณด๋„ ๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ๋‹จ์ˆœ graft/prune ์ด๋ฒคํŠธ๋Š” ๋กœ์ปฌ mesh ์ „์ด์ด๋ฏ€๋กœ wire traffic์€ ๋ณ„๋„ send_*, recv_*, drop_* ์ œ์–ด ์ด๋ฒคํŠธ์™€ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค. ์ œ์–ด ํŠธ๋ž˜ํ”ฝ ์ •์˜๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.
  • interval/lifetime/base delay ์ƒ˜ํ”Œ์€ seed๋กœ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ run ID๋ฅผ ํฌํ•จํ•œ Peer ID, ๋„คํŠธ์›Œํฌ ํƒ€์ด๋ฐ, ์ปค๋„ ํŒจํ‚ท ๋‚œ์ˆ˜๋Š” ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ metadata์— seed, networkRequested, ์‹ค์ œ network๋ฅผ ๋‚จ๊ธฐ๋ฉฐ Agent์˜ Peer config ํŒŒ์ผ์—๋„ ์‹คํšจ ์„ค์ •์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ถ”๊ฐ€ ์—ฐ๊ตฌ ๋ถ„์„์€ v2 ๊ทธ๋ฆผ ๊ณ„์—ด์„ ๋ณ„๋„ ์ •์˜๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์ธ ์„ธ์…˜ ์ง€ํ‘œ์™€ ๋ชจ์ง‘๋‹จยท๊ธฐ๊ฐ„ยท์ง‘๊ณ„๊ฐ€ ๋‹ค๋ฅด๊ณ  Eager/Lazy๋Š” GRAFTยทIHAVEยทIWANTยท๋ฉ”์‹œ์ง€ ID์˜ ์ถ”์ •์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฐœ์‹  ํ ์›์ธ๊ณผ ๋ˆ„๋ฝ๋œ ๊ณผ๊ฑฐ ๊ฐ„์„ ์„ ๋งŒ๋“ค์–ด ์ˆ˜์ง‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€์› ๊ทธ๋ฆผ๊ณผ ๊ฐ€์ ธ์˜ค๊ธฐ ํ˜•์‹์€ v2 ๋ถ„์„ ๋Œ€์‘์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.
  • ๊ธฐ๋ณธ ์—ฐ๊ฒฐ ์ƒํ•œ 55์™€ ์ฃผ์š” worker DHT/GossipSub ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ v2 custom PubSub fork ๊ฒฝ๋กœ์˜ ์†Œ์Šค๊ฐ€ ์ œ๊ณต๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์—†์–ด fork ๋‚ด๋ถ€๊นŒ์ง€ ๋™๋“ฑ์„ฑ์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. v3๋Š” ๊ณต์‹ v0.13.1์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ์ˆ˜ ๊ด€์ธก๊ณผ ๋ณ„๋„๋กœ ํ™•์ธํ•œ ์ฐธ์กฐ ๋ฆฌ๋น„์ „์˜ ์„ ํƒ์  HopWave ํŒจ์น˜๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ก๋˜์ง€ ์•Š์€ v2 fork ๋ฆฌ๋น„์ „๊ณผ์˜ ์ „์ฒด ๋™๋“ฑ์„ฑ์„ ์ž…์ฆํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
  • dashboard ๋ฉ”์‹œ์ง€ ์ง€ํ‘œ๋Š” ์ตœ๊ทผ ์ด๋ฒคํŠธ ๋ฒ„ํผ์™€ ๋…๋ฆฝ์ ์œผ๋กœ ๋ˆ„์ ๋˜์ง€๋งŒ Controller ์žฌ์‹œ์ž‘ ์‹œ ์ดˆ๊ธฐํ™”๋˜๋ฉฐ telemetry ๋ˆ„๋ฝ์˜ ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ €์žฅ ๊ฒฐ๊ณผ ๋ถ„์„๊ณผ ZIP ์ง€ํ‘œ๋Š” ์žฌ์‹œ์ž‘ ํ›„์—๋„ ๊ธฐ๋ก๋œ ์‹คํ–‰์„ ์žฌ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. churn ๋Œ€์ƒ ์ง‘ํ•ฉ ์ •์˜์™€ v2 ์ „์ฒด ๋ถ„์„ ๋Œ€์กฐํ‘œ๋ฅผ ํ•จ๊ป˜ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ์‹œ๋‚˜๋ฆฌ์˜ค ์„ค์ •์ด ๋Œ€์‘ํ•˜๋”๋ผ๋„ ์ˆ˜์น˜๋‚˜ ์‹œ๊ฐํ™” ๋™๋“ฑ์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฒ€ํ† ํ•œ ํ•ต์‹ฌ v2 ํŒŒ์ผ: kpl-controller/internal/handler/event.go, internal/docker/docker.go, internal/distribution/distribution.go, cmd/main.go, kpl-peer-app/internal/host/{host,tc}.go, internal/dht/dht.go, internal/api/publish.go.

๊ณผ๊ฑฐ ๊ฒ€์ฆ ๊ธฐ๋ก

์•„๋ž˜ ๋ณด์กด๋œ ๊ธฐ๋ก์€ 2026-09-04 Docker Desktop Linux ๊ฒ€์ฆ์„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์›๋ณธ ์‹คํ–‰ ์•„์นด์ด๋ธŒ๋Š” kpl-v3 ์†Œ์Šค ์ €์žฅ์†Œ์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ์ˆ˜์น˜๋Š” ํ˜„์žฌ checkout์˜ ๊ฒ€์ฆ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹Œ ๊ณผ๊ฑฐ ๊ด€์ธก์œผ๋กœ ๋ณด์‹ญ์‹œ์˜ค. ํ˜„์žฌ ํšŒ๊ท€ ๋ช…๋ น๊ณผ ํŒจํ‚ค์ง€ ํ…Œ์ŠคํŠธยท์ปค๋„ ํ†ตํ•ฉ ๊ฒ€์ฆ์˜ ๊ตฌ๋ถ„์€ ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

  • ์ „์ฒด go test -buildvcs=false ./... -timeout 60s ๋ฐ ๋ชจ๋“  ์˜ˆ์ œ YAML ๊ฒ€์ฆ ํ†ต๊ณผ.
  • ํ†ตํ•ฉ run run-20260904T021417Z-581b: ์ปจํ…Œ์ด๋„ˆ 4๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ network namespace, host mount/port binding ์—†์Œ ํ™•์ธ.
  • P2P ์ „์šฉ netemโ†’TBF์™€ ์ „์ฒด ์†ก์‹  netemโ†’TBF ๋ชจ๋‘ ์‹ค์ œ ์ปค๋„์— ์„ค์น˜. TBF 10Mbit, burst 8KB(64kbit), latency 100ms ํ™•์ธ.
  • ๋™์ผ worker ํ”„๋กœํŒŒ์ผ์˜ ํ”ผ์–ด๋ณ„ ๊ธฐ๋ณธ ์ง€์—ฐ์€ 57.008524ms, 50.467284ms, 47.92387ms๋กœ ๊ฐ๊ฐ ์ถ”์ถœ. ์‹ค์ œ qdisc์—์„œ loss 1%, reorder 2%, correlation 25% ๋ฐ packet drop ์นด์šดํ„ฐ ํ™•์ธ.
  • Worker 3๊ฐœ์—์„œ topic ๋‘ ๊ฐœ์— ์ด 6๊ฐœ raw ๋ฉ”์‹œ์ง€ ๋ฐœํ–‰. ๋ชจ๋“  PubSub data๋Š” ์ •ํ™•ํžˆ 32๋ฐ”์ดํŠธ, ์ž๊ธฐ ์ˆ˜์‹ ์„ ํฌํ•จํ•œ 24๊ฐœ ์ˆ˜์‹  ์ด๋ฒคํŠธ์™€ ๋„๋‹ฌ๋ฅ  1 ํ™•์ธ. raw ์ง€์—ฐ์€ ์ „๋ถ€ ๋ฏธ์ธก์ •์œผ๋กœ ๊ธฐ๋ก.
  • ์ตœ์ข… churn run run-20260904T022448Z-0f9d: ์•ฝ 86์ดˆ ๋™์•ˆ 16๊ฐœ Peer ์ฐธ์—ฌ, ๋ฐœํ–‰ 3๊ฑดยท์ˆ˜์‹  8๊ฑด. ์„ ํƒ๋œ Peer์˜ ์ดํƒˆ๋กœ ๋ฐœํ–‰ 1๊ฑด์ด ์‹คํŒจํ–ˆ์ง€๋งŒ phase-operation-failed๋กœ ๊ธฐ๋กํ•˜๊ณ  ๊ณ„์† ์ง„ํ–‰ํ•˜์—ฌ ์ •์ƒ ์™„๋ฃŒ. ๋ชจ๋“  Peer stopped ๋ฐ ์ž”์—ฌ ๊ด€๋ฆฌ ์ปจํ…Œ์ด๋„ˆ 0๊ฐœ ํ™•์ธ.

์ด ๊ฒ€์ฆ์€ ์„ค์ • ์ ์šฉ๊ณผ ์ž‘์€ ๊ทœ๋ชจ์˜ ์‹ค์ œ ํ†ต์‹ ์„ ํ™•์ธํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. TBF ์ตœ๋Œ€ ์ฒ˜๋ฆฌ๋Ÿ‰, ๋‹ค์ค‘ ๋ฌผ๋ฆฌ ํ˜ธ์ŠคํŠธ overlay, ์ˆ˜๋ฐฑยท์ˆ˜์ฒœ Peer์˜ churn ๋ถ€ํ•˜ ์„ฑ๋Šฅ๊นŒ์ง€ ์ธก์ •ํ•œ ๊ฒฐ๊ณผ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.