Churn Publish Example KO - k-p2p-lab/kpl-v3 GitHub Wiki

Swarm์—์„œ Worker Churn ์ค‘ ๋ฐ˜๋ณต ๋ฐœํ–‰

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

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

examples/swarm-churn-publish.yaml์€ worker๊ฐ€ ๊ณ„์† ๋“ค์–ด์˜ค๊ณ  ๋‚˜๊ฐ€๋Š” ๋™์•ˆ ํ˜„์žฌ ์‚ด์•„ ์žˆ๋Š” worker๋ฅผ ๋ฌด์ž‘์œ„๋กœ ๊ณจ๋ผ ๋ฐ˜๋ณต ๋ฐœํ–‰ํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ์ž‘์€ Swarm smoke ์‹คํ—˜์— ์ง€์†์ ์ธ churn๊ณผ ๋ฐ˜๋ณต ๊ด€์ธก์„ ๋”ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ธก ์šฉ๋Ÿ‰์„ ๋ณด์žฅํ•˜๊ฑฐ๋‚˜ v2 ์‹คํ—˜์„ ๊ทธ๋Œ€๋กœ ์žฌ์ƒํ•˜๋Š” ๊ตฌ์„ฑ์ด ์•„๋‹Œ ์‹œ์ž‘์šฉ ์„ค์ •์ž…๋‹ˆ๋‹ค.

์ค€๋น„์™€ ์‹คํ–‰

๋จผ์ € Swarm ๋ฐฐํฌ ์ ˆ์ฐจ๋ฅผ ์™„๋ฃŒํ•˜์‹ญ์‹œ์˜ค. online Agent ๋‘ ๊ฐœ ์ด์ƒ๊ณผ ์ „์ฒด ์—ฌ์œ  ์Šฌ๋กฏ 40๊ฐœ ์ด์ƒ์œผ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‹คํ—˜์ด ์—†๋Š” capacity 20์˜ Agent ๋‘ ๊ฐœ๊ฐ€ ํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค. Agent status์—์„œ online ํ–‰๋งŒ ์„ธ๊ณ  Peers์˜ ์ ์œ ๋Ÿ‰ / ์šฉ๋Ÿ‰์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ์š”์•ฝ์˜ Available slots์—๋Š” offline Agent๋„ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๊ต๊ฐ€ ์‰ฝ๋„๋ก ๋‹ค๋ฅธ ์‹คํ—˜์€ ์ข…๋ฃŒํ•ด ๋‘์‹ญ์‹œ์˜ค.

๋ฐฐํฌํ•  ๋•Œ์™€ ๊ฐ™์€ ์‚ฌ์šฉ์žยทDocker context๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋ช…๋ น์€ sudo๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋ฐฐํฌ ๊ณ„์ •์— ์ด๋ฏธ Docker ๊ถŒํ•œ์ด ์žˆ๋‹ค๋ฉด ์ผ๊ด€๋˜๊ฒŒ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค.

sudo sh scripts/swarm.sh status
sudo sh scripts/swarm.sh access
sudo sh scripts/swarm.sh credentials
sudo sh scripts/swarm.sh scenario examples/swarm-churn-publish.yaml

access์˜ Controller URL์„ ์—ฌ์‹ญ์‹œ์˜ค. Run experiment์—์„œ YAML scenario ์ „์ฒด๋ฅผ ์ถœ๋ ฅ๋œ ๋‚ด์šฉ์œผ๋กœ ๊ต์ฒดํ•˜๊ณ , ๋Œ€์‹œ๋ณด๋“œ์— ๋กœ๊ทธ์ธํ•œ ์ƒํƒœ์—์„œ Run์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. scenario๋Š” YAML๋งŒ ์ถœ๋ ฅํ•˜๋ฉฐ ์›น ๋™์ž‘์ด ์‹คํ—˜์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์›น ํผ์˜ ๊ธฐ๋ณธ๊ฐ’๊ณผ helper์˜ ๊ธฐ๋ณธ scenario ์ถœ๋ ฅ์€ ๋‹ค๋ฅธ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

์‹คํ–‰ ์ฐฝ Run ์˜† Runs๋ฅผ 1~100์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์ „์ฒด ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ˆœ์ฐจ ๋ฐ˜๋ณตํ•˜๊ณ  ํšŒ์ฐจ๋ณ„ ๊ฒฐ๊ณผ๋ฅผ ๋‚จ๊น๋‹ˆ๋‹ค. Stop batch ๋˜๋Š” ํšŒ์ฐจ ์‹คํŒจ๋Š” ๋‚จ์€ ๋ฐ˜๋ณต์„ ์ทจ์†Œํ•˜๋ฉฐ ๋ช…์‹œ๋œ seed๋Š” ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต ์‹คํ–‰๊ณผ ์ง€ํ‘œ ์ •์˜๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

worker๋Š” Linux NET_ADMIN๊ณผ ํ˜ธ์ŠคํŠธ ์ปค๋„์˜ netem ์ง€์›์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ Peer๋Š” ์‹œ์ž‘ ์‹œ ์ตœ๋Œ€ 5์ดˆ ๋™์•ˆ Controller health ํ‘œ๋ณธ์„ ์ตœ๋Œ€ 7๊ฐœ ์ˆ˜์ง‘ํ•˜๋ฉฐ ๋ชจ๋‘ ์‹คํŒจํ•ด๋„ Ready๊นŒ์ง€ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋™๊ธฐํ™” Peer๋Š” 5์ดˆ๋งˆ๋‹ค ๋‹ค์‹œ ์‹œ๋„ํ•˜๊ณ  ๋™๊ธฐํ™” Peer๋Š” 30์ดˆ๋งˆ๋‹ค ๊ฐฑ์‹ ํ•˜๋ฉฐ, ๋งˆ์ง€๋ง‰ ์„ฑ๊ณต ํ‘œ๋ณธ์€ ๊ฐฑ์‹  ์—†์ด 2๋ถ„์ด ์ง€๋‚˜๋ฉด ์‹ ๋ขฐ ์ƒํƒœ๋ฅผ ์žƒ์Šต๋‹ˆ๋‹ค. ์žฅ์‹œ๊ฐ„ ์‹คํ–‰ ์ค‘์—๋Š” chrony/NTP๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ์ œ์˜ ๋„คํŠธ์›Œํฌ ์„ค์ •์€ ์†ก์‹  P2P TCP ํŠธ๋ž˜ํ”ฝ์— ์ ์šฉํ•˜๋ฉฐ ์ œ์–ดยท์‹œ๊ณ„ ์ธก์ •ยทdiscoveryยทtelemetry HTTP๋Š” ํ•ด๋‹น ๋ฒ”์œ„์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ํ๋ฆ„

๋‹จ๊ณ„ ๋™์ž‘
Bootstrap ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•  boot Peer ๋‘ ๊ฐœ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  readiness๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. DHT bootstrap๋งŒ ์ œ๊ณตํ•˜๋ฉฐ GossipSub๋‚˜ ๊ณ ์ • ๋ฐœํ–‰์ž๋กœ ์ฐธ์—ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
Churn background job worker-churn์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ตœ๋Œ€ 10,000๋ฒˆ์˜ worker join์„ ๊ฐ€์šฉ Agent์— balanced๋กœ ์ˆœ์ฐจ ๋ฐฐ์น˜ํ•˜๋ฉฐ ๊ฐ„๊ฒฉ์€ ํ‰๊ท  4์ดˆ์˜ ์ง€์ˆ˜๋ถ„ํฌ์ž…๋‹ˆ๋‹ค.
Worker ์ˆ˜๋ช… Pareto xm: 60s, alpha: 2.5๋ฅผ ์‚ฌ์šฉํ•ด ์ด๋ก  ํ‰๊ท ์ˆ˜๋ช…์ด 100์ดˆ์ž…๋‹ˆ๋‹ค. Docker ์ƒ์„ฑ ์Šน์ธ ์‹œ์ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ startup ์‹œ๊ฐ„๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋งŒ๋ฃŒ๋Š” ์ œ๊ฑฐ ์š”์ฒญ์ด๋ฉฐ ์‹ค์ œ ์ •๋ฆฌ๋Š” ์ดํ›„ ์™„๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Warm-up churn์„ ๊ณ„์†ํ•˜๋ฉด์„œ 3๋ถ„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
๋ฐœํ–‰ ์ˆœ์ฐจ์ ์œผ๋กœ 30 round๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋งค round๋งˆ๋‹ค ์กฐ๊ฑด์— ๋งž๋Š” worker ์ตœ๋Œ€ 10๊ฐœ๋ฅผ ์ค‘๋ณต ์—†์ด ๋ฌด์ž‘์œ„ ์„ ํƒํ•˜๊ณ  ํ‰๊ท  1์ดˆ์˜ ์ง€์ˆ˜๋ถ„ํฌ ๊ฐ„๊ฒฉ์œผ๋กœ ์ˆœ์ฐจ ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค.
Round ์‚ฌ์ด ๊ฐ round ์‚ฌ์ด์— 10์ดˆ์”ฉ, ์ด 29๋ฒˆ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ํ›„๋ณด๊ฐ€ ์—†์–ด๋„ ์ด ๋ช…์‹œ์  ๋Œ€๊ธฐ ๋•๋ถ„์— ๋ชจ๋“  round๊ฐ€ ์ฆ‰์‹œ ์†Œ์ง„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ˆ˜์ง‘๊ณผ ์ •๋ฆฌ ๋งˆ์ง€๋ง‰ round ๋’ค์—๋„ churn์„ ์œ ์ง€ํ•˜๋ฉฐ 30์ดˆ ๋” ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ์ด์–ด stop-all์ด ๋‚จ์€ join job์„ ์ทจ์†Œํ•˜๊ณ  Peer๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ด๋ก ์  ์ •์ƒ ์ƒํƒœ์˜ worker ์ˆ˜๋Š” 100s / 4s = 25์ด๋ฉฐ boot ๋‘ ๊ฐœ๊ฐ€ ๋ณ„๋„์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ๋Œ€๊ฐ’์ด๊ณ  ์ƒํ•œ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ˆ˜๋ช…์€ ๋ณ€๋™ํ•˜๊ณ  Docker ์ƒ์„ฑยท์‹œ์ž‘์— ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋ฉฐ ๋ฐฐ์น˜ ๊ฐ€๋Šฅํ•œ Agent๊ฐ€ ๋ชจ๋‘ ๊ฐ€๋“ ์ฐจ๋ฉด join ์ ‘์ˆ˜๊ฐ€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— ์‹ค์ œ ready ์ˆ˜์™€ ๋„์ฐฉ๋ฅ ์€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. 40์Šฌ๋กฏ ๊ถŒ์žฅ์€ ์—ฌ์œ ๋ฅผ ๋‘” ์‹œ์ž‘์ ์ผ ๋ฟ ํŠน์ • ์„œ๋ฒ„๊ฐ€ ์ด ๋ถ€ํ•˜๋ฅผ ๊ฐ๋‹นํ•œ๋‹ค๋Š” ์‹ค์ธก ๊ทผ๊ฑฐ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

count: 10000์€ ์ด join ์˜ˆ์‚ฐ์ด๋ฉฐ ๋™์‹œ worker 10,000๊ฐœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ณดํ†ต ์ด ์˜ˆ์‚ฐ์„ ๋‹ค ์“ฐ๊ธฐ ์ „์— ๋งˆ์ง€๋ง‰ stop-all์ด producer๋ฅผ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—๋Š” ๊ฐœ๋ณ„ worker์˜ ๋ช…์‹œ์  leave phase๊ฐ€ ์—†๊ณ  ์ƒ˜ํ”Œ๋งํ•œ ์ˆ˜๋ช…์ด ํ‡ด์žฅ์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

readiness barrier๋Š” ์•ˆ์ •์ ์ธ boot ๊ทธ๋ฃน์—๋งŒ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์† ์ปค์ง€๋Š” churn ๊ทธ๋ฃน์— wait-ready๋ฅผ ์ ์šฉํ•˜๋ฉด ํ˜„์žฌ generation์—์„œ ์ด๋ฏธ ์ข…๋ฃŒ๋œ ๊ตฌ์„ฑ์›๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. 3๋ถ„ warm-up์€ ์ด ๋ถ€์ ์ ˆํ•œ barrier๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€๊ธฐ์ด๋ฉฐ ํŠน์ • worker ์ˆ˜๋‚˜ GossipSub mesh ์ˆ˜๋ ด์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. worker์˜ mesh ์„ค์ •์€ d: 9, dLow: 7, dHigh: 11์ž…๋‹ˆ๋‹ค.

๋‚ด์žฅ boot Peer๋Š” PubSub๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ DHT bootstrap๋งŒ์œผ๋กœ worker๊ฐ€ GossipSub overlay์— ์—ฐ๊ฒฐ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. Worker๊ฐ€ PubSub๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ๋™์ผ runยท์ •ํ™•ํ•œ topic์˜ Controller discovery registry๋ฅผ ์ฆ‰์‹œ ์กฐํšŒํ•˜๊ณ  ์ดํ›„ 3์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ๋‹ค์Œ round๋ฅผ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค. internal/peer/discovery.go๋Š” subscriber๋ฅผ ์šฐ์„ ํ•˜๋ฉด์„œ rendezvous hash๋กœ ready ํ›„๋ณด์˜ ์ˆœ์œ„๋ฅผ ์ •ํ•ฉ๋‹ˆ๋‹ค. dial ์˜ˆ์‚ฐ์€ DHigh์—์„œ ํ˜„์žฌ topic peer ์ˆ˜๋ฅผ ๋บ€ ๋ถ€์กฑ๋ถ„์ด๋ฉฐ transport ์—ฐ๊ฒฐ ์ƒํ•œ์œผ๋กœ ํ•œ ๋ฒˆ ๋” ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. dial ์‹คํŒจ ์‹œ ๋‹ค์Œ ์ˆœ์œ„ ํ›„๋ณด๋ฅผ ์‹œ๋„ํ•˜๊ณ  ์‹คํŒจ ํ›„๋ณด์—๋Š” 15์ดˆ ์žฌ์‹œ๋„ ์œ ์˜ˆ๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋А๋ฆฐ round๋Š” ๋‹ค์Œ ์กฐํšŒ๋ฅผ ๋Šฆ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ GRAFT mesh๋Š” ๊ณ„์† GossipSub๊ฐ€ ์„ ํƒํ•˜๋ฏ€๋กœ registry ํ›„๋ณด๋‚˜ transport ์—ฐ๊ฒฐ์ด ๊ณง mesh ๊ตฌ์„ฑ์›์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

10๊ฐœ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ์„ ํƒํ•œ round์—๋Š” ํ‰๊ท  ํ•ฉ๊ณ„ 9์ดˆ์ธ ๊ฐ„๊ฒฉ ์•„ํ™‰ ๊ฐœ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ฒซ ์š”์ฒญ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์š”์ฒญ์˜ ์˜ˆ์•ฝ ์‹œ๊ฐ๊นŒ์ง€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์š”์ฒญ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์€ ์ด ๊ฐ„๊ฒฉ ์•ˆ์— ํฌํ•จ๋˜๊ณ , ์ดˆ๊ณผ ์ง€์—ฐ๊ณผ ๋งˆ์ง€๋ง‰ ์š”์ฒญ์˜ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด round๋ฅผ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋Œ€๊ธฐ ์Šค์ผ€์ค„์€ 180 + 30ร—9 + 29ร—10 + 30 = 770์ดˆ, ์ฆ‰ ์•ฝ 12๋ถ„ 50์ดˆ์ด๋ฉฐ bootstrapยทAPIยท์ •๋ฆฌ ์‹œ๊ฐ„์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๊ณ ์ • ์ข…๋ฃŒ ์‹œ๊ฐ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ›„๋ณด๊ฐ€ ์ ๊ฑฐ๋‚˜ ์—†๋Š” round๋Š” ์งง์•„์ง€๊ณ  ๋А๋ฆฐ ์š”์ฒญ์€ ๊ธธ์–ด์ง‘๋‹ˆ๋‹ค.

๋ฐœํ–‰ ๋Œ€์ƒ๊ณผ ์ธก์ • ์˜๋ฏธ

๊ฐ round ์‹œ์ž‘ ์‹œ Controller๋Š” worker ๊ทธ๋ฃน์—์„œ Agent๊ฐ€ online์ด๊ณ , ์ƒํƒœ๊ฐ€ ready์ด๋ฉฐ, ๋ฐœํ–‰์ด ๊ฐ€๋Šฅํ•œ full worker ์ค‘ kpl/swarm-churn์— ์ฐธ์—ฌํ•œ ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ์ด ์ง‘ํ•ฉ์„ shuffleํ•˜์—ฌ ์ตœ๋Œ€ 10๊ฐœ๋ฅผ ์ค‘๋ณต ์—†์ด ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ๋…ธ๋“œ๊ฐ€ ๋‹ค๋ฅธ round์—์„œ ๋‹ค์‹œ ์„ ํƒ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‚˜์ค‘์— ๋“ค์–ด์˜จ worker๋„ ์ดํ›„ round์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ ํƒํ•œ worker๊ฐ€ ์ž๊ธฐ ์ฐจ๋ก€ ์ „์— ์ˆ˜๋ช…์„ ๋‹คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. onError: continue๋Š” ๊ฐœ๋ณ„ ์‹คํŒจ๋ฅผ phase-operation-failed๋กœ ๊ธฐ๋กํ•œ ๋’ค ๊ณ„์† ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ›„๋ณด๊ฐ€ ์—†์œผ๋ฉด ๊ทธ round๋Š” no-op์ž…๋‹ˆ๋‹ค. ์ทจ์†Œยท์‹œ๋‚˜๋ฆฌ์˜ค deadlineยท์ €์žฅ ์˜ค๋ฅ˜ ๋“ฑ ์น˜๋ช…์ ์ธ ์‹คํŒจ๋Š” ์—ฌ์ „ํžˆ ์‹คํ–‰์„ ๋๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€์น˜๋Š” ์„ ํƒ๋œ ๋ฐœํ–‰ ์ž‘์—… 300๊ฐœ์ด๋ฉฐ ์„ฑ๊ณต ๋ฉ”์‹œ์ง€ 300๊ฐœ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ ๋ฐœํ–‰์€ payloadSize: 32, payloadEncoding: envelope, deliveryWindow: 10s, topic kpl/swarm-churn์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 32๋ฐ”์ดํŠธ๋Š” ๋ฌด์ž‘์œ„ payload์˜ ๊ธธ์ด์ž…๋‹ˆ๋‹ค. envelope๊ฐ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฏ€๋กœ PubSub ๋ฐ์ดํ„ฐ์™€ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์€ 32๋ฐ”์ดํŠธ๋ณด๋‹ค ํฝ๋‹ˆ๋‹ค. envelope ๋•๋ถ„์— ์ „ํŒŒ ์ง€์—ฐ์„ ์ธก์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

worker network๋Š” scope: p2p, ์ง€์—ฐ 25ms, jitter 2ms, ์„ค์ • packet loss 0.5%์ž…๋‹ˆ๋‹ค. boot์—๋Š” ์ถ”๊ฐ€ ๋„คํŠธ์›Œํฌ ์ œ์•ฝ์ด ์—†์Šต๋‹ˆ๋‹ค. packet loss๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฏธ๋„๋‹ฌ๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. TCP๊ฐ€ ์žฌ์ „์†กํ•  ์ˆ˜ ์žˆ๊ณ  ๋ฉ”์‹œ์ง€ ํ•˜๋‚˜๊ฐ€ ์—ฌ๋Ÿฌ subscriber์—๊ฒŒ ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์ˆ˜์‹  ์ด๋ฒคํŠธ์—๋Š” ๋ฐœํ–‰์ž ๋กœ์ปฌ ์ˆ˜์‹ ๋„ ํฌํ•จ๋˜์ง€๋งŒ ์„ธ์…˜ ๊ธฐ๊ฐ„ ๋„๋‹ฌ๋ฅ ์—์„œ๋Š” ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

๊ด€์ธก๊ณผ ๊ฒฐ๊ณผ ์ €์žฅ

๋Œ€์‹œ๋ณด๋“œ์—์„œ๋Š” ready Peer ์ˆ˜, Agent ์ ์œ ๋Ÿ‰, ์‹คํ—˜ยทjob ์ƒํƒœ์™€ ์ด๋ฒคํŠธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Grafana์˜ KP2PLab Experiment Analysis์—์„œ Run์— ์‹คํ–‰ํ•œ swarm-churn-random-publish๋ฅผ ์„ ํƒํ•˜๊ณ  Agent, Topic์œผ๋กœ ํ•„ํ„ฐ๋งํ•˜์‹ญ์‹œ์˜ค. ์ข…๋ฃŒ ํ›„์—๋Š” ์‹œ๊ฐ„ ๋ฒ”์œ„๋ฅผ ์‹คํ—˜ ๊ตฌ๊ฐ„์œผ๋กœ ๋งž์ถฅ๋‹ˆ๋‹ค.

๊ด€์ธก ํ•ญ๋ชฉ ๋ฐ์ดํ„ฐ
๋ณ€ํ™”ํ•˜๋Š” ๋…ธ๋“œ ์ˆ˜์™€ ์ ์œ  ์šฉ๋Ÿ‰ ์‹ค์‹œ๊ฐ„ node inventory, kpl_nodes, kpl_agent_active_nodes
๋ฐœํ–‰ยท์ˆ˜์‹ ยท์ค‘๋ณต ์ด๋ฒคํŠธ ์ˆ˜ kpl_events_total. mesh ๋ณ€ํ™”๋Š” graft/prune ์ด๋ฒคํŠธ๋กœ ๊ด€์ธก
์•ˆ์ • ๋Œ€์ƒ ์กฐ๊ฑด๋ถ€ ๋„๋‹ฌ๋ฅ ยทํ™•์ธ๋œ ๋ฐœํ–‰ ์‹œ์  ๋Œ€์ƒ ๋„๋‹ฌ๋ฅ ยทcoverage ๋ฒ”์œ„ kpl_window_delivery_ratio, kpl_window_initial_delivery_ratio, kpl_window_stable_coverage, kpl_window_stable_coverage_upper_bound. Run ํ•„ํ„ฐ๋งŒ ์ ์šฉ
Pending๊ณผ ๊ด€์ธก ๋ถˆ๋ช… kpl_window_pending_publications, kpl_window_unknown_pairs, kpl_window_publication_availability_unknown_pairs, kpl_window_continuity_unknown_pairs, kpl_window_measurement_incomplete
์•ˆ์ • ๋Œ€์ƒ์˜ ์›๊ฒฉ ์„ฑ๊ณต ์ˆ˜์‹ ๋‹น ๊ด€์ธก ์ถ”๊ฐ€ ๋ณต์‚ฌ๋ณธ kpl_window_duplicates_per_reached_pair. Run ํ•„ํ„ฐ๋งŒ ์ ์šฉ
Envelope ์ง€์—ฐ๊ณผ PubSub ๋ฐ์ดํ„ฐ ์–‘ kpl_window_propagation_latency_seconds, kpl_message_bytes_total
์„ค์ •ํ•œ ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด kpl_network_configured_*. ์‹ค์ œ ์†์‹ค๋ฅ ์ด๋‚˜ RTT๊ฐ€ ์•„๋‹Œ ์„ค์ •๊ฐ’
์‹คํŒจ ์š”์ฒญ๊ณผ ๋ณด๊ณ ๋œ telemetry drop kpl_operation_failures_total, kpl_telemetry_dropped_events_total

์ด ์˜ˆ์ œ์˜ session-window-v1 ๋ฐœํ–‰์€ ์‹ค์ œ ๋ฐœํ–‰ ์‹œ๊ฐ๊ณผ ์„ค์ •๋œ 10์ดˆ ๋งˆ๊ฐ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. measurement_start๋Š” ๊ตฌ๋… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ธ์…˜์„ ๊ธฐ๋กํ•˜๊ณ  ๋™์ผ ์„ธ์…˜์˜ 2์ดˆ ์ฃผ๊ธฐ checkpoint ๋˜๋Š” stop์œผ๋กœ ๊ด€์ธก๋œ ์ง€์†์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ฃผ ๋„๋‹ฌ๋ฅ ์€ ๊ธฐ๊ฐ„ ์ „์ฒด์— ๊ฑธ์ณ ๊ตฌ๋…์„ ์ฆ๋ช…ํ•œ ์„ธ์…˜๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋งˆ๊ฐ ์ „ stop ์„ธ์…˜์€ ์ด๋ฏธ ์ˆ˜์‹ ํ–ˆ์–ด๋„ ์ฃผ ์ง€ํ‘œ์˜ ๋ถ„์žยท๋ถ„๋ชจ์—์„œ ๋ชจ๋‘ ์ œ์™ธํ•˜๊ณ , ๋Šฆ์€ join๋„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ๋‹จ์ ˆ์ด๋‚˜ mesh ์ œ๊ฑฐ๋กœ ๊ตฌ๋…์ž๋ฅผ ์ œ์™ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ™•์ธ๋œ ๋ฐœํ–‰ ์‹œ์  ๋Œ€์ƒ ๋„๋‹ฌ๋ฅ ๊ณผ ์•ˆ์ • coverage๋ฅผ ํ•จ๊ป˜ ๋ณด์‹ญ์‹œ์˜ค. ํ™•์ธ๋œ ์ตœ์ดˆ 10๋ช… ์ค‘ 2๋ช…์ด ์ดํƒˆํ•˜๊ณ  ๊ทธ์ค‘ 1๋ช…์€ ๋ฏธ๋ฆฌ ์ˆ˜์‹ ํ–ˆ์œผ๋ฉฐ ์•ˆ์ • ๊ตฌ๋…์ž 8๋ช… ์ค‘ 7๋ช…์ด ์„ฑ๊ณตํ•˜๋ฉด ์•ˆ์ • ๋„๋‹ฌ๋ฅ ์€ 7/8, ๋ฐœํ–‰ ์‹œ์  ๋Œ€์ƒ ๋„๋‹ฌ๋ฅ ์€ 8/10, coverage๋Š” **80%**์ž…๋‹ˆ๋‹ค. ๋ฐœํ–‰ ์‹œ์  ๋Œ€์ƒ ๋„๋‹ฌ๋ฅ ์—๋Š” ์ดํƒˆ์ž์˜ ์กฐ๊ธฐ ์„ฑ๊ณต๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ํ™•์ธ๋œ ๋ฐœํ–‰ ์‹œ์  ์Œ์˜ ์ดํƒˆ๊ณผ ๋งˆ๊ฐ๊นŒ์ง€ ์ง€์† ์–ด๋А ์ชฝ๋„ ์ฆ๋ช…ํ•˜์ง€ ๋ชปํ•˜๋ฉด coverage ๋ฒ”์œ„๋Š” ์•ˆ์ •/ํ™•์ธ๋œ ๋ฐœํ–‰ ์‹œ์  ๋Œ€์ƒ๋ถ€ํ„ฐ (์•ˆ์ • + ์ง€์† ์—ฌ๋ถ€ ๋ถˆ๋ช…)/ํ™•์ธ๋œ ๋ฐœํ–‰ ์‹œ์  ๋Œ€์ƒ๊นŒ์ง€ ๋„“์–ด์ง‘๋‹ˆ๋‹ค. ์›๋ณธ sequence๊ฐ€ ๋ˆ„๋ฝ๋œ ๋ฏธ์ˆ˜์‹ ๋„ ๋„๋‹ฌ๋ฅ  ๋ฒ”์œ„๋ฅผ ๋„“ํž™๋‹ˆ๋‹ค. ์ด ๋ฒ”์œ„๋Š” ์‹ ๋ขฐ๊ตฌ๊ฐ„์ด ์•„๋‹™๋‹ˆ๋‹ค. 10์ดˆ๊ฐ€ ์ง€๋‚˜์ง€ ์•Š์€ ๋ฉ”์‹œ์ง€๋Š” pending์ž…๋‹ˆ๋‹ค. ๋ฐœํ–‰ ์‹œ์  ๊ฐ€์šฉ์„ฑ ๋ถˆ๋ช… ํ›„๋ณด๋Š” ํ™•์ธ๋œ ์ง‘๋‹จ ๋ฐ–์— ๋‘๊ณ  ๊ด€์ธก ํ’ˆ์งˆ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ํ™•์ธ๋œ ์ง‘๋‹จ์ด ๋น„์—ˆ์„ ๋•Œ๋งŒ ๋ฐœํ–‰ ์‹œ์  ๋„๋‹ฌ๋ฅ ๊ณผ coverage๊ฐ€ N/A์ด๋ฉฐ incomplete/unknown ๊ฒฝ๊ณ ๋งŒ์œผ๋กœ ์ˆจ๊ธฐ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

PubSub join/leave๋Š” Peer ์ƒ์„ฑยท์ข…๋ฃŒ ๊ธฐ๋ก์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ธก์ • ์ด๋ฒคํŠธ๋Š” ๊ณ„์ธก๋œ ๊ตฌ๋… ์„ธ์…˜์ด๋ฉฐ ์ „์ฒด Docker lifecycle์ด๋‚˜ ๋ฌผ๋ฆฌ์  uptime ์ด๋ ฅ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐ•์ œ ์ข…๋ฃŒ๋Š” ๋ถˆ๋ช… ๊ผฌ๋ฆฌ ๊ตฌ๊ฐ„์„ ๋‚จ๊ธธ ์ˆ˜ ์žˆ๊ณ  ์•„์˜ˆ ๋ณด์ด์ง€ ์•Š์€ telemetry๋Š” ์ˆ˜์‹  ๋กœ๊ทธ๋งŒ์œผ๋กœ ๊ฒ€์ถœํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์‹ ๋ขฐ ์ƒํƒœ์˜ ์‹œ๊ณ„ ์ถ”์ •์€ uncertainty๋ฅผ ๊ธฐ๋กํ•˜๋ฉฐ, ๋ฒ”์œ„์ƒ ๊ธฐํ•œ ๋‚ด์ธ ์Œ์ˆ˜ ์ถ”์ •์€ ์ˆ˜์‹  ์„ฑ๊ณต์œผ๋กœ ์ธ์ •ํ•ด๋„ ์ง€์—ฐ ํ†ต๊ณ„์—์„œ๋Š” ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๊ฐฑ์‹  ์‹คํŒจ๊ฐ€ 2๋ถ„ ์œ ํšจ ๊ธฐ๊ฐ„์„ ๋„˜์œผ๋ฉด ์‹ ๋ขฐ metadata๋ฅผ ์ค‘๋‹จํ•˜๊ณ  ์ดํ›„ ์„ฑ๊ณตํ•˜๋ฉด ๋‹ค์‹œ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. chrony/NTP๋„ ๊ณ„์† ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ZIP metrics.json์€ ๊ฐ™์€ ์ด๋ฒคํŠธ ๊ฒฝ๊ณ„์—์„œ ์žฌ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ dispatch ๋Œ€์ƒ์€ legacy๋กœ ๋‚จ๊ธฐ๋ฉฐ ์ง€์† ๊ตฌ๋… ์ฆ๊ฑฐ๋ฅผ ๋Œ€์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ง€ํ‘œ ์ •์˜์™€ ์ˆ˜์ง‘ ํ•œ๊ณ„๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

์‹คํ—˜ ์ข…๋ฃŒ ํ›„ Peer ์ •๋ฆฌ์™€, ๋‹ค๋ฅธ ์‹คํ–‰์ด ์—†๋‹ค๋ฉด Agent ์ ์œ ๋Ÿ‰ 0์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. stop-all์ด ๋๋‚˜์ง€ ์•Š์€ join job์„ ์˜๋„์ ์œผ๋กœ ์ทจ์†Œํ•˜๋ฏ€๋กœ completed ์‹คํ–‰์—๋„ canceledJobs: 1์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ’๋งŒ์œผ๋กœ ์‹คํŒจ๋ฅผ ๋œปํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์‹คํ—˜ ํ•ญ๋ชฉ ๋˜๋Š” Saved results์˜ Download results๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ZIP์—๋Š” ์ตœ๊ทผ 300๊ฐœ ๋ฒ„ํผ์™€ ๋ณ„๊ฐœ๋กœ ์ œ์ถœํ•œ ์‹œ๋‚˜๋ฆฌ์˜คยท์‹คํ—˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐยท๋‚ด๋ณด๋‚ด๊ธฐ ๊ฒฝ๊ณ„๊นŒ์ง€ ์ €์žฅ๋œ ์ „์ฒด ์ด๋ฒคํŠธ ๋กœ๊ทธ๊ฐ€ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. metrics.json๊ณผ ์ˆ˜์ง‘๋œ ๊ตฌ๋… ์„ธ์…˜ ์ด๋ฒคํŠธ๋„ ํฌํ•จํ•˜์ง€๋งŒ ๋ณ„๋„์˜ ์™„์ „ํ•œ Docker lifecycle snapshot, ๋ฉ”์‹œ์ง€ payload dump, PCAP, Prometheus/Grafana ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹คํ–‰ ์ค‘ ๋‹ค์šด๋กœ๋“œ๋Š” snapshot์ด๋ฉฐ ๋‹ค์šด๋กœ๋“œ๋กœ ๋ˆ„๋ฝ๋œ telemetry๋ฅผ ๋ณต๊ตฌํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ๊ตฌ์„ฑ๊ณผ ๋ณด์กด ์ •์ฑ…

sudo sh scripts/swarm.sh remove๋กœ ์›น ์„œ๋น„์Šค๋ฅผ ๋‚ด๋ฆฌ๊ธฐ ์ „์— ๋‹ค์šด๋กœ๋“œํ•˜์‹ญ์‹œ์˜ค. ๋ฐ์ดํ„ฐ volume๊ณผ ์™ธ๋ถ€ Peer network๋Š” ๋‚จ์Šต๋‹ˆ๋‹ค. ์žฌ์‹œ์ž‘ ํ›„ ๋ณด์ด๋Š” interrupted ๊ฒฐ๊ณผ๋Š” ์ž๋™ ์žฌ๊ฐœํ•˜์ง€ ์•Š์œผ๋ฉฐ Peer ์ •๋ฆฌ ์™„๋ฃŒ๋ฅผ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์กฐ์ •ํ•  ๊ฐ’

์„ค์ • ํšจ๊ณผ
Worker join์˜ count ์ด ์ƒ์„ฑ ์˜ˆ์‚ฐ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์ˆ˜์ง‘ ๊ตฌ๊ฐ„๊นŒ์ง€ join์ด ์ด์–ด์ง€๋„๋ก ์ถฉ๋ถ„ํžˆ ํฌ๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
Worker interval.mean ์ž‘๊ฒŒ ํ•˜๋ฉด ์˜ˆ์•ฝ ๋„์ฐฉ ๋นˆ๋„๊ฐ€ ๋†’์•„์ง‘๋‹ˆ๋‹ค. ๊ฐ„๊ฒฉ์€ ๋ˆ„์  ์˜ˆ์•ฝ ์‹œ๊ฐ์„ ์‚ฌ์šฉํ•˜๊ณ  ๋Šฆ์–ด์ง„ ์ ‘์ˆ˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋”ฐ๋ผ์žก์ง€๋งŒ, ์ง€์†์ ์ธ Dockerยท์šฉ๋Ÿ‰ ๋ณ‘๋ชฉ์€ ์‹ค์ œ ๋„์ฐฉ๋ฅ ์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
Worker lifetime์˜ xm / alpha ์ˆ˜๋ช…๊ณผ ๊ธฐ๋Œ€ ๋…ธ๋“œ ์ˆ˜๋ฅผ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. alpha > 1์ด๋ฉด ํ‰๊ท ์ˆ˜๋ช…์€ alpha ร— xm / (alpha - 1)์ž…๋‹ˆ๋‹ค.
Agent capacity ์ ‘์ˆ˜ ํ•œ๋„์ด๋ฉฐ ์˜ˆ์•ฝ CPU/RAM์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋†’์ด๊ธฐ ์ „์— ํ˜ธ์ŠคํŠธ ๋ถ€ํ•˜๋ฅผ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค.
Warm-up duration ์ฒซ ๋ฐœํ–‰ ์ „ churn ์‹œ๊ฐ„์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ์ˆ˜๋ ด ๊ฒ€์‚ฌ๊ฐ€ ์•„๋‹Œ ์‹œ๊ฐ„ ๋Œ€๊ธฐ์ž…๋‹ˆ๋‹ค.
Publish count / interval round๋‹น ์ตœ๋Œ€ ๋ฐœํ–‰ ๋…ธ๋“œ ์ˆ˜์™€ ์š”์ฒญ ์‚ฌ์ด ๊ฐ„๊ฒฉ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
Publish deliveryWindow ๊ธฐ๋ณธ 10์ดˆยท์ตœ๋Œ€ 1์‹œ๊ฐ„์ธ ๊ณ ์ • ์ˆ˜์‹  ๊ธฐ๊ฐ„์ž…๋‹ˆ๋‹ค. ๋๊นŒ์ง€ ๋‚จ๋Š” ๋Œ€์ƒ๋„ ๋ฐ”๋€Œ๋ฏ€๋กœ ๊ฐ™์€ ๊ฐ’์œผ๋กœ ๋น„๊ตํ•˜๊ณ  ๋งˆ์ง€๋ง‰ ์ˆ˜์ง‘ ๋Œ€๊ธฐ๋Š” ์ด๋ณด๋‹ค ๊ธธ๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
Round ์Œ / 10์ดˆ ๋Œ€๊ธฐ ๊ด€์ธก ๊ธฐ๊ฐ„์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ํ›„๋ณด๊ฐ€ ์—†์–ด๋„ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋„๋ก ๋ช…์‹œ์  ๋Œ€๊ธฐ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
Worker network profile P2P ์ง€์—ฐยทjitterยทloss๋ฅผ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ์ด ์‹คํ—˜์—์„œ๋Š” bootstrap ๋‘ ๊ฐœ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
payloadEncoding envelope๋Š” ์ง€์—ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. raw๋Š” ์—ฌ๊ธฐ์„œ PubSub ๋ฐ์ดํ„ฐ๋ฅผ ์ •ํ™•ํžˆ 32๋ฐ”์ดํŠธ๋กœ ๋งŒ๋“ค์ง€๋งŒ ์ „ํŒŒ ์ง€์—ฐ ํ‘œ๋ณธ์ด ์—†์Šต๋‹ˆ๋‹ค.

YAML์€ anchor๋กœ ๋ฐœํ–‰ phase์™€ ๋Œ€๊ธฐ phase๋ฅผ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํŒŒ์‹ฑ ์‹œ ํŽผ์ณ์ง€๋Š” ํ‘œ์ค€ YAML ์ฐธ์กฐ์ด๋ฉฐ ์‹œ๋‚˜๋ฆฌ์˜ค ์—”์ง„์˜ ๋ฐ˜๋ณต๋ฌธ ๊ธฐ๋Šฅ์ด ์•„๋‹™๋‹ˆ๋‹ค. round ์ˆ˜๋ฅผ ๋ฐ”๊พธ๋ ค๋ฉด ๋ฐ˜๋ณต๋œ publish/wait ์Œ์„ ์กฐ์ •ํ•˜๊ณ , anchor๊ฐ€ ์žˆ๋Š” ๋ฐœํ–‰ phase๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ์ด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ชจ๋“  alias์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ 30์ดˆ ์ˆ˜์ง‘ ๋Œ€๊ธฐ์™€ stop-all์€ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค.

๊ณ ์ • seed๋Š” ํ›„๋ณด ์ง‘ํ•ฉ๊ณผ ์‹คํ–‰ ์กฐ๊ฑด์ด ๊ฐ™์„ ๋•Œ ๋‚œ์ˆ˜ ์ƒ˜ํ”Œ๋ง์„ ์žฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. Docker ์ฒ˜๋ฆฌ ์‹œ๊ฐ„, ์š”์ฒญ ์ „ ๋…ธ๋“œ ํ‡ด์žฅ, ์„œ๋กœ ๋‹ค๋ฅธ ์‹คํ–‰ยท์žฅ๋น„์˜ ๊ฒฐ๊ณผ๊นŒ์ง€ ๊ฐ™๊ฒŒ ๋งŒ๋“ค์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

v2 Churn ์‹คํ—˜๊ณผ์˜ ๊ด€๊ณ„

๊ฒ€ํ† ํ•œ v2 exp/exp-2603_churn-02.sh ์Šคํฌ๋ฆฝํŠธ๋Š” boot 10๊ฐœ๋ฅผ ์œ ์ง€ํ•˜๊ณ  worker join์„ ์ตœ๋Œ€ 10,000ํšŒ ์˜ˆ์•ฝํ•œ ๋’ค ๋Œ€๊ธฐํ–ˆ์œผ๋ฉฐ, ๋ฌด์ž‘์œ„ worker ์ตœ๋Œ€ 10๊ฐœ์—์„œ ์ „์ฒด topic์œผ๋กœ 32๋ฐ”์ดํŠธ raw ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ batch ๋ฐœํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„ churn์„ ์œ ์ง€ํ•˜๋ฉฐ 30์ดˆ ์ˆ˜์ง‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ๋Š” ์˜๋„์ ์œผ๋กœ boot ๋‘ ๊ฐœ, ๋” ์ž‘์€ ๊ธฐ๋Œ€ worker ์ˆ˜, ๋งค๋ฒˆ ๋‹ค์‹œ ์„ ํƒํ•˜๋Š” ๋ฐœํ–‰ 30 round, ๋ช…์‹œ์  topic ํ•˜๋‚˜, ์ถ”๊ฐ€ P2P ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด, ์ง€์—ฐ ์ธก์ •์šฉ envelope๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. balanced Agent ๋ฐฐ์น˜๋„ v2์˜ join๋งˆ๋‹ค worker ์„œ๋ฒ„๋ฅผ ๋ฌด์ž‘์œ„ ์„ ํƒํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์„ธ์…˜ ๊ธฐ๊ฐ„ ์ง€ํ‘œ๋Š” v2 ์žฌํ˜„ ๊ณ„์•ฝ๊ณผ ๋…๋ฆฝ์ ์ธ v3 ์‹คํ—˜ ์„ค๊ณ„์ž…๋‹ˆ๋‹ค. churn ์ค‘ ๊ด€์ธก์ด๋ผ๋Š” ๋ชฉ์ ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ž‘์€ Swarm์—์„œ ๋ฐ˜๋ณต ๊ด€์ธกํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ ๊ฒƒ์ด๋ฉฐ, ๊ฒฐ๊ณผ์˜ ๋™๋“ฑ์„ฑ์„ ๋ณด์žฅํ•˜๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋œ v2 ์„ค์ • ํŒŒ์ผ์„ ๋ณต์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. v2 ์žฌํ˜„ ์ฐธ๊ณ ์—์„œ ํ˜ธํ™˜ ๋ฒ”์œ„๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.