Scenario Reference KO - k-p2p-lab/kpl-v3 GitHub Wiki

์‹œ๋‚˜๋ฆฌ์˜ค ์„ค์ • ๋ ˆํผ๋Ÿฐ์Šค

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

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

์ด ๋ฌธ์„œ๋Š” ๋ฒ„์ „ 3 YAML ํ˜•์‹, ํ”ผ์–ด ํ”„๋กœํŒŒ์ผ, ํ”„๋กœํ† ์ฝœ ์„ค์ •, ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด๊ณผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์žก์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์žฌ์‚ฌ์šฉํ•  YAML์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์‹œ๋‚˜๋ฆฌ์˜ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

์ตœ์ƒ์œ„ ํ•„๋“œ

์‹œ๋‚˜๋ฆฌ์˜ค ํ˜•์‹ ๋ฒ„์ „์€ K-P2PLab release ๋ฒ„์ „๊ณผ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค. ์ƒˆ ์‹œ๋‚˜๋ฆฌ์˜ค์—๋Š” version: 3์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์ด ๋ฒ„์ „์€ mesh-freeze, ๋ชจ๋ธ ๊ธฐ๋ฐ˜ topology ํ˜•์„ฑ๊ณผ ๊ทธ๋ฃน/ID ์„ ํƒ์ž๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ๋ฒ„์ „ 1๊ณผ 2๋„ ๊ณ„์† ํ—ˆ์šฉํ•˜๋ฉฐ version์„ ์ƒ๋žตํ•˜๊ฑฐ๋‚˜ 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด 1๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด action์˜ ๋™์ž‘์€ ์œ ์ง€ํ•˜๊ณ  ๋‘ ๋ฉ”์‹œ ์ œ์–ด action์—๋Š” ๋ฒ„์ „ 3์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” YAML ํ•„๋“œ ์ด๋ฆ„์€ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

ํ•„๋“œ ํ•„์ˆ˜ ์—ฌ๋ถ€ ๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’ ์˜๋ฏธ
version ๊ถŒ์žฅ: 3 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ release๊ฐ€ ์•„๋‹Œ scenario schema ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ๋ฒ„์ „ 1๊ณผ 2๋„ ๊ณ„์† ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
name ํ•„์ˆ˜, ๊ณต๋ฐฑ๋งŒ์œผ๋กœ ๊ตฌ์„ฑ ๋ถˆ๊ฐ€ Run ์ด๋ฆ„์ด๋ฉฐ ์ €์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•ญ๋ชฉ ์ด๋ฆ„๊ณผ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค.
seed 0 0์ด ์•„๋‹Œ seed๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ sampling์„ ์ œ์–ดํ•˜๊ณ  0์€ ์‹œ๊ฐ ๊ธฐ๋ฐ˜ seed๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
onExit cancel ์ž์—ฐ ์™„๋ฃŒ ์‹œ background job์— ์ ์šฉํ•˜๋Š” cancel ๋˜๋Š” drain ์ •์ฑ…์ž…๋‹ˆ๋‹ค.
jobShutdownTimeout 3m, ์–‘์ˆ˜ Job ์ข…๋ฃŒ ์ œํ•œ๊ณผ ๋ณ„๋„๋กœ Peer cleanup ์ œํ•œ์— ์ ์šฉํ•˜๋ฉฐ ์ „์ฒด run timeout์€ ์•„๋‹™๋‹ˆ๋‹ค.
profiles ๋นˆ map ์žฌ์‚ฌ์šฉํ•  ๋…ธ๋“œ๋ณ„ configuration overlay์ž…๋‹ˆ๋‹ค.
phases ์ตœ์†Œ ํ•˜๋‚˜ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋Š” action์ด๋ฉฐ ์ถ”์ ๋˜๋Š” background ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹คํ–‰ schema์™€ ๊ฒ€์ฆ์€ internal/scenario/scenario.go, scheduling์€ internal/controller/runner.go์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ ์—ญํ• , ์ข…๋ฅ˜์™€ ํ”„๋กœํŒŒ์ผ

role์€ Kademlia bootstrap discovery๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. boot ๋…ธ๋“œ๋Š” Controller๊ฐ€ bootstrap peer๋กœ ์ œ๊ณตํ•˜์ง€๋งŒ worker ๋…ธ๋“œ๋Š” ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Topic transport discovery๋Š” ๋ณ„๋„์ด๋ฉฐ ๋™์ผ runยท์ •ํ™•ํ•œ topic์˜ ready PubSub ์ฐธ๊ฐ€์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. type์€ ๋…ธ๋“œ์˜ libp2p, Kademlia, PubSub ๋™์ž‘์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐœ๋…๋“ค์€ ์„œ๋กœ ๋…๋ฆฝ์ ์ด๋ฏ€๋กœ bootstrap ์—ญํ• ์„ ์˜ค์šฉํ•˜์ง€ ์•Š๊ณ  ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ worker๋ฅผ ํ•œ ์‹คํ—˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. type๊ณผ profile์„ ๋ชจ๋‘ ์ƒ๋žตํ•˜๋ฉด role: boot๋Š” boot preset์„, ๊ทธ ๋ฐ–์˜ role์€ full์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

๋‚ด์žฅ type ๋™์ž‘
boot v2์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ธฐ๋ณธ ์ƒํƒœ์—์„œ๋Š” Kademlia๋งŒ ์‹คํ–‰ํ•˜๋Š” bootstrap ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค.
full / worker Kademlia server์™€ ํ‘œ์ค€ GossipSub์— ๋ชจ๋‘ ์ฐธ์—ฌํ•˜๋ฉฐ v2์˜ hard connection cap 55๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
light Kademlia client์ด๋ฉฐ ๊ธฐ๋ณธ ์—ฐ๊ฒฐ ์ œํ•œ์ด ๋” ์ž‘์Šต๋‹ˆ๋‹ค.
publisher ํ† ํ”ฝ์— ๊ตฌ๋…ํ•˜์ง€ ์•Š๊ณ  ๋ฐœํ–‰๋งŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
subscriber / observer ๊ตฌ๋… ์ „์šฉ์ด๋ฉฐ ๋ฐœํ–‰ ์š”์ฒญ์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.
relay Topic.Relay()๋กœ application subscription์ด๋‚˜ application publish ์—†์ด topic ํŠธ๋ž˜ํ”ฝ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
flood FloodSub๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
random ์ตœ์†Œ degree์™€ ์ถ”์ • ๋„คํŠธ์›Œํฌ ํฌ๊ธฐ๋ฅผ ๋ณ„๋„๋กœ ์กฐ์ •ํ•˜๋Š” RandomSub๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
dht-only PubSub ์—†์ด Kademlia๋งŒ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
gossip-only Kademlia ์—†์ด PubSub๋งŒ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
non-gossip / mesh-only lazy gossip์„ ๋ˆ GossipSub mesh๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์žฌ์‚ฌ์šฉํ•  ๋…ธ๋“œ ์„ค์ •์€ ์ตœ์ƒ์œ„ profiles ๋งต์— ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. join phase์˜ ์„ค์ • ๊ฒฐํ•ฉ ์ˆœ์„œ๋Š” ๋‚ด์žฅ type, ์ด๋ฆ„์ด ์ง€์ •๋œ profile, phase ์•ˆ์˜ node override ์ˆœ์„œ์ž…๋‹ˆ๋‹ค. Phase์˜ type์„ ์ƒ๋žตํ•˜๋ฉด ์ง€์ • profile์˜ type์œผ๋กœ preset์„ ์„ ํƒํ•˜๊ณ , ์ด๊ฒƒ๋„ ์—†์œผ๋ฉด role์— ๋”ฐ๋ฅธ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. profile์€ ์ •์˜๋œ ํ”„๋กœํ•„์ด๋‚˜ ๋‚ด์žฅ preset์˜ ์ด๋ฆ„์ด์–ด์•ผ ํ•˜๋ฉฐ, type์„ ๋ช…์‹œํ•ด๋„ ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„์€ ๊ฒ€์ฆ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. Pointer ๊ธฐ๋ฐ˜ boolean๊ณผ ์ˆซ์ž ์ œ์–ด๊ฐ’์€ ๋ช…์‹œ์ ์ธ false์™€ 0๋„ ๋ณด์กดํ•˜๋ฏ€๋กœ historyGossip: 0์ฒ˜๋Ÿผ lazy gossip์„ ๋„๋Š” ์‹คํ—˜๋„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Legacy flat ์ˆซ์ž ํ•„๋“œ์—์„œ๋Š” 0์ด ์ƒ๋žต์„ ๋œปํ•˜๋ฏ€๋กœ ๋ช…์‹œ์ ์œผ๋กœ 0์œผ๋กœ overrideํ•˜๋ ค๋ฉด ์ค‘์ฒฉ ์ œ์–ด๊ฐ’์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๋‚ด์žฅ boot type์€ gossipsub.enabled: false๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. bootstrap ๋…ธ๋“œ๋„ PubSub์— ์ฐธ์—ฌ์‹œํ‚ฌ ๋•Œ๋Š” profile์ด๋‚˜ phase์˜ node ๋ธ”๋ก์—์„œ ์ด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ true๋กœ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค. ํ™œ์„ฑํ™”ํ•œ boot ๋…ธ๋“œ์—๋Š” ์•„๋ž˜์—์„œ ์„ค๋ช…ํ•˜๋Š” ํ•ด๋‹น router์— ๋งž๋Š” parameter, scoring, inspection ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. examples/mixed-workers.yaml์ด ์ด opt-in ๊ตฌ์„ฑ์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค. PubSub๊ฐ€ ํ™œ์„ฑํ™”๋œ Peer๋Š” ์‹œ์ž‘ ์งํ›„ ๋™์ผ runยท์ •ํ™•ํ•œ topic์˜ Controller registry๋ฅผ ์กฐํšŒํ•˜๊ณ  ์ดํ›„ 3์ดˆ loop๋กœ pollingํ•ฉ๋‹ˆ๋‹ค. ๊ฐ Peer๊ฐ€ ์กฐ๊ฑด์— ๋งž๋Š” ์ „์ฒด ํ›„๋ณด๋ฅผ rendezvous hash๋กœ ์ •๋ ฌํ•˜๊ณ  ์ „์ฒด connection budget๊ณผ retry backoff ๋ฒ”์œ„์—์„œ ํ˜„์žฌ topic Peer ์ˆ˜์™€ DHigh์˜ ์ฐจ์ด๋ฅผ ์ฑ„์›๋‹ˆ๋‹ค. ์ฃผ๊ธฐ์™€ ๋Œ€์ฒด ํ›„๋ณด ๋™์ž‘์€ bootstrap๊ณผ topic discovery๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค. ์‹ค์ œ GRAFT mesh๋Š” GossipSub๊ฐ€ ๊ตฌ์„ฑํ•˜๋ฏ€๋กœ DHT bootstrap, transport ํ›„๋ณด, mesh ๊ตฌ์„ฑ์›์€ ์„œ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.

version: 2
name: mixed-workers
seed: 42
onExit: cancel
jobShutdownTimeout: 3m

profiles:
  tuned-mesh:
    type: full
    libp2p:
      connectionLimit: 128
      connectionManager:
        lowWater: 64
        highWater: 96
        gracePeriod: 30s
    kademlia:
      mode: server
      protocolPrefix: /k-p2p-lab/v3
      bucketSize: 20
      concurrency: 10
    gossipsub:
      router: gossipsub
      topics: [kpl/default]
      floodPublish: false
      peerExchange: true
      params:
        d: 8
        dLow: 6
        dHigh: 12
        dOut: 3
        dLazy: 8
        heartbeatInterval: 500ms

phases:
  - action: join
    group: tuned
    role: worker
    profile: tuned-mesh
    count: 100
    parallel: true
    parallelism: 16

ํ”„๋กœํ† ์ฝœ ์„ค์ •

์ค‘์ฒฉ๋œ node ์„ค์ •์—์„œ ํ˜„์žฌ ๊ณ ์ •๋œ ๋ฒ„์ „์˜ libp2p ํŒจํ‚ค์ง€๊ฐ€ ์ง€์›ํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  duration ํ•„๋“œ๋Š” 250ms, 30s, 5m ๊ฐ™์€ Go duration ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ํ”„๋กœํ† ์ฝœ ๋ ˆํผ๋Ÿฐ์Šค์— meshยทscoreยทPeerGaterยทfilterยทvalidationยทdiscoveryยทpublicationยทKademlia์˜ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ† ์ฝœ ์˜ˆ์ œ๋„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

์˜์—ญ ์กฐ์ • ๊ฐ€๋Šฅํ•œ ํ•„๋“œ
libp2p userAgent, natPortMap, relay, relayService, connectionLimit, connectionManager.lowWater, connectionManager.highWater, connectionManager.gracePeriod, dialTimeout
kademlia enabled, mode, protocolPrefix, protocolId, protocolExtension, bucketSize, concurrency, resiliency, lookupCheckConcurrency, routing-table latency/refresh duration, maxRecordAge, provider/value/auto-refresh switch, optimistic-provide ์„ค์ •, bootstrap timeout/retry interval, filterยทdiversityยทdatastoreยทvalidatorยทproviderStoreยทbootstrapSourceยทrequestHook ์ •์ฑ…
gossipsub enabled, router, hopwave, meshFreeze, topicMode, randomDegree, randomNetworkSize, subscribe, allowPublish, topics, floodPublish, peerExchange, message/queue/validation limit, signaturePolicy, seenMessagesTTL, subscriptionBufferSize, scoreInspectInterval, message IDยทtopicOptionsยทfilterยทprotocolยทPeerGaterยทvalidatorยทRPC inspectorยทdiscoveryยทauthorยทpublish ์ •์ฑ…
gossipsub.params ๊ณ ์ •๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ชจ๋“  GossipSubParams ํ•„๋“œ: mesh degree, history, gossip factor/retransmission, heartbeat, fanout, prune/backoff, connector, connection timeout, direct-connect ๋ฐ opportunistic-graft ์ œ์–ด๊ฐ’, IHAVE ์ œํ•œ, IDONTWANT ์ œํ•œ, IWANT follow-up time
gossipsub.score ๋ช…์‹œ์  enabled switch, ์„ ์–ธํ˜• P5๋ฅผ ํฌํ•จํ•œ ์ „์ฒด PeerScore weight์™€ decay ์„ค์ •, score threshold, IP-colocation whitelist, meshยท์ตœ์ดˆ ์ „๋‹ฌยท์‹คํŒจยท์ž˜๋ชป๋œ ๋ฉ”์‹œ์ง€ ํ•ญ๋ชฉ์„ ๋ชจ๋‘ ํฌํ•จํ•œ topics.<topic> score block

GossipSub ์ „์šฉ ์„ค์ •(params, hopwave, meshFreeze, ํ™œ์„ฑ score/inspection, floodPublish, peerExchange, directPeers, peerGater)์€ gossipsub router์—์„œ๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. FloodSub์™€ RandomSub์—์„œ๋Š” ํ™œ์„ฑ scoring์„ ๊ฑฐ๋ถ€ํ•˜์ง€๋งŒ ๋น„ํ™œ์„ฑ tuning ๋ธ”๋ก์€ ๋ณด์กดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ mesh ์„ค์ •์€ D=6, DLow=5, DHigh=12, DScore=4, DOut=2, DLazy=6, history 5/3, gossip factor 0.25, heartbeat 1s์ž…๋‹ˆ๋‹ค. PubSub๋ฅผ ํ™œ์„ฑํ™”ํ•œ boot preset์€ DScore=3์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. full/worker์™€ ์—ญํ• ๋ณ„ GossipSub worker preset์€ v2์—์„œ ๊ฐ€์ ธ์˜จ DLow=5, DScore=3, maxIHaveLength=5500, ์ดˆ๊ธฐ heartbeat 1s๋ฅผ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ worker preset์€ v2์˜ hard connection limit 55๋„ ์‚ฌ์šฉํ•˜๋ฉฐ light๋Š” 32๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Kademlia์˜ ๊ธฐ๋ณธ bucket size๋Š” 20, protocol prefix๋Š” /k-p2p-lab/v3์ž…๋‹ˆ๋‹ค. ์ ์šฉ๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’์€ internal/model/config.go, ๋ถ„๋ฆฌ๋œ typed schema๋Š” ํ”„๋กœํ† ์ฝœ ์„ค์ • ๊ตฌํ˜„ ์œ„์น˜๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

libp2p.connectionLimit๋Š” ์ „์ฒด ์—ฐ๊ฒฐ ์ˆ˜์— ์ ์šฉ๋˜๋Š” resource manager hard cap์ผ ๋ฟ์ด๋ฉฐ soft connection manager๋ฅผ ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. soft low-water/high-water ์ •๋ฆฌ๋Š” libp2p.connectionManager ๋ธ”๋ก์„ ๋ช…์‹œํ–ˆ์„ ๋•Œ๋งŒ ์„ค์น˜๋˜๋ฉฐ ๊ทธ ๋ธ”๋ก์˜ lowWater, highWater, gracePeriod๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ profile๋งˆ๋‹ค hard cap, soft manager ๋˜๋Š” ๋‘˜ ๋‹ค๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

v2 ์„ค์ •์„ ์ด์‹ํ•  ๋•Œ๋Š” ์ด๋ฆ„๊ณผ ๋‹ฌ๋ฆฌ prefix๋กœ ์‚ฌ์šฉ๋๋˜ v2 protocol_id๋ฅผ v3 kademlia.protocolPrefix๋กœ ์˜ฎ๊ธฐ์‹ญ์‹œ์˜ค. v3์˜ kademlia.protocolId๋Š” Kademlia V1 wire protocol ID ์ „์ฒด๋ฅผ ์ •ํ™•ํžˆ overrideํ•˜๋ฉฐ protocolPrefix, protocolExtension๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ v2 prefix ๊ฐ’์„ ์ด ํ•„๋“œ์— ๋ณต์‚ฌํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ prefix /k-p2p-lab/v3๋Š” ์˜๋„์ ์œผ๋กœ ์ƒˆ๋กœ ๋ถ„๋ฆฌํ•œ protocol namespace์ž…๋‹ˆ๋‹ค. v2 namespace ํ˜ธํ™˜์ด ํ•„์š”ํ•œ ์‹คํ—˜์—์„œ๋งŒ protocolPrefix: /k-p2p-lab/kad-dht๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

RandomSub์—์„œ randomDegree๋Š” libp2p์˜ process-global RandomSubD๋ฅผ ํ†ตํ•ด ์ตœ์†Œ ์—ฐ๊ฒฐ/degree ๋ชฉํ‘œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. KPL์€ Peer๋งˆ๋‹ค ๋ณ„๋„ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ด global ๊ฐ’์€ Peer ํ•˜๋‚˜์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. randomNetworkSize๋Š” NewRandomSub์— ๋ณ„๋„๋กœ ์ „๋‹ฌ๋˜๋Š” ์ถ”์ • ์ „์ฒด ๋„คํŠธ์›Œํฌ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค.

์Šค์ฝ”์–ด๋ง์€ ๊ธฐ๋ณธ ๋น„ํ™œ์„ฑ์ž…๋‹ˆ๋‹ค. gossipsub.score.enabled: true๋กœ๋งŒ ํ™œ์„ฑํ™”ํ•˜๋ฉฐ score ๋ธ”๋ก์ด๋‚˜ ๊ด€์ธก ์ฃผ๊ธฐ๋งŒ์œผ๋กœ ์ผœ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ ์ผœ๋ฉด scoreInspectInterval์˜ ๊ธฐ๋ณธ๊ฐ’์€ 1s์ด๋ฉฐ 0s๋Š” ๊ด€์ธก์„ ๋•๋‹ˆ๋‹ค. inspection์ด ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ๋…ธ๋“œ์˜ peerScores ๋งต์ด ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ /api/v1/nodes, /api/v1/network, /api/v1/snapshot, SSE snapshot stream์—์„œ ์ œ๊ณต๋˜๋ฉฐ topology์˜ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๋ฉด ์„ธ๋ถ€ ์ •๋ณด์— ๊ด€์ธกํ•œ score ์ˆ˜์™€ ํ‰๊ท ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

appSpecificScore๋Š” ๊ณ ์ • default์™€ ์„ ํƒ์ ์ธ libp2p Peer ID๋ณ„ peers map์œผ๋กœ P5๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์  Peer ๊ฐ’์€ 0์„ ํฌํ•จํ•˜์—ฌ ๊ธฐ๋ณธ๊ฐ’๋ณด๋‹ค ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑ appSpecificWeight๊ฐ€ 0์ด ์•„๋‹ˆ๋ฉด ์ด ์ •์ฑ…์ด ํ•„์š”ํ•˜๋ฉฐ ๋ชจ๋“  ๊ฐ’๊ณผ ๊ฐ€์ค‘์น˜๋ฅผ ์ ์šฉํ•œ P5 ๊ฒฐ๊ณผ๋Š” ์œ ํ•œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑ selective validation์€ ์ƒ๋žตํ•œ decay group์— 1s/0.01, ์ƒ๋žตํ•œ ๋น„ํ™œ์„ฑ P1 quantum์— 1s๋ฅผ ์ ์šฉํ•˜๊ณ  ๋ช…์‹œ์  0 tickerยท์ œ์ˆ˜ duration์€ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. Profile์—์„œ inline์œผ๋กœ score๋ฅผ ๋ฎ์–ด์“ฐ๋ฉด ์ „์ฒด ๋ธ”๋ก์„ ๊ต์ฒดํ•˜์—ฌ ๋ช…์‹œ์  0ยทfalse๋ฅผ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ์ ์ˆ˜ ์„ค์ •์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

๋…ธ๋“œ๋ณ„ ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด

Profile ๋˜๋Š” join ๋‹จ๊ณ„์˜ node ๋ธ”๋ก์— network๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ scope: p2p๋Š” ๊ฐ Peer ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ํฌํŠธ 20000์˜ ์†ก์‹  P2P TCP์—๋งŒ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. v2์ฒ˜๋Ÿผ ์ œ์–ด APIยทtelemetry๊นŒ์ง€ ํฌํ•จํ•œ ์ „์ฒด ์†ก์‹ ์„ ์ œํ•œํ•˜๋ ค๋ฉด scope: all์„ ์ง€์ •ํ•˜์‹ญ์‹œ์˜ค. delay๋Š” ํŽธ๋„ egress ์ถ”๊ฐ€ ์ง€์—ฐ์ด๋ฉฐ ์™•๋ณต ์ง€์—ฐ์˜ ๋ชฉํ‘œ๊ฐ’์ด ์•„๋‹™๋‹ˆ๋‹ค. rateMbps์™€ tbf.rateMbps๋Š” ์†ก์‹  ์ œํ•œ์„ ์„ค์ •ํ•˜๊ณ  Bandwidth ์ธก์ •์€ ์‹ค์ œ libp2p ์ŠคํŠธ๋ฆผ ์‚ฌ์šฉ๋Ÿ‰์„ ๋ณ„๋„๋กœ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

node:
  network:
    delay: 100ms
    jitter: 10ms
    lossPercent: 1
    duplicatePercent: 0.1
    corruptPercent: 0.1
    reorderPercent: 1
    rateMbps: 10
    queueLimit: 1000
ํ•„๋“œ ์˜๋ฏธ
delay, jitter ์ถ”๊ฐ€ ์ง€์—ฐ๊ณผ ๋ณ€๋™ ํญ์„ ์Œ์ˆ˜๊ฐ€ ์•„๋‹Œ Go duration์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. jitter์—๋Š” ์–‘์ˆ˜ delay๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ Linux netem์— ๋”ฐ๋ผ ์ตœ๋Œ€ 2147483647ns์ž…๋‹ˆ๋‹ค.
lossPercent, duplicatePercent, corruptPercent, reorderPercent 0~100 ๋ฒ”์œ„์˜ ํŒจํ‚ท ๋น„์œจ์ž…๋‹ˆ๋‹ค. ์žฌ์ •๋ ฌ์—๋Š” ์–‘์ˆ˜ delay๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
rateMbps ์Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์†ก์‹  ์†๋„ ์ œํ•œ(Mbps)์ž…๋‹ˆ๋‹ค. 0์€ ์†๋„ ์ œํ•œ์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.
queueLimit netem ํ์˜ ์ตœ๋Œ€ ํŒจํ‚ท ์ˆ˜์ด๋ฉฐ 1~4294967295์ž…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ๋งŒ ์ง€์ •ํ•ด๋„ netem์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
scope p2p(๊ธฐ๋ณธ) ๋˜๋Š” all ์†ก์‹  ํŠธ๋ž˜ํ”ฝ์ž…๋‹ˆ๋‹ค.
delayDistribution interval๊ณผ ๊ฐ™์€ ๋ถ„ํฌ ํ˜•์‹์œผ๋กœ ํ”ผ์–ด๋ณ„ ๊ธฐ๋ณธ ์ง€์—ฐ์„ ํ•œ ๋ฒˆ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. delay์™€ ๋ฐฐํƒ€์ ์ด๋ฉฐ jitter๋‚˜ ์žฌ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜๋ฉด ์–‘์ˆ˜ min์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
jitterDistribution normal(๊ธฐ๋ณธ), uniform(v2 ๋ฐฉ์‹), pareto, paretonormal์ž…๋‹ˆ๋‹ค.
reorderCorrelationPercent 0~100์˜ ์žฌ์ •๋ ฌ ์ƒ๊ด€๊ณ„์ˆ˜์ด๋ฉฐ v2์˜ reorder.chance์— ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค. ์–‘์ˆ˜๋กœ ์„ค์ •ํ•˜๋ ค๋ฉด ์–‘์ˆ˜ reorderPercent๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
tbf ์–‘์ˆ˜ ์œ ํ•œ๊ฐ’์ธ rateMbps, burstKbit(kilobit)์™€ 1us~4294967295us์˜ latency๋กœ token bucket์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์–‘์ˆ˜ netem rateMbps์™€ ๋ฐฐํƒ€์ ์ž…๋‹ˆ๋‹ค.
schedule ์‹œ๊ฐ„ ๊ธฐ์ค€์— ๋”ฐ๋ฅธ ๋ˆ„์  ์กฐ๊ฑด ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค. ์˜ˆ์•ฝ ๋„คํŠธ์›Œํฌ ๋ณ€๊ฒฝ์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

v2 ์‹คํ—˜์„ ์˜ฎ๊ธฐ์‹ค ๋•Œ๋Š” ์žฌํ˜„ ๊ฒ€ํ† ์™€ ์„ค์ • ๋Œ€์‘ํ‘œ, churn ์˜ˆ์ œ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค. ์—ฌ๊ธฐ์—๋Š” ๋ฐฐ์น˜(balanced, ๋…ธ๋“œ๋ณ„ random, batch๋ณ„ single-agent, ๋ช…์‹œ์  agentId), churn์„ ์œ„ํ•œ onError: continue, ์ •ํ™•ํ•œ PubSub ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋ฅผ ์œ„ํ•œ payloadEncoding: raw, ์ „์ฒด topic ๋ฐœํ–‰์„ ์œ„ํ•œ topic: '*'๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. Network scope์™€ payload encoding์€ ๊ธฐ์กด ๊ธฐ๋ณธ๊ฐ’์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. Worker bootstrap์€ seed ๊ธฐ๋ฐ˜ ์ฒซ ์—ฐ๊ฒฐ ์„ฑ๊ณต ์„ ํƒ์„ ์‚ฌ์šฉํ•˜๋ฉฐ transport stack์€ TCP/Noise/Yamux๋กœ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

๋„คํŠธ์›Œํฌ ์กฐ๊ฑด์„ ์ ์šฉํ•˜๋Š” Peer์—๋Š” Linux NET_ADMIN๊ณผ ํ˜ธ์ŠคํŠธ ์ปค๋„์˜ sch_netem ์ง€์›์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Docker ๋Ÿฐํƒ€์ž„์€ version 3 schedule๋กœ ๋„คํŠธ์›Œํฌ ๋ณ€๊ฒฝ์„ ๋ฐ›์„ join์—๋„ ์ฒซ ์ œํ•œ ์ ์šฉ ์ „๋ถ€ํ„ฐ NET_ADMIN์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ปค๋„ ์ง€์›์ด ์—†๊ฑฐ๋‚˜ tc ๋ช…๋ น์ด ์‹คํŒจํ•˜๋ฉด ๋…ธ๋“œ ์‹œ์ž‘๋„ ๋ช…์‹œ์ ์ธ ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

examples/network-conditions.yaml์€ bootstrap ๋…ธ๋“œ ๋‘ ๊ฐœ์™€ ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด์ด ์ ์šฉ๋œ worker ๋„ค ๊ฐœ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ดˆ๊ธฐํ™” ๋Œ€๊ธฐ์™€ ๋ฉ”์‹œ์ง€ ๋ฐœํ–‰ ํ›„ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ œ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

control-node:8080์€ access๊ฐ€ ํ‘œ์‹œํ•œ Controller ์ฃผ์†Œ๋กœ ๋ฐ”๊พธ๊ณ , ๋จผ์ € API ์ธ์ฆ์œผ๋กœ KPL_COOKIE_JAR๋ฅผ ์ƒ์„ฑํ•˜์‹ญ์‹œ์˜ค.

curl -X POST http://control-node:8080/api/v1/experiments \
  -H 'Content-Type: application/yaml' \
  -b "${KPL_COOKIE_JAR:?Log in first}" -H 'X-KPL-Request: dashboard' \
  --data-binary @examples/network-conditions.yaml

์˜ˆ์•ฝ ๋„คํŠธ์›Œํฌ ๋ณ€๊ฒฝ

version 2์™€ version 3 ๋ชจ๋‘ profile๊ณผ inline node ์„ค์ •์—์„œ network.schedule์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์ •์  ์„ค์ •์€ ์ดˆ๊ธฐ ์กฐ๊ฑด์œผ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์‹คํ—˜์ด ์‹œ์ž‘๋œ ์ง€ 10๋ถ„ ํ›„ delay๋ฅผ 10 ms์—์„œ 100 ms๋กœ ๋ฐ”๊พธ๊ณ , 15๋ถ„ ํ›„ ๋ณต์›ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

network:
  delay: 10ms
  schedule:
    reference: experiment-start
    changes:
      - after: 10m
        set:
          delay: 100ms
      - after: 15m
        set:
          delay: 10ms

๊ฐ Peer๋งˆ๋‹ค ๋ณ„๋„์˜ ์‹œ๊ฐ„์„ ์ ์šฉํ•˜๋ ค๋ฉด reference๋ฅผ peer-join์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค(์ƒ๋žต ์‹œ ๊ธฐ๋ณธ๊ฐ’). ๋‹ค์Œ ์˜ˆ์ œ๋Š” ๊ฐ Peer๊ฐ€ ์ดˆ๊ธฐํ™”๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ 10 ms๋กœ ์‹œ์ž‘ํ•˜๊ณ , 3๋ถ„ ํ›„ 100 ms๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

network:
  delay: 10ms
  schedule:
    reference: peer-join
    changes:
      - after: 3m
        set:
          delay: 100ms
์„ค์ • ๋™์ž‘
reference: experiment-start ํ˜„์žฌ Run์˜ ์‹คํ–‰์ด ์‹œ์ž‘๋œ startedAt ๊ธฐ์ค€์ด๋ฉฐ ์•ž์„  phase์— ์†Œ์š”๋œ ์‹œ๊ฐ„๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต ๋ฐ ์žฌ์‹œ๋„๋งˆ๋‹ค ์ƒˆ ์‹œ์ž‘ ์‹œ๊ฐ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‹œ์ ์ด ์ง€๋‚œ ํ›„ ์ž…์žฅํ•œ Peer๋Š” ์ด๋ฏธ ๋„๋‹ฌํ•œ ์ตœ์‹  ์กฐ๊ฑด์œผ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
reference: peer-join ๊ฐ Peer ํ”„๋กœ์„ธ์Šค๊ฐ€ Agent ๋ฐฉํ–ฅ ์ฃผ์†Œ ํƒ์ƒ‰์„ ๋งˆ์นœ ๋’ค ์ดˆ๊ธฐ ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด ์ ์šฉ๊ณผ P2P host ์ƒ์„ฑ์— ๋“ค์–ด๊ฐ€๋Š” ์‹œ๊ฐ ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค. Controller์˜ join ์š”์ฒญ ์‹œ๊ฐ์ด๋‚˜ ์ดํ›„ ready ๋ณด๊ณ  ์‹œ๊ฐ๊ณผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ ์ƒ์„ฑ๋œ Peer๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ๊ฐ„์„ ์…‰๋‹ˆ๋‹ค.
changes[].after ์„ ํƒํ•œ ๊ธฐ์ค€๋ถ€ํ„ฐ์˜ ๊ฒฝ๊ณผ ์‹œ๊ฐ„์ด๋ฉฐ 0s, 3m, 1h ๋“ฑ ์Œ์ˆ˜๊ฐ€ ์•„๋‹Œ Go duration์ด ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์—„๊ฒฉํ•œ ์˜ค๋ฆ„์ฐจ์ˆœ์ด์–ด์•ผ ํ•˜๋ฉฐ schedule๋‹น ์ตœ๋Œ€ 128๊ฐœ์ž…๋‹ˆ๋‹ค.
changes[].set delay, jitter, loss, rate, scope, ๋ถ„ํฌ ๋“ฑ์„ ๋ˆ„์ ํ•ด์„œ ๋ฎ์–ด์“ฐ๋Š” network ํ•„๋“œ์ž…๋‹ˆ๋‹ค. ์ƒ๋žตํ•œ ํ•„๋“œ๋Š” ์ด์ „ ๊ฐ’์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. schedule ์ค‘์ฒฉ์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ฐ ๋‹จ๊ณ„์˜ ์ตœ์ข… ์„ค์ •์ด ์œ ํšจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

delay: 0s, lossPercent: 0, rateMbps: 0์ฒ˜๋Ÿผ ๋ช…์‹œ์ ์ธ ๊ฐ’์œผ๋กœ ์ƒ์†ํ•œ ์กฐ๊ฑด์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด delay์— jitter๋‚˜ ์žฌ์ •๋ ฌ์ด ์žˆ์—ˆ๋‹ค๋ฉด delay๋ฅผ ์—†์• ๋Š” ๊ฐ™์€ ๋‹จ๊ณ„์—์„œ ํ•ด๋‹น ์ข…์† ์„ค์ •๋„ ํ•ด์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ delay๋Š” ๊ธฐ์กด delayDistribution์„ ๋Œ€์ฒดํ•˜๋ฉฐ ๋ฐ˜๋Œ€๋„ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋ถ„ํฌ๋Š” Agent๊ฐ€ Peer๋ณ„ seed๋กœ ํ™•์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ๋‹จ๊ณ„์—์„œ ์ƒˆ๋กœ ๋ช…์‹œํ•œ ๋ถ„ํฌ๋งŒ ํ•œ ๋ฒˆ ์ถ”์ถœํ•˜๋ฉฐ, ์ด๋ฏธ ์ถ”์ถœํ•œ delay๋ฅผ ์ƒ์†ํ•  ๋•Œ๋Š” ๋‹ค์‹œ ๋ฝ‘์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Profile์„ ๋ฎ์–ด์“ฐ๋ฉด schedule ์ „์ฒด๋ฅผ ๊ต์ฒดํ•˜๋ฉฐ ๋ณ€๊ฒฝ ๋ชฉ๋ก์„ ์ด์–ด ๋ถ™์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ network ์„ค์ •์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ƒ์†ํ•œ ์˜ˆ์•ฝ๋งŒ ์—†์• ๋ ค๋ฉด schedule: {changes: []}๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์กฐ๊ฑด์„ ๋ชจ๋‘ ์ƒ๋žตํ•˜์—ฌ ์ œํ•œ ์—†์ด ์‹œ์ž‘ํ•˜๊ณ  ์˜ˆ์•ฝ ์‹œ์ ๋ถ€ํ„ฐ ์กฐ๊ฑด์„ ์ ์šฉํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ์ด Peer์—๋„ NET_ADMIN์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

์‹คํ—˜ ๊ธฐ์ค€ ์˜ˆ์•ฝ์€ ์ดˆ๊ธฐ ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด์„ ์ ์šฉํ•˜๊ธฐ ์ „์— Controller์™€ ์‹œ๊ณ„๋ฅผ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์ž‘ ์‹œ๊ฐ์ด ์—†๊ฑฐ๋‚˜ ๋™๊ธฐํ™”์— ์‹คํŒจํ•˜๋ฉด Peer ์‹œ์ž‘์„ ์‹คํŒจ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ๊ฐ Peer ๋‚ด๋ถ€์—์„œ ๋‹จ์กฐ ์‹œ๊ณ„ ๊ธฐ์ค€ ํƒ€์ด๋จธ๋ฅผ ์‹คํ–‰ํ•˜๋ฏ€๋กœ Controller polling์ด๋‚˜ ํ›„์† ์‹œ๊ณ„ ๋ณด์ •์œผ๋กœ ์นด์šดํŠธ๋‹ค์šด์ด ๋ฐ€๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. OS ์Šค์ผ€์ค„๋ง๊ณผ tc ์‹คํ–‰์— ๋”ฐ๋ฅธ ์ง€์—ฐ์€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ๋Ÿฌ ์‹œ์ ์„ ์ง€๋‚˜์„œ ํƒ€์ด๋จธ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ํ˜„์žฌ ์‹œ์ ์˜ ์ตœ์‹  ๋ˆ„์  ์กฐ๊ฑด์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. scope: all๋กœ telemetry ์ „๋‹ฌ์ด ์ง€์—ฐ๋ผ๋„ ์ด ๋กœ์ปฌ ํƒ€์ด๋จธ๋Š” ๊ณ„์† ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

Delay๋งŒ ๋ฐ”๊พธ๋ฉด ๊ธฐ์กด netem qdisc๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์„ค์ •์„ ๋ฐ”๊พธ๋ฉด ์ด์ „ ์ œํ•œ์ด ๋‚จ์ง€ ์•Š๋„๋ก KPL qdisc ๊ตฌ์„ฑ์„ ๋‹ค์‹œ ๋งŒ๋“ค๋ฉฐ, ์ด๋•Œ ๋Œ€๊ธฐ ํŒจํ‚ท์ด ๋น„์›Œ์ง€๊ฑฐ๋‚˜ shaping์ด ์ž ์‹œ ๋Š๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๊ณต ์‹œ network_config_applied์— ์ ์šฉ ์กฐ๊ฑดยทrevisionยท์ง€์—ฐ ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•˜๊ณ , ์‹คํ–‰ ์ค‘ tc ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด network_config_failed๋ฅผ ๊ธฐ๋กํ•œ ๋’ค ํ•ด๋‹น Peer๋ฅผ ์‹คํŒจ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ ์šฉ ์กฐ๊ฑด๊ณผ ์‹ค์ œ ํŠธ๋ž˜ํ”ฝ ์ธก์ •๊ฐ’์˜ ์ฐจ์ด๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

ํƒ€์ด๋จธ๋Š” Peer ์ข…๋ฃŒ ์‹œ ํ•จ๊ป˜ ๋๋‚˜๋ฉฐ ์ทจ์†Œยท๋ฐ˜๋ณต ์‹คํ–‰ ์ •๋ฆฌ์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์™„๋ฃŒ๋œ ๋‹จ์ผ Run์€ Peer๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น Peer๋ฅผ ์ข…๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ์˜ˆ์•ฝ๋„ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ด€์ธก ๊ตฌ๊ฐ„๊นŒ์ง€ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์‹คํ–‰ํ•˜๊ณ  stop-all๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์ข…๋ฃŒํ•˜์‹ญ์‹œ์˜ค. ์ „์ฒด examples/network-schedule.yaml์€ ๋‘ ๊ธฐ์ค€, ์กฐ๊ฑด ๋ณต์›, ์‹œ๊ฐ„์ฐจ ์ž…์žฅ๊ณผ ์ข…๋ฃŒ๋ฅผ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค. ์ด ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ControllerยทAgentยทPeer ์ด๋ฏธ์ง€๋ฅผ ํ•จ๊ป˜ ์—…๋ฐ์ดํŠธํ•˜์‹ญ์‹œ์˜ค.

์‹œ๋‚˜๋ฆฌ์˜ค์™€ ์žก

๊ถŒ์žฅ ์‹œ๋‚˜๋ฆฌ์˜ค ํ˜•์‹์€ version 3 YAML์ž…๋‹ˆ๋‹ค. version 2์˜ ์‹คํ–‰ ์ œ์–ด, job ์ถ”์ ๊ณผ readiness barrier๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ ๋ฉ”์‹œ ๋™๊ฒฐยท๊ทธ๋ž˜ํ”„ ํ˜•์„ฑยท๋Ÿฐํƒ€์ž„ profile schedule์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์ค„ ๋‹จ์œ„ .kpl DSL ์ž์ฒด๋ฅผ ์ง์ ‘ ์ฝ์ง€๋Š” ์•Š์œผ๋ฏ€๋กœ ํ•ด๋‹น ๋ช…๋ น์„ phase๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Action ์—ญํ• 
join Agent ์šฉ๋Ÿ‰์„ ๊ณ ๋ คํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
wait-ready ํ•„์š”ํ•˜๋ฉด ์ง€์ • job ์™„๋ฃŒ ๋˜๋Š” minCount ํ•˜ํ•œ์„ ๋จผ์ € ํ™•์ธํ•œ ๋’ค ๊ทธ๋ฃน/type์˜ ๋ชฉํ‘œ ์ค€๋น„์œจ์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
publish ์ค€๋น„๋œ ๋…ธ๋“œ๋ฅผ ๊ทธ๋ฃน์—์„œ ์„ ํƒํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค. deliveryWindow๋Š” ๋ฉ”์‹œ์ง€๋ณ„ ์ˆ˜์‹  ๊ธฐํ•œ์ž…๋‹ˆ๋‹ค(๊ธฐ๋ณธ 10s, ์–‘์ˆ˜, ์ตœ๋Œ€ 1h).
mesh-freeze Version 3 ์ „์šฉ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฃน, KPL node ID ๋˜๋Š” libp2p Peer ID๋กœ ์„ ํƒํ•œ Peer์˜ GossipSub ๋ฉ”์‹œ๋ฅผ ๋™๊ฒฐํ•˜๊ณ  ์ ์šฉ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
schedule Version 3 ์ „์šฉ์ž…๋‹ˆ๋‹ค. ์ง€์ •ํ•œ ์‹œ๊ฐ์— ์„ ํƒํ•œ ๊ธฐ์กดยท์ดํ›„ ์ž…์žฅ Peer์˜ ๋Ÿฐํƒ€์ž„ profile ์„ค์ •์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
topology Version 3 ์ „์šฉ์ž…๋‹ˆ๋‹ค. ์„ ํƒํ•œ Peer์— ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—ฐ๊ฒฐ์„ ์ค€๋น„ํ•œ ๋’ค ์ง€์ • ํ† ํ”ฝ์˜ ๋ฉ”์‹œ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๋™๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
leave ์ง€์ • ๊ทธ๋ฃน์—์„œ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
wait / sleep ์ง€์ • ์‹œ๊ฐ„ ๋™์•ˆ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. sleep์€ v2 ํ˜ธํ™˜ alias์ž…๋‹ˆ๋‹ค.
wait-jobs jobs์— ์ง€์ •ํ•œ background job์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ, ๋ชฉ๋ก์ด ๋น„์–ด ์žˆ์œผ๋ฉด ๋ชจ๋“  job์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
log Controller ๋กœ๊ทธ์— ์‹œ๋‚˜๋ฆฌ์˜ค ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
stop-all / reset ๋ชจ๋“  background job์„ ์ทจ์†Œํ•˜๊ณ  ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ๋’ค run generation fence๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๋‹น ์‹คํ—˜์˜ ํ˜„์žฌ ๋ฐ ์ด์ „ Peer generation์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. reset์€ alias์ž…๋‹ˆ๋‹ค.

join์—์„œ count๋Š” ์ •ํ™•ํ•œ ์ƒ์„ฑ ์ž‘์—… ์ˆ˜์ž…๋‹ˆ๋‹ค. publish์™€ leave์—์„œ๋Š” ์กฐ๊ฑด์— ๋งž๋Š” ํ›„๋ณด ๋…ธ๋“œ ์ˆ˜๋กœ ์ œํ•œ๋˜๋Š” ์ตœ๋Œ“๊ฐ’์ด๋ฉฐ, publish ํ›„๋ณด๋Š” PubSub์™€ ๋ฐœํ–‰์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๊ณ  ์š”์ฒญํ•œ topic์— ์ฐธ์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. repeat๋Š” phase ์ „์ฒด๋ฅผ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ธ action์—์„œ parallel์€ replica์˜ ์ˆœ์ฐจ ๋˜๋Š” ๋™์‹œ ์‹คํ–‰์„ ์„ ํƒํ•˜๋ฉฐ parallelism์œผ๋กœ ์ตœ๋Œ€ ๋™์‹œ ์ž‘์—… ์ˆ˜๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. await์˜ ๊ธฐ๋ณธ๊ฐ’์€ true์ž…๋‹ˆ๋‹ค. false๋กœ ์„ค์ •ํ•˜๋ฉด job ์ด๋ฆ„์œผ๋กœ ์ถ”์ ๋˜๋Š” background job์ด ์‹œ์ž‘๋˜์–ด churn์ด๋‚˜ publish๊ฐ€ ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ๋‹ค์Œ phase๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„ wait-jobs์—์„œ ์ด๋ฆ„์œผ๋กœ ์„ ํƒํ•ด ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Profile schedules

Version 3์˜ schedule์€ ์„ ํƒํ•œ Peer์™€ ๊ฐ™์€ Run ์„ธ๋Œ€์—์„œ ์ดํ›„ ์ž…์žฅํ•˜๋Š” Peer์˜ ์œ ํšจ profile ์„ค์ •์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. group, profile, type, role, nodeIds, peerIds๋Š” ๊ต์ง‘ํ•ฉ์œผ๋กœ ์ ์šฉํ•˜๋ฉฐ groupยทprofileยทID ๋ชฉ๋ก ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Profile ์„ ํƒ์€ ์—ฌ๋Ÿฌ ๊ทธ๋ฃน์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ณ , group ์„ ํƒ์€ ๊ฐ™์€ profile์„ ์“ฐ๋Š” ๋‹ค๋ฅธ ๊ทธ๋ฃน์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Profile ์›๋ณธ๊ณผ ์ €์žฅ ์‹œ๋‚˜๋ฆฌ์˜ค YAML์€ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์  ID๋Š” ํ™œ์„ฑ Peer์— ๋Œ€์‘ํ•ด์•ผ ํ•˜๋ฉฐ, group/profile์— ํ˜„์žฌ Peer๊ฐ€ ์—†์–ด๋„ ์ดํ›„ ์ž…์žฅ ์„ค์ •์€ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์ ‘์ˆ˜๋˜์–ด ์‹œ์ž‘ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ๋„ ์ค€๋น„ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

- action: schedule
  group: workers
  profile: baseline
  job: conditions
  await: false
  timeout: 2m
  schedule:
    reference: phase-start
    changes:
      - after: 10s
        set:
          gossipsub: {params: {d: 8}}
          network: {delay: 100ms}
      - after: 30s
        set:
          gossipsub: {params: {d: 6}}
          network: {delay: 10ms}
Schedule ํ•„๋“œ ๊ณ„์•ฝ
reference ๊ธฐ๋ณธ phase-start, ์„ ํƒ์ ์œผ๋กœ ํ˜„์žฌ Run์˜ ์‹ค์ œ ์‹œ์ž‘ ๊ธฐ์ค€ experiment-start์ž…๋‹ˆ๋‹ค. ๊ฐ ๊ธฐํ•œ์€ Controller์˜ monotonic clock์— ํ•œ ๋ฒˆ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค.
changes 1โ€“128๊ฐœ์˜ ๋ˆ„์  ํŒจ์น˜์ž…๋‹ˆ๋‹ค. after๋Š” ํ•„์ˆ˜์ธ 0 ์ด์ƒ Go duration์ด๋ฉฐ ์—„๊ฒฉํžˆ ์ฆ๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 0s๋Š” ์ฆ‰์‹œ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ง€์—ฐ๋œ ๋ณ€๊ฒฝ์€ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•˜๊ณ  ์ด์ „ ์š”์ฒญ ์†Œ์š” ์‹œ๊ฐ„์„ ๋‹ค์Œ ๊ธฐํ•œ์— ๋”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
set.gossipsub.params d, dLow, dHigh, dScore, dOut, dLazy, gossipFactor, hopwaveFactor, hopwaveInterval์ž…๋‹ˆ๋‹ค. ์ƒ๋žตํ•œ ๊ฐ’์€ ์œ ์ง€ํ•˜๊ณ  ์œ ํšจํ•œ ๋ช…์‹œ์  0์„ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ํ•ฉ์„ฑํ•œ degree ๋ฒ”์œ„๊ฐ€ ์œ ํšจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
set.network Delay, jitter, loss, rate, scope, queue/TBF ๋“ฑ์˜ ๊ตฌ์ฒด์  ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค. ์ด ์œ„์น˜์˜ ์ค‘์ฒฉ scheduleยทdelayDistribution์€ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
Phase timeout ๊ฐ ๋ณ€๊ฒฝ ์‹œ์ ๋ถ€ํ„ฐ ๊ธฐ๋ณธ 2m์ด๋ฉฐ ์ž…์žฅ ์กฐ์ •ยทready ๋Œ€๊ธฐยท์ค€๋น„ยท์ ์šฉ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. after๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.
Phase await, job ๊ธฐ์กด ์ถ”์  ์žก๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ await: true๋Š” ์ „์ฒด ๋ณ€๊ฒฝ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๋ฐœํ–‰ยทchurn๊ณผ ๋ณ‘ํ–‰ํ•˜๋ ค๋ฉด await: false์™€ wait-jobs ๋˜๋Š” onExit: drain์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‚˜์—ดํ•œ ๋Ÿฐํƒ€์ž„ ์„ค์ •์„ ์ง€์›ํ•˜๋ฉฐ routerยทtopicsยทheartbeat timerยทqueue ํฌ๊ธฐยทscoring ๋“ฑ์˜ ์ƒ์„ฑ ์„ค์ •์€ ์ด ์•ก์…˜์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. GossipSub ๋ณ€๊ฒฝ์—๋Š” ํ™œ์„ฑ GossipSub๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Degree ์กฐ์ •์€ ์ผ๋ฐ˜ heartbeat๋ฅผ ๋”ฐ๋ฅด๋ฉฐ ์ด๋ฏธ ๋™๊ฒฐ๋œ ๋ฉ”์‹œ ๋ฉค๋ฒ„์‹ญ์€ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์„ค์ • ๋ณ€๊ฒฝ์ด ์ฆ‰์‹œ ๋ชฉํ‘œ degree ๋‹ฌ์„ฑ์„ ๋ณด์žฅํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. HopWave factor/interval ๋ณ€๊ฒฝ์€ ๊ธฐ์กด ํ™œ์„ฑํ™” ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Group/profile ์„ ํƒ์€ validation์—์„œ ํ˜„์žฌ ์„ธ๋Œ€์˜ ์ดํ›„ join์„ ํฌํ•จํ•œ ๋ชจ๋“  ํ•ด๋‹น join๊ณผ ์ด schedule์˜ ๋ˆ„์  ์„ค์ •์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ID ์„ ํƒ์€ ์‹ค์ œ ๋Œ€์ƒ์„ runtime์—์„œ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ๋ณ€๊ฒฝ ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์žˆ๋Š” join์—๋Š” ์ดˆ๊ธฐ ์ œํ•œ์ด ์—†์–ด๋„ NET_ADMIN์„ ์ž๋™ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑ network.schedule์ด ์žˆ๋Š” Peer์—๋Š” schedule์˜ ๋„คํŠธ์›Œํฌ ํŒจ์น˜๋ฅผ ํ•จ๊ป˜ ์ ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ GossipSub๋งŒ ๋ฐ”๊พธ๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ธฐ์กด ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ ํƒ€์ด๋จธ์™€ ๋ณ‘ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Delay๋งŒ ๋ฐ”๊พธ๋ฉด qdisc ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๊ตฌ์กฐ์  ๋ณ€๊ฒฝ์€ ๊ธฐ์กด netem ๊ต์ฒด ๋™์ž‘์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

Controller๋Š” ๊ธฐ์กด ๋Œ€์ƒ ์ „์ฒด๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  ๋ชจ๋“  prepare ์‘๋‹ต์„ ๋ฐ›์€ ๋‹ค์Œ ๊ฐ™์€ ์ค€๋น„ ๊ฐ’์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ ์š”์ฒญ์€ ์ตœ๋Œ€ 16๊ฐœ์ž…๋‹ˆ๋‹ค. ์ด ์ž‘์—…๊ณผ ์‹ ๊ทœ ์ž…์žฅ์„ ์กฐ์ •ํ•˜์—ฌ ์ด๋ฏธ ์ ‘์ˆ˜ํ•œ Peer๋Š” ๋Œ€์ƒ์— ํฌํ•จํ•˜๊ณ  ์ดํ›„ ์ž…์žฅ Peer์—๋Š” ์„ฑ๊ณตํ•œ ํŒจ์น˜๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์š”์ฒญ ํ•œ๋„๋Š” Peer 8์ดˆยทAgent 10์ดˆยทController 12์ดˆ์ž…๋‹ˆ๋‹ค. HTTPยทOS ์Šค์ผ€์ค„๋ง๊ณผ ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด์œผ๋กœ ์ ์šฉ์ด ๋Šฆ์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์˜ ๋™์‹œ ์ ์šฉ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Apply๊ฐ€ ์‹œ์ž‘๋œ ํ›„ ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ์‘๋‹ต์ด ๋ˆ„๋ฝ๋˜๋ฉด ์ผ๋ถ€๋งŒ ์ ์šฉ๋์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ก์…˜๊ณผ Run์€ ์‹คํŒจํ•˜๋ฉฐ ์ž๋™ apply ์žฌ์‹œ๋„๋‚˜ ๋ถ„์‚ฐ ๋กค๋ฐฑ์€ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ์šฉ ์‹คํŒจ Peer๋Š” ํ›„์† profile ๋ณ€๊ฒฝ์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. Agent๊ฐ€ ๋„คํŠธ์›Œํฌ ์ ์šฉ์„ ํ™•์ธํ•˜์ง€ ๋ชปํ•˜๋ฉด ๋‹ค์‹œ ๊ด€์ธก๋  ๋•Œ๊นŒ์ง€ ํ˜„์žฌ ์กฐ๊ฑด์„ pending์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

stop-all/reset์€ schedule ์žก์„ ์ทจ์†Œํ•˜๊ณ  ์ข…๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ๋’ค ๋‹ค์Œ ์„ธ๋Œ€์˜ ์ƒ์† ํŒจ์น˜๋ฅผ ๋น„์›๋‹ˆ๋‹ค. ์ค‘์ง€ยท์‹คํŒจยท์ž์—ฐ ์ข…๋ฃŒ์˜ onExit: cancel์€ ๋‚จ์€ ํƒ€์ด๋จธ๋ฅผ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค. ์ž์—ฐ ์™„๋ฃŒ ํ›„ ์œ ์ง€๋˜๋Š” Peer๋Š” ๋งˆ์ง€๋ง‰ ์ ์šฉ ์„ค์ •์„ ์œ ์ง€ํ•˜๊ณ  Controller ์˜ˆ์•ฝ ์žก์€ ๋‚จ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์žฌ์‹œ๋„ยท์ด์–ดํ•˜๊ธฐยท๋ฐ˜๋ณต Run์€ ์›๋ž˜ profile๊ณผ ์ƒˆ ์˜ˆ์•ฝ ์ƒํƒœ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ schedule์€ ์ ์šฉ ์‹œ ์ง๋ ฌํ™”ํ•˜๋ฉฐ ๊ฐ™์€ ๊ธฐํ•œ์— ๊ฒน์น˜๋Š” ์„ ํƒ์ž์˜ ์ˆœ์„œ๋ฅผ seed๋กœ ๊ณ ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๋ฉด ํ•˜๋‚˜์˜ ๋ณ€๊ฒฝ ๋ชฉ๋ก์ด๋‚˜ ๋ช…์‹œ์  ์žก ์žฅ๋ฒฝ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Controller schedule_change๋Š” ์š”์ฒญ ํŒจ์น˜ยทrevisionยท๋‹จ๊ณ„ยท์‘๋‹ต ์ˆ˜ยท์ง€์—ฐ์„ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. Peer profile_config_applied๋Š” ํ™•์ธํ•œ ์œ ํšจ ์„ค์ •์„, profile_config_failed๋Š” ๋ถˆ์™„์ „ ์ ์šฉ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์„ค์ • ๊ด€์ธก์ด๋ฉฐ ์ธก์ • ์ง€์—ฐ์ด๋‚˜ ๋ฉ”์‹œ ์ˆ˜๋ ด์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ๋ช…๋ น API์™€ ์ „์ฒด ์˜ˆ์ œ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค. ControllerยทAgentยทPeer ์ด๋ฏธ์ง€๋ฅผ ํ•จ๊ป˜ ์žฌ๋นŒ๋“œยท๋ฐฐํฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Mesh freeze

๋Œ€์ƒ Peer๋ฅผ ์ƒ์„ฑํ•  ๋•Œ gossipsub.meshFreeze: true๋ฅผ ์ผœ๊ณ  ์ค€๋น„ ํ™•์ธ๊ณผ ์ ์ ˆํ•œ ์•ˆ์ •ํ™” ๋Œ€๊ธฐ ๋’ค์— mesh-freeze๋ฅผ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค. ์ค€๋น„ ํ™•์ธ๋งŒ์œผ๋กœ ๋ฉ”์‹œ ์ˆ˜๋ ด์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ณ ์ • ๊ตฌ์„ฑ์›, ์—ฐ๊ฒฐ ๋Š๊น€, topic ๋ณ€๊ฒฝ๊ณผ ๊ณ„์†๋˜๋Š” ๋ฉ”์‹œ์ง€ ํŠธ๋ž˜ํ”ฝ์˜ ์˜๋ฏธ๋Š” ํ”„๋กœํ† ์ฝœ ๋ ˆํผ๋Ÿฐ์Šค์—์„œ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

version: 3
name: fixed-mesh
profiles:
  fixed:
    type: full
    gossipsub:
      meshFreeze: true
phases:
  - action: join
    group: workers
    profile: fixed
    count: 8
    parallel: true
  - action: wait-ready
    group: workers
  - action: wait
    duration: 15s
  - action: mesh-freeze
    group: workers
    timeout: 30s
  - action: stop-all

๋‹ค์Œ ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์˜ ์„ ํƒ์ž๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์„ ํƒ์ž ์˜๋ฏธ
group ํ˜„์žฌ Runยทgeneration์œผ๋กœ ์ œํ•œํ•œ ํ•ด๋‹น ์‹œ๋‚˜๋ฆฌ์˜ค ๊ทธ๋ฃน์˜ ๋น„์ข…๋ฃŒ Peer ์ „์ฒด์ž…๋‹ˆ๋‹ค.
nodeIds /api/v1/nodes์—์„œ ๋ฐ˜ํ™˜ํ•œ ์ •ํ™•ํ•œ KPL node id ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ์‹คํ–‰๋ณ„๋กœ ์ƒ์„ฑ๋˜๋ฉฐ libp2p ID์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
peerIds /api/v1/nodes์—์„œ ๋ฐ˜ํ™˜ํ•œ ์ •ํ™•ํ•œ libp2p peerId ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ๊ฐ๊ฐ ์™„์ „ํ•˜๊ณ  ์œ ํšจํ•œ libp2p Peer ID์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
type, role ์ถ”๊ฐ€ ํ•„ํ„ฐ์ด๋ฉฐ role์€ boot ๋˜๋Š” worker์ž…๋‹ˆ๋‹ค. ํ•„์ˆ˜ ๊ทธ๋ฃน/ID ์„ ํƒ์ž๋ฅผ ๋Œ€์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•œ ๋ชฉ๋ก์˜ ID๋Š” OR ์กฐ๊ฑด์ด๊ณ  ์„œ๋กœ ๋‹ค๋ฅธ ํ•„๋“œ๋Š” ๊ต์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. ๋ช…์‹œํ•œ ๋ชจ๋“  ID๊ฐ€ ํ˜„์žฌ Runยทgeneration์˜ ๊ต์ง‘ํ•ฉ ์•ˆ์—์„œ ํ™•์ธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ID, group/type/role ํ•„ํ„ฐ ๋ถˆ์ผ์น˜, ์ค‘๋ณต๋˜๊ฑฐ๋‚˜ ๋นˆ ID, ๋นˆ ์„ ํƒ ๊ฒฐ๊ณผ๋Š” ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฃน ์„ ํƒ์—์„œ๋Š” ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ ์‹คํŒจํ•œ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ๋œ ๋ชจ๋“  Peer๊ฐ€ ready ์ƒํƒœ์ด๊ณ  meshFreeze: true๋ฅผ ์ผ  GossipSub๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ํ•ด๋‹น Agent๊ฐ€ online์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์ „ ๊ฒ€์‚ฌ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์ „์ฒด ์„ ํƒ ๋Œ€์ƒ์— ๋ช…๋ น์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์ž…์žฅํ•œ Peer๋Š” ํ›„์† ๋ช…๋ น์œผ๋กœ ๋™๊ฒฐํ•˜์‹ญ์‹œ์˜ค. ์•ž์„  ๊ทธ๋ฃน ๋ช…๋ น์ด ๋ฏธ๋ž˜ ๊ตฌ์„ฑ์›์—๊ฒŒ ์ ์šฉ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

Phase๋Š” ์„ ํƒํ•œ ๋ชจ๋“  Peer์˜ ์ ์šฉ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. timeout์€ ์ „์ฒด ์„ ํƒ ๋Œ€์ƒ์˜ ์ „์†ก๊ณผ ์ ์šฉ ์‘๋‹ต์„ ํ•จ๊ป˜ ์ œํ•œํ•˜๋ฉฐ ๊ธฐ๋ณธ 30s, ์–‘์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ Agentโ†’Peer ์š”์ฒญ๊ณผ Peer handler์˜ ์ œํ•œ์€ ๊ณ„์† 10์ดˆ์ด๋ฏ€๋กœ phase timeout์„ ๋Š˜๋ ค๋„ ๊ฐœ๋ณ„ ์š”์ฒญ์˜ ์ œํ•œ์‹œ๊ฐ„์€ ๋Š˜์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต ๋™๊ฒฐ์€ ๋ฉฑ๋“ฑ์ด๋ฏ€๋กœ repeat๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด action์—๋Š” await: false, parallel: true, parallelism, count, interval, lifetime, topic, onError๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋™์‹œ ์š”์ฒญ ์ˆ˜๋ฅผ ์ œํ•œํ•˜์—ฌ ๋Œ€์ƒ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ „์†ก ์‹œ์ž‘ ๋’ค ์˜ค๋ฅ˜๋‚˜ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ผ๋ถ€๋งŒ ๋™๊ฒฐ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„ฑ๊ณต ์‘๋‹ต๋„ ์—ฌ๋Ÿฌ Peer์˜ ๋™์‹œ ์ ์šฉ์„ ๋œปํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋™๊ฒฐ ํ•ด์ œ action์€ ์—†์Šต๋‹ˆ๋‹ค.

examples/scenario-v3-mesh-freeze.yaml์€ ๋™๊ฒฐ ํ›„ ๋ฐœํ–‰๊นŒ์ง€ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค. ์‹คํ–‰ ์ค‘ HTTP ์š”์ฒญ ํ˜•์‹์€ ๋‚ด๋ถ€ API ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

Topology formation

๋„๋ฉ”์ธ์€ ์„ ํƒํ•œ ๊ธฐ์กด Peer์˜ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. Mesh freeze์™€ ๊ฐ™์€ group, nodeIds, peerIds, type, role ๊ต์ง‘ํ•ฉ ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋Œ€์ƒ์€ ํ˜„์žฌ Runยทgeneration์—์„œ ready ์ƒํƒœ์ด๋ฉฐ ์—ฐ๊ฒฐ ์ฃผ์†Œ๊ฐ€ ์žˆ๊ณ , GossipSub์™€ meshFreeze: true๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉฐ ๋ช…์‹œํ•œ topic์„ ๊ตฌ๋…ํ•˜๊ฑฐ๋‚˜ relayํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. count๋Š” ์„ ํƒ์ ์ด๋ฉฐ ์–‘์ˆ˜์ด๋ฉด ์„ ํƒํ•œ Peer ์ˆ˜๊ฐ€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Peer๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ผ๋ถ€๋ฅผ ์ถ”์ถœํ•˜๋Š” ๊ฐ’์ด ์•„๋‹ˆ๋ฏ€๋กœ ์•ž์„  join๊ณผ wait-ready๋กœ ๊ฐœ์ฒด ์ˆ˜๋ฅผ ์ค€๋น„ํ•˜์‹ญ์‹œ์˜ค.

๋ช…์‹œ์ ์ธ ID ์—†์ด ๊ทธ๋ฃน์œผ๋กœ ์„ ํƒํ•˜๋ฉด ์‹œ๋‚˜๋ฆฌ์˜ค ๊ฒ€์ฆ์€ ๋งˆ์ง€๋ง‰ stop-all/reset ์ดํ›„์— ์กฐ๊ฑด์— ๋งž๋Š” ์„ ํ–‰ join์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋“  join์˜ presetยทprofileยท๊ฐœ๋ณ„ override๋ฅผ ๊ฒฐํ•ฉํ•œ ์„ค์ •์— gossipsub.meshFreeze: true๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋žตํ•˜๊ฑฐ๋‚˜ false์ด๋ฉด topology phase, ๊ทธ๋ฃน, ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” join ์ด๋ฆ„์„ ํฌํ•จํ•œ ์˜ค๋ฅ˜๋กœ ๊ฒ€์ฆ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. type/role ํ•„ํ„ฐ๋ฅผ ๋ฐ˜์˜ํ•˜๊ณ  background join๋„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€์ฆ ๋‹จ๊ณ„์—์„œ๋Š” ์–ด๋–ค Peer๊ฐ€ ์‚ด์•„๋‚จ๋Š”์ง€ ์˜ˆ์ธกํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ leave๋‚˜ lifetime ์„ค์ •์ด ์žˆ์–ด๋„ ๊ฐ™์€ reset ๊ตฌ๊ฐ„์˜ ํ•ด๋‹น join์„ ๋ชจ๋‘ ๋ณด์ˆ˜์ ์œผ๋กœ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ID ์„ ํƒ(group๊ณผ ID๋ฅผ ํ•จ๊ป˜ ์ง€์ •ํ•œ ๊ฒฝ์šฐ ํฌํ•จ)์€ ์‹คํ–‰ ์‹œ ๋Œ€์ƒ์„ ํ™•์ •ํ•˜๊ณ , ๋ชจ๋“  ์„ ํƒ Peer๋ฅผ ๊ฒ€์‚ฌํ•œ ๋’ค ๋ช…๋ น์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. topology๊ฐ€ ์ด ๊ธฐ๋Šฅ์„ ์ž๋™์œผ๋กœ ํ™œ์„ฑํ™”ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์„ ํƒํ•œ Peer 500๊ฐœ์— Erdล‘sโ€“Rรฉnyi ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“œ๋Š” ์˜ˆ์ž…๋‹ˆ๋‹ค.

- action: topology
  group: domain-a
  count: 500
  topic: kpl/graph
  timeout: 5m
  topology:
    model: er
    p: 0.05
    seed: 1001

์ „์ฒด 500-Peer ์˜ˆ์ œ๋Š” ์ƒ์„ฑยท์ค€๋น„ยท๋ฐœํ–‰ยท์ •๋ฆฌ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. Worker์™€ bootstrap Peer๋ฅผ ์ˆ˜์šฉํ•  Swarm ์šฉ๋Ÿ‰์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. topology๊ฐ€ ๊ทธ๋ž˜ํ”„ ์„ค์น˜์™€ ๋™๊ฒฐ์„ ํ•จ๊ป˜ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ๋ณ„๋„ mesh-freeze phase๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ๋™๊ฒฐํ•œ ๋‹ค๋ฅธ ๋ฉ”์‹œ๋Š” ๊ต์ฒดํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ๋‹ค๋ฅธ ๊ทธ๋ž˜ํ”„์—๋Š” ์ƒˆ Peer ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

topology ๋ธ”๋ก์˜ ๋ชจ๋ธ ํ‚ค๋Š” ์•„๋ž˜ ์†Œ๋ฌธ์ž์ด๋ฉฐ ํ‘œ์‹œ๋œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ชจ๋‘ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋ธ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋ธ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ž˜ํ”„ ์ •์˜
er [0,1]์˜ p G(n,p): ์ˆœ์„œ ์—†๋Š” ๊ฐ Peer ์Œ์„ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•๋ฅ  p์— ๋”ฐ๋ผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
ws ์ง์ˆ˜ k, 2 โ‰ค k < n; [0,1]์˜ p ๋…ธ๋“œ๋ณ„ k๊ฐœ ์ด์›ƒ์„ ๊ฐ–๋Š” ๊ณ ๋ฆฌ์—์„œ ํ™•๋ฅ  p๋กœ Wattsโ€“Strogatz ์žฌ๋ฐฐ์„ ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„์„  ์ˆ˜ nยทk/2๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
ba ์ •์ˆ˜ m, 1 โ‰ค m < n Barabรกsiโ€“Albert ์šฐ์„  ์—ฐ๊ฒฐ์ž…๋‹ˆ๋‹ค. ์ดˆ๊ธฐ m+1๊ฐœ ๋…ธ๋“œ๋Š” star์ด๋ฉฐ, ์ดํ›„ ์ƒˆ ๋…ธ๋“œ๋งˆ๋‹ค ๊ธฐ์กด degree์— ๋น„๋ก€ํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ์ด์ „ ๋…ธ๋“œ m๊ฐœ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
rgg ์œ ํ•œํ•œ radius โ‰ฅ 0 ๋‹จ์œ„ ์ •์‚ฌ๊ฐํ˜•์˜ ๊ท ๋“ฑ ์œ„์น˜์—์„œ Euclidean ๊ฑฐ๋ฆฌ โ‰ค radius์ธ ์Œ์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
waxman (0,1]์˜ alpha, beta ๋‹จ์œ„ ์ •์‚ฌ๊ฐํ˜•์˜ ๊ท ๋“ฑ ์œ„์น˜์—์„œ ํ™•๋ฅ  ฮฒยทexp(โˆ’d/(ฮฑยทL))๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. L์€ ์ „์ฒด ์Œ์˜ ์ตœ๋Œ€ ๊ฑฐ๋ฆฌ์ž…๋‹ˆ๋‹ค.
grid ์–‘์ˆ˜ rows, columns; ๊ณฑ์€ n ์—ด๋ฆฐ ์ง์‚ฌ๊ฐ ๊ฒฉ์ž์˜ ์ˆ˜ํ‰ยท์ˆ˜์ง ์ด์›ƒ์ด๋ฉฐ ํ–‰ ์šฐ์„ ์œผ๋กœ Peer๋ฅผ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.
triangular ์–‘์ˆ˜ rows, columns; ๊ณฑ์€ n ํ•œ ํ–‰์”ฉ ๋ฒˆ๊ฐˆ์•„ ๋ฐ˜ ์นธ ์ด๋™ํ•œ ์—ด๋ฆฐ ์‚ผ๊ฐ ๊ฒฉ์ž์ž…๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ๋…ธ๋“œ๋Š” ์ด์›ƒ 6๊ฐœ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

๋ชจ๋‘ ์ž๊ธฐ ๊ฐ„์„ ๊ณผ ์ค‘๋ณต์ด ์—†๋Š” ๋‹จ์ˆœ ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์ž…๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์„ฑ์€ ๋ชจ๋ธ์˜ ๊ฒฐ๊ณผ์ด๋ฉฐ, ๋ถ„๋ฆฌ๋œ ์„ฑ๋ถ„์„ ํ•ฉ์น˜๊ธฐ ์œ„ํ•œ ๊ฐ„์„ ์„ ์ž„์˜๋กœ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Gridยท์‚ผ๊ฐ ๊ฒฉ์ž๋Š” ์—ด๋ฆฐ ๊ฒฝ๊ณ„์ž…๋‹ˆ๋‹ค. ๊ธฐํ•˜ ์ขŒํ‘œ๋Š” ๊ฐ„์„ ์„ ๊ฒฐ์ •ํ•˜๊ณ  ๊ณ„ํš๊ณผ ํ•จ๊ป˜ ์ €์žฅํ•˜์ง€๋งŒ netem ์ง€์—ฐ์ด๋‚˜ Dashboard ๋ฐฐ์น˜๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ™•๋ฅ  ๋ชจ๋ธ์€ ๊ณต์‹ NetworkX์˜ ER, WS, BA, RGG, Waxman ์ •์˜๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. KPL ์ž์ฒด ์ƒ์„ฑ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๊ฐ™์€ seed๋ฅผ ๋„ฃ์—ˆ์„ ๋•Œ ๊ฐ„์„ ๊นŒ์ง€ ๊ฐ™๋‹ค๋Š” ๋œป์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋Œ€์ƒ์€ KPL node ID ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. topology.seed๋Š” 0์„ ํฌํ•จํ•ด ๋ช…์‹œํ•œ ๊ฒฝ์šฐ Run seed๋ณด๋‹ค ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ์ˆœ์„œ์˜ ๊ฐœ์ฒด ์ง‘ํ•ฉยทํŒŒ๋ผ๋ฏธํ„ฐยทseed๋Š” ๊ฐ™์€ ๊ทธ๋ž˜ํ”„๋ฅผ ์žฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ ์ƒํ•œ์€ Peer 10,000๊ฐœ์™€ ๋ฌด๋ฐฉํ–ฅ ๊ฐ„์„  1,000,000๊ฐœ์ด๋ฉฐ, ์ทจ์†Œ๋ฅผ ํ™•์ธํ•˜๊ณ  ์ƒํ•œ ์ดˆ๊ณผ ์‹œ ๋ช…๋ น ์ „์†ก ์ „์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ œ์–ด ์š”์ฒญ์€ 1 MiB๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

timeout์€ ๋Œ€์ƒ ์„ ํƒยท๊ทธ๋ž˜ํ”„ ์ƒ์„ฑยท์ค€๋น„ยท์ ์šฉ์„ ํ•ฉ์ณ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋žตํ•˜๋ฉด ์„ ํƒํ•œ Peer ์ˆ˜ N์— ๋”ฐ๋ผ 2m + 5s ร— (ceil(N / 16) โˆ’ 1)๋กœ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. 16๊ฐœ ์ดํ•˜๋Š” 2m, 500๊ฐœ๋Š” 4m35s, 1,000๊ฐœ๋Š” 7m10s์ž…๋‹ˆ๋‹ค. ์–‘์ˆ˜ timeout์„ ๋ช…์‹œํ•˜๋ฉด ๊ทธ ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ์ „์ฒด ์ƒํ•œ์ด ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์‹œ๋‚˜๋ฆฌ์˜ค์˜ timeout: 2m๋„ ์ž๋™์œผ๋กœ ์—ฐ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ ํƒ ์ธ์›์— ๋”ฐ๋ฅธ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•„๋“œ๋ฅผ ์ง€์šฐ๊ณ , ๊ทธ๋ž˜ํ”„์™€ ๋„คํŠธ์›Œํฌ์— ์‹œ๊ฐ„์ด ๋” ํ•„์š”ํ•˜๋ฉด ๋” ๊ธด ๊ฐ’์„ ์ง€์ •ํ•˜์‹ญ์‹œ์˜ค.

Peer ๋ช…๋ น์€ ์ตœ๋Œ€ 16๊ฐœ๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋ฉฐ ๊ฐ Peer์˜ ๋™์‹œ ์—ฐ๊ฒฐ ์‹œ๋„๋Š” ์ตœ๋Œ€ 4๊ฐœ์ž…๋‹ˆ๋‹ค. Controller๋Š” ์ผ์‹œ์ ์ธ ์ค€๋น„ ์‹คํŒจ๋งŒ ๊ฐ™์€ ์ „์ฒด ์ œํ•œ์‹œ๊ฐ„ ์•ˆ์—์„œ ๊ฐ™์€ ์ƒ์„ฑ ๊ณ„ํš์œผ๋กœ ์žฌ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ ์šฉ์€ ์ž๋™ ์žฌ์‹œ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์š”์ฒญ ์ œํ•œ์‹œ๊ฐ„๊ณผ ์žฌ์‹œ๋„ ์กฐ๊ฑดยท๊ฐ„๊ฒฉ์€ ํ† ํด๋กœ์ง€ API์— ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๋Œ€์ƒ์˜ ์ค€๋น„ ์‘๋‹ต์„ ๋ฐ›์€ ๋’ค์—๋งŒ ์ ์šฉ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ Peer๋Š” ์ •ํ™•ํ•œ ์ด์›ƒ์„ ๋‹ค์‹œ ๊ฒ€์‚ฌํ•˜๊ณ  ํ•œ ๋ฒˆ์˜ Router ์ž‘์—…์—์„œ ์„ค์น˜์™€ ๋ฉ”์‹œ ๋™๊ฒฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ง€์ • ํ† ํ”ฝ์„ ๊ต์ฒดํ•˜๋ฉฐ ๋‹ค๋ฅธ ๊ธฐ์กด ํ† ํ”ฝ์˜ ๋ฉค๋ฒ„์‹ญ์€ ์œ ์ง€ํ•œ ์ฑ„ ํ•จ๊ป˜ ๋™๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด degreeยทscoreยทbackoff ์„ ํƒ ๊ทœ์น™์œผ๋กœ ๋‹ค๋ฅธ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Direct peer, blacklistยทfilter๋กœ ๊ฑฐ์ ˆํ•œ ์ด์›ƒ๊ณผ mesh ๋ฏธ์ง€์› ํ”„๋กœํ† ์ฝœ์€ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

repeat๋Š” 1์ด์–ด์•ผ ํ•˜๋ฉฐ background job, parallel, parallelism, ๊ฐ„๊ฒฉยท์ˆ˜๋ช… ๋ฐ onError๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ค€๋น„๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์ƒ์„ฑํ•œ ๋ฉ”์‹œ๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š์ง€๋งŒ, ์ค€๋น„ ์ค‘ transport ์—ฐ๊ฒฐ์€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๊ณ  ๊ธฐ์กด GossipSub๋Š” ๊ณ„์† ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ ์šฉ์€ Peer๋ณ„๋กœ ์›์ž์ ์ด๋ฏ€๋กœ ๋„คํŠธ์›Œํฌ ์‹คํŒจ ์‹œ ์ผ๋ถ€๋งŒ ๋™๊ฒฐ๋˜๊ฑฐ๋‚˜ ์‘๋‹ต ์œ ์‹ค๋กœ ์„ฑ๊ณต์ด ํ™•์ธ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋Œ€์ƒ์˜ ์ •ํ™•ํ•œ ๊ณ„ํš ์‘๋‹ต์ด ์žˆ์–ด์•ผ phase๊ฐ€ ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ ์šฉํ•œ ๊ณ„ํš์€ ๊ฐ™์€ ๋‚ด์šฉ์œผ๋กœ ์žฌ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ rollback์ด๋‚˜ ๋™๊ฒฐ ํ•ด์ œ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์ด ๊ทธ๋ž˜ํ”„๋Š” GossipSub ๋ฉ”์‹œ๋ฅผ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค. TransportยทDHT ์—ฐ๊ฒฐ, directยทflood ๋ฐœํ–‰๊ณผ lazy gossip์€ ๊ธฐ์กด ๊ทœ์น™์„ ๋”ฐ๋ฅด๋ฏ€๋กœ ๋ฉ”์‹œ ๋ฐ– ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”„์™€ ํ•จ๊ป˜ ํ™œ์„ฑํ™”ํ•œ ํ”„๋กœํ† ์ฝœ์„ ์ˆ˜์šฉํ•˜๋„๋ก ์—ฐ๊ฒฐ ์˜ˆ์‚ฐ์„ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ์ œ๋Š” ์ถ”๊ฐ€ ์—ฐ๊ฒฐ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด Worker์˜ DHTยทtopic discovery๋ฅผ ๋„๊ณ  bootstrap๊ณผ ๊ธฐ์กด lazy ๋ณต๊ตฌ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ €์žฅ๋˜๋Š” topology_generated, ๋…ธ๋“œ๋ณ„ topology_assignment, topology_stage ์ด๋ฒคํŠธ์—๋Š” ์ƒ์„ฑ๊ธฐ ๋ฒ„์ „ยทseedยท์˜ˆ์ • ์ด์›ƒ๊ณผ ์‘๋‹ต ์ˆ˜๋ฅผ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. Peer์˜ topology_applied๋Š” ๋กœ์ปฌ ์„ค์น˜๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ • ๊ฐ„์„ ์€ ์‹ค์ œ ํ™œ์„ฑ ๋งํฌ์˜ ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ๋ผ์ด๋ธŒ ํ† ํด๋กœ์ง€๋Š” ๊ณ„์† ํ™œ์„ฑ ๋ฉ”์‹œ ๋ฉค๋ฒ„๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์ด์›ƒ ๋ชฉ๋ก์€ ์ตœ๊ทผ ์ด๋ฒคํŠธ ๋ชฉ๋ก์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ API๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

Phase ํ•„๋“œ์™€ ๊ธฐ๋ณธ๊ฐ’

ํ•„๋“œ ์ ์šฉ action ์˜๋ฏธ์™€ ๊ธฐ๋ณธ๊ฐ’
name, repeat ๋ชจ๋“  action ํ‘œ์‹œ ์ด๋ฆ„์€ ๊ธฐ๋ณธ์ ์œผ๋กœ <action>-<phase number>์ด๋ฉฐ repeat๋ฅผ ์ƒ๋žตํ•˜๊ฑฐ๋‚˜ 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด 1์ž…๋‹ˆ๋‹ค.
job, await join, publish, leave, schedule await: false๊ฐ€ background job์„ ๋งŒ๋“ค๋ฉฐ job์„ ์ƒ๋žตํ•˜๋ฉด phase-<phase number>์ž…๋‹ˆ๋‹ค. Job ID๋Š” stop-all๋กœ ์ถ”์  ์ƒํƒœ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์ „๊นŒ์ง€ ๊ณ ์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
group, count join, publish, leave ํ•„์ˆ˜ group๊ณผ ์–‘์ˆ˜ ์ž‘์—… ์ˆ˜์ž…๋‹ˆ๋‹ค. Publish์˜ ๊ฐ ๋ฐ˜๋ณต์€ ์กฐ๊ฑด์— ๋งž๋Š” ์„œ๋กœ ๋‹ค๋ฅธ publisher๋ฅผ ์ตœ๋Œ€ count๊ฐœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
type join, publish, leave, wait-ready Join preset์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์ ์šฉ ์™„๋ฃŒ๋œ type์œผ๋กœ ๊ธฐ์กด ๋…ธ๋“œ๋ฅผ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.
role, profile, node join Role์€ boot ๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’ worker์ด๋ฉฐ profile๊ณผ inline node ์„ค์ •์œผ๋กœ preset์„ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
placement, agentId join ๊ธฐ๋ณธ๊ฐ’ balanced๋Š” ๋‹ค์Œ Peer๋ฅผ ํฌํ•จํ•œ ์˜ˆ์ƒ ์ ์œ ๋Ÿ‰/์œ ํšจ Agent capacity(์›น ์˜ˆ์™ธ๊ฐ’ ํฌํ•จ)๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ ๊ณณ์„ ์„ ํƒํ•˜๊ณ  random์€ ๋…ธ๋“œ๋งˆ๋‹ค, single-agent๋Š” batch๋งˆ๋‹ค Agent ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์  agentId๋Š” ๋ฐฐ์น˜๋ฅผ ๊ณ ์ •ํ•˜๋ฉฐ admission์€ ๊ฐ€์šฉ ์šฉ๋Ÿ‰์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
parallel, parallelism join, publish, leave ๊ธฐ๋ณธ๊ฐ’์€ ์ˆœ์ฐจ ์‹คํ–‰์ž…๋‹ˆ๋‹ค. Parallel์„ ์ผœ๊ณ  parallelism์„ ์ƒ๋žตํ•˜๊ฑฐ๋‚˜ 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด batch ์ „์ฒด์˜ ๋™์‹œ ์‹คํ–‰์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œํ•œ ๊ฐ’์€ ์‹คํ–‰ ์ค‘์ธ ์ž‘์—…๋ฟ ์•„๋‹ˆ๋ผ worker goroutine ์ˆ˜๋„ ์ œํ•œํ•˜๋ฉฐ, ๋Œ€๊ธฐ ์ค‘์ธ publish์˜ ์ง€์—ฐ ์‹œ๊ฐ„์€ batch ์‹œ์ž‘ ์‹œ์  ๊ธฐ์ค€์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
interval, lifetime ๊ฐ„๊ฒฉ์ด ์žˆ๋Š” ์ž‘์—…; lifetime์€ join๋งŒ ์•„๋ž˜ ์‹œ๊ฐ„ ๊ทœ์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. Peer lifetime์€ ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ์„ฑ๊ณต ํ›„ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ ์„ค์ • ๋ณต์‚ฌ, start, bootstrap์„ ํฌํ•จํ•˜๋ฉฐ background job ์™„๋ฃŒ์™€ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค.
topic, payloadSize, payloadEncoding publish Topic ๊ธฐ๋ณธ๊ฐ’์€ publisher์˜ ์ฒซ ์„ค์ • topic์ด๋ฉฐ '*'๋Š” ์„ค์ •ํ•œ ๋ชจ๋“  topic์œผ๋กœ ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค. 0 ์ดํ•˜ payloadSize๋Š” 32๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉฐ 16 MiB๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฐ’์€ ์‹œ๋‚˜๋ฆฌ์˜ค ๊ฒ€์ฆ์—์„œ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’ envelope๋Š” JSON/base64 metadata๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  raw๋Š” PubSub data๋ฅผ ์ •ํ™•ํžˆ payloadSize byte๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
deliveryWindow, onError publish; onError๋Š” leave์—๋„ ์ ์šฉ Window ๊ธฐ๋ณธ๊ฐ’์€ 10s์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’ onError: fail ๋Œ€์‹  continue๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ณ„ ์ž‘์—… ์‹คํŒจ๋ฅผ ๊ธฐ๋กํ•˜๊ณ  churn์„ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค. Publish ํ›„๋ณด๊ฐ€ ์—†์„ ๋•Œ continue๋Š” ์•„๋ฌด ์ž‘์—… ์—†์ด ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค.
group, type, readyRatio, minCount, jobs, timeout wait-ready ๋นˆ group/type์€ ํ˜„์žฌ generation์˜ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค. Ratio ๊ธฐ๋ณธ๊ฐ’์€ 1์ด๋ฉฐ ์œ ํ•œํ•œ (0, 1] ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Timeout ๊ธฐ๋ณธ๊ฐ’์€ 1m์ด๋ฉฐ job ๋Œ€๊ธฐ์™€ readiness๋ฅผ ํ•จ๊ป˜ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. minCount๋Š” cohort ํฌ๊ธฐ์˜ ํ•˜ํ•œ์ž…๋‹ˆ๋‹ค.
jobs, timeout wait-jobs ๋นˆ jobs๋Š” ์ถ”์ ํ•˜๋Š” ๋ชจ๋“  job์„ ๋œปํ•˜๋ฉฐ timeout ๊ธฐ๋ณธ๊ฐ’์€ 5m์ž…๋‹ˆ๋‹ค.
group, nodeIds, peerIds, type, role, timeout mesh-freeze Version 3์˜ ์„ ํƒ์ž๋Š” ๊ต์ง‘ํ•ฉ์ด๋ฉฐ ์ ์šฉ ์‘๋‹ต๊นŒ์ง€ ํฌํ•จํ•œ phase ์ „์ฒด timeout์€ ๊ธฐ๋ณธ 30s์ž…๋‹ˆ๋‹ค. Mesh freeze๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.
topology, topic, count, group, nodeIds, peerIds, type, role, timeout topology Version 3์˜ ์„ ํƒํ•œ Peer ๋Œ€์ƒ ๊ทธ๋ž˜ํ”„ ํ˜•์„ฑ์ž…๋‹ˆ๋‹ค. ํ† ํ”ฝ์€ ํ•„์ˆ˜์ด๋ฉฐ ์„ ํƒ์  count๋Š” ๊ฐœ์ฒด ์ˆ˜๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. Timeout์„ ์ƒ๋žตํ•˜๋ฉด ์„ ํƒ ์ธ์›์— ๋”ฐ๋ผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ํ† ํด๋กœ์ง€ ํ˜•์„ฑ์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.
schedule, group, profile, nodeIds, peerIds, type, role, timeout schedule Profile schedules๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค. Timeout์€ ๊ฐ ๋ณ€๊ฒฝ ์‹œ์ ๋ถ€ํ„ฐ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
duration; message wait / sleep; log ์–‘์ˆ˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„๊ณผ Controller ๋กœ๊ทธ ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค.

phase ๋ชฉ๋ก์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋๋‚ฌ์„ ๋•Œ background job์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์€ ์ตœ์ƒ์œ„ onExit์œผ๋กœ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’ cancel์€ ๋‚จ์€ job์„ ์ทจ์†Œํ•œ ๋‹ค์Œ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. onExit: drain์€ job์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๋‹จ์ผ ์‹คํ–‰์˜ ์ž์—ฐ์Šค๋Ÿฌ์šด ์„ฑ๊ณต์—๋Š” ์ด job ์ •์ฑ…๋งŒ ์ ์šฉํ•˜๋ฉฐ, ๋ช…์‹œ์ ์ธ stop-all phase๊ฐ€ ์—†์œผ๋ฉด Peer ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. Dashboard/API์—์„œ repetitions > 1๋กœ ์ œ์ถœํ•œ ๋ฐฐ์น˜๋Š” ๋งˆ์ง€๋ง‰ iteration์„ ํฌํ•จํ•œ ๋งค iteration ์ข…๋ฃŒ ๋•Œ Peer๋ฅผ ์ž๋™์œผ๋กœ fenceํ•˜๊ณ  ์ •๋ฆฌํ•˜์—ฌ ๋‹ค์Œ ์‹คํ–‰๊ณผ ๊ฒน์น˜์ง€ ์•Š๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” YAML phase์˜ repeat์™€ ๋ณ„๊ฐœ์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

jobShutdownTimeout์˜ ๊ธฐ๋ณธ๊ฐ’์€ 3m์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๋˜๋Š” API ์š”์ฒญ์ด scenario๋ฅผ ์ทจ์†Œํ•˜๊ฑฐ๋‚˜ phase ๋˜๋Š” background job์ด ์‹คํŒจํ•˜๋ฉด Controller๋Š” ๋‚จ์€ job์„ ์ทจ์†Œํ•˜๊ณ  ์ด ์ œํ•œ ์•ˆ์—์„œ ์ข…๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ๋’ค, ๋ชจ๋“  Agent์— ํ˜„์žฌ generation๊นŒ์ง€ generation fence๋ฅผ ์„ค์ •ํ•˜๊ณ  Peer๋ฅผ ์ •๋ฆฌํ•˜๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์ธ stop-all๋„ ๊ฐ™์€ ์ œํ•œ ์‹œ๊ฐ„ ๋‚ด job ์ข…๋ฃŒ๋ฅผ ์ ์šฉํ•˜๊ณ  job ์ถ”์  ์ƒํƒœ๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ ๋’ค ํ˜„์žฌ run generation์„ fence๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Agent๋Š” ์ผ์น˜ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ๋‹จ์กฐ ์ฆ๊ฐ€ํ•˜๋Š” fence๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ generation N์˜ ๋Šฆ์€ create๋Š” fence๋ณด๋‹ค ๋จผ์ € ์™„๋ฃŒ๋˜์–ด cleanup์— ํฌํ•จ๋˜๊ฑฐ๋‚˜, generation์ด fence ์ดํ•˜์ด๋ฏ€๋กœ ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค. stop-all์ด ์„ฑ๊ณตํ•˜๋ฉด scenario๋Š” generation N+1๋กœ ์ง„ํ–‰ํ•˜๋ฏ€๋กœ ์ดํ›„ phase์—์„œ ๊ฐ™์€ run ID๋กœ ์ƒˆ ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  job ID๋„ ๋‹ค์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

wait-ready๋Š” ์‹คํŒจ, ์ข…๋ฃŒ ์ค‘, ์ข…๋ฃŒ๋œ ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ ํ˜„์žฌ run generation์—์„œ ์กฐ๊ฑด์— ๋งž๋Š” ์ „์ฒด cohort๋ฅผ ๊ฒ€์‚ฌํ•˜๋ฉฐ ์ด์ „ generation์˜ ๋…ธ๋“œ๋Š” ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. cohort์— ์‹คํŒจํ•œ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ์œผ๋ฉด barrier๋Š” ์„ฑ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ค€๋น„ ์ƒํƒœ๋กœ ๋ณด๊ณ ๋œ ๋…ธ๋“œ๋„ ํ•ด๋‹น Agent๊ฐ€ online์ผ ๋•Œ๋งŒ ready ์ˆ˜์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด cohort ์—ญ์‹œ ์ง€๊ธˆ๊นŒ์ง€ ๊ด€์ธก๋œ ๋…ธ๋“œ๋กœ๋งŒ ๊ตฌ์„ฑ๋˜๋ฏ€๋กœ await: false join ๋‹ค์Œ์˜ wait-ready์—๋Š” jobs: [job-id] ๋˜๋Š” minCount ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. jobs๋Š” ์ง€์ • producer job์ด ์™„๋ฃŒ๋œ ๋’ค readiness๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. minCount๋Š” producer๋ฅผ ๊ณ„์† ์‹คํ–‰ํ•˜๋ฉด์„œ ์ผ๋ถ€๋งŒ ์ƒ์„ฑ๋œ ๊ทธ๋ฃน์ด ์ค€๋น„์œจ์„ ๋„ˆ๋ฌด ์ผ์ฐ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

parallel await ๋™์ž‘
false true ๊ฐ„๊ฒฉ์„ ์ ์šฉํ•œ replica๋ฅผ ์ˆœ์ฐจ ์‹คํ–‰ํ•˜๋ฉฐ ๋‹ค์Œ phase๊ฐ€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
true true replica๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋ฉฐ ๋‹ค์Œ phase๊ฐ€ ์ „์ฒด batch๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
false false ๊ฐ„๊ฒฉ์„ ์ ์šฉํ•œ ์ˆœ์ฐจ job์ด background์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
true false ๋™์‹œ ์‹คํ–‰ job์ด background์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

v2 ํ˜ธํ™˜์„ ์œ„ํ•ด interval์„ ์ƒ๋žตํ•œ publish phase์—๋Š” ํŠน์ˆ˜ ๊ธฐ๋ณธ๊ฐ’์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. parallel: true์ด๋ฉด ๊ฐ ์ž‘์—…์— phase ์‹œ์ž‘ ๊ธฐ์ค€ 1s offset์„ ์ฃผ๋ฉฐ, ์ˆœ์ฐจ publish์˜ delay๋Š” 0์ž…๋‹ˆ๋‹ค. ์ด ๊ทœ์น™์€ await ๊ฐ’๊ณผ ๋ฌด๊ด€ํ•ฉ๋‹ˆ๋‹ค.

์ˆœ์ฐจ join, publish, leave๋Š” ์ฒซ ์ž‘์—…์„ ์ฆ‰์‹œ ์‹คํ–‰ํ•˜๊ณ , ์ดํ›„ ์ž‘์—…์€ batch ์‹œ์ž‘ ์‹œ๊ฐ์— ์•ž์„œ sample๋œ interval์„ ๋ˆ„์ ํ•œ ์‹œ๊ฐ์— ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ ์ฒ˜๋ฆฌยท์ ‘์ˆ˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„์€ interval ์•ˆ์— ํฌํ•จ๋˜๋ฉฐ ๋งค๋ฒˆ ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ์•ฝ๋ณด๋‹ค ๋Šฆ์–ด์ง„ ์ž‘์—…์€ ๊ฑด๋„ˆ๋›ฐ์ง€ ์•Š๊ณ  ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋ฉฐ ์›๋ž˜ ์ผ์ •์— ๋”ฐ๋ผ์žก์„ ๋•Œ๊นŒ์ง€ ์ถ”๊ฐ€๋กœ ์‰ฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ทจ์†Œยท์˜ค๋ฅ˜๋Š” ์—ฌ์ „ํžˆ ์‹คํ–‰์„ ์ค‘๋‹จํ•˜๋ฉฐ Agent ์šฉ๋Ÿ‰ ์ œํ•œ๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ณ‘๋ ฌ join๊ณผ leave๋Š” interval์„ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ณ‘๋ ฌ publish๋Š” ๊ฐ sample interval์„ batch ์‹œ์ž‘ ๊ธฐ์ค€์˜ ๋…๋ฆฝ์ ์ธ offset์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ ํ›„ ๋™์‹œ ์‹คํ–‰ slot์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค. Offset์€ ๋ˆ„์ ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋™์‹œ ์‹คํ–‰ ์šฉ๋Ÿ‰์— ๋”ฐ๋ผ dispatch๊ฐ€ ๋” ๋Šฆ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆœ์ฐจ join์ด ์˜ˆ์•ฝ๋ณด๋‹ค 1์ดˆ ์ด์ƒ ๋Šฆ์–ด์ง€๋ฉด Controller๋Š” job ์‹คํ–‰๋ณ„ ์ตœ๋Œ€ 10์ดˆ์— ํ•œ ๋ฒˆ churn join schedule delayed๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ID, ๊ทธ๋ฃน, ์ž‘์—… ๋ฒˆํ˜ธ, ์˜ˆ์•ฝ ์‹œ๊ฐ, ์ง€์—ฐ ์‹œ๊ฐ„์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ง€์†์ ์ธ ์šฉ๋Ÿ‰ยทAPI ๋ณ‘๋ชฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ณผ๋ถ€ํ•˜ ์ƒํ™ฉ์˜ Docker ์‹œ์ž‘ยทready ์‹œ๊ฐ๊นŒ์ง€ ๋ณด์žฅํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. Agent heartbeat๋Š” ์ด๋ฒคํŠธ ์ „์†ก๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋ฏ€๋กœ ๋А๋ฆฐ telemetry ์š”์ฒญ์ด ์ƒ์กด ์‹ ํ˜ธ ์ „์†ก์„ ๋ง‰์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

wait duration๊ณผ readiness/job timeout์€ ์–‘์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. join์˜ lifetime์„ ์ƒ๋žตํ•˜๋ฉด ์ž๋™ leave๋ฅผ ํ•˜์ง€ ์•Š์ง€๋งŒ ๋ช…์‹œ์ ์œผ๋กœ sample๋œ 0s lifetime์€ v2์™€ ๊ฐ™์ด ์ƒˆ ๋…ธ๋“œ๋ฅผ ์ฆ‰์‹œ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜๋ช… ๋งŒ๋ฃŒ๋Š” ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ์„ฑ๊ณต ์งํ›„ ๊ธฐ๋กํ•œ ๋‹จ์กฐ ์‹œ๊ณ„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. Agent metadata ์ž ๊ธˆ์ด๋‚˜ ํƒ€์ด๋จธ goroutine ์‹คํ–‰์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„๋„ sample๋œ ์ˆ˜๋ช…์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์ง€๋‚œ ๋งˆ๊ฐ์€ ๋Œ€๊ธฐ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ฆ‰์‹œ ์ข…๋ฃŒ๋ฅผ ์š”์ฒญํ•˜์ง€๋งŒ, CPU ๊ฒฝํ•ฉ๊ณผ cleanup ๋•Œ๋ฌธ์— ์‹ค์ œ ์ œ๊ฑฐ๋Š” ๋Šฆ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค ์ทจ์†Œ ์‹œ ํƒ€์ด๋จธ๋ฅผ ํ•ด์ œํ•˜๊ณ , ์ด๋ฏธ ์ทจ์†Œ๋œ ํ”„๋กœ์„ธ์Šค์—๋Š” ์ˆ˜๋ช… ์ข…๋ฃŒ๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

phases:
  - name: background churn
    action: join
    job: churn
    await: false
    parallel: false
    group: churners
    role: worker
    type: light
    count: 100
    interval: {model: exponential, mean: 250ms}
    lifetime: {model: pareto, xm: 45s, alpha: 2.5, max: 3m}

  - action: wait
    duration: 10s

  - action: wait-ready
    group: churners
    jobs: [churn]
    readyRatio: 1
    timeout: 5m

๊ฐ„๊ฒฉ๊ณผ ์ˆ˜๋ช…์—๋Š” ๋‹ค์Œ ๋ถ„ํฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. duration ๊ฐ’์€ Go duration ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๋ฉฐ ์„ ํƒ์ ์ธ min/max duration ๋ฒ”์œ„๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ์  ๋ถ„ํฌ๋Š” ์ƒ๋žตํ•˜๊ฑฐ๋‚˜ ๋น„์›Œ ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ž…๋ ฅํ–ˆ๋‹ค๋ฉด model์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด lifetime: {value: 5s}๋Š” ์ž˜๋ชป๋œ ์„ค์ •์ด๋ฉฐ model: fixed๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Model ๋งค๊ฐœ๋ณ€์ˆ˜์™€ sampling ์˜๋ฏธ
fixed value๊ฐ€ ์ •ํ™•ํ•œ duration์ž…๋‹ˆ๋‹ค.
exponential mean์€ ์—ฐ์† ์ง€์ˆ˜๋ถ„ํฌ sample์˜ ํ‰๊ท  duration์ž…๋‹ˆ๋‹ค.
normal mean๊ณผ sigma๋Š” duration ๋‹จ์œ„์˜ ํ‰๊ท ๊ณผ ํ‘œ์ค€ํŽธ์ฐจ์ž…๋‹ˆ๋‹ค. ์Œ์ˆ˜ sample์€ 0์œผ๋กœ ์ œํ•œํ•œ ๋’ค ์„ ํƒ์ ์ธ ๋ฒ”์œ„๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
pareto xm์€ scale duration์ด๋ฉฐ alpha๋Š” ๋ฌด์ฐจ์› shape์ž…๋‹ˆ๋‹ค.
poisson v2 ํ˜ธํ™˜ ๋™์ž‘์ž…๋‹ˆ๋‹ค. duration์ธ mean์„ ์ดˆ ๋‹จ์œ„ Poisson ํ‰๊ท ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ฉฐ sample ๊ฒฐ๊ณผ๋Š” ์ •์ˆ˜ ์ดˆ๋กœ ์–‘์žํ™”๋ฉ๋‹ˆ๋‹ค.
gamma alpha๋Š” shape์ž…๋‹ˆ๋‹ค. v2 ํ˜ธํ™˜ beta(์ดˆ๋‹น rate) ๋˜๋Š” scale(duration) ์ค‘ ์ •ํ™•ํžˆ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ ๋‘ ํ˜•์‹์€ ์ƒํ˜ธ๋ฐฐํƒ€์ ์ž…๋‹ˆ๋‹ค.
lognormal mu๋Š” log-space ํ‰๊ท ์ด๊ณ  sigma๋Š” ๋ฌด์ฐจ์›์ž…๋‹ˆ๋‹ค. sigma: "0.5" ๊ฐ™์€ ์ˆซ์ž ๋ฌธ์ž์—ด ๋˜๋Š” ์ˆซ์ž ํ•„๋“œ logSigma ์ค‘ ์ •ํ™•ํžˆ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€์ •๊ทœ๋ถ„ํฌ Z์— ๋Œ€ํ•ด ๊ฒฐ๊ณผ๋Š” exp(mu + sigma*Z)์ดˆ์ž…๋‹ˆ๋‹ค.

0์ด ์•„๋‹Œ scenario seed๋Š” ์ดˆ๊ธฐ ์ƒํƒœ, ์กฐ๊ฑด์— ๋งž๋Š” ํ›„๋ณด ์ง‘ํ•ฉ, readiness/job barrier๊ฐ€ ๊ฐ™์„ ๋•Œ sample๋œ delay์™€ ๋ถ„ํฌ sample, ๋ฌด์ž‘์œ„ ์„ ํƒ ๋ฐ ์ˆœ์„œ๋ฅผ ์žฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. Peer identity๋Š” (run ID, ๋…ธ๋“œ๋ณ„ seed) ์กฐํ•ฉ๋งˆ๋‹ค ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ์กฐํ•ฉ์€ ๊ฐ™์€ Peer ID๋ฅผ ๋งŒ๋“ค์ง€๋งŒ, run ID๊ฐ€ ๋‹ค๋ฅด๋ฉด ์‹คํ–‰ ๊ฐ„ identity ์ถฉ๋Œ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์˜๋„์ ์œผ๋กœ ๋‹ค๋ฅธ Peer ID๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ™์€ scenario seed๋Š” ์‹คํ–‰ ๊ฐ„ sampling๊ณผ ์ˆœ์„œ๋ฅผ ์žฌํ˜„ํ•˜์ง€๋งŒ run ID๊ฐ€ ๋‹ค๋ฅด๋ฉด Peer ID๊นŒ์ง€ ๊ฐ™์•„์ง€์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. seed: 0์€ ์˜๋„์ ์œผ๋กœ ์‹คํ–‰ ์‹œ๊ฐ ๊ธฐ๋ฐ˜ seed๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € examples/smoke.yaml์„ ํ™•์ธํ•˜๊ณ , custom profile, ์ด์ข… worker type, ์ œํ•œ๋œ ๋ณ‘๋ ฌ batch, background paced job์€ examples/mixed-workers.yaml์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

์‹คํ–‰ ๋ฐ ๋ณด์กด ํ•œ๊ณ„

Docker ๋Ÿฐํƒ€์ž„์€ Peer๋งˆ๋‹ค ๋„คํŠธ์›Œํฌ๋ฅผ ๊ฒฉ๋ฆฌํ•˜๊ณ  ๋…ธ๋“œ๋ณ„ P2P egress ์กฐ๊ฑด์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. wait-ready๋Š” Peer ์ดˆ๊ธฐํ™”์™€ API ์ค€๋น„ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜๋ฉฐ mesh ์ˆ˜๋ ด์„ ๊ฒ€์ฆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฃผ๊ธฐ์  topic discovery๊ฐ€ churn ์ค‘ transport ํ›„๋ณด๋ฅผ ๋ณด๊ฐ•ํ•˜์ง€๋งŒ GossipSub heartbeat์™€ GRAFT ์ฒ˜๋ฆฌ์—๋Š” ์—ฌ์ „ํžˆ ์ˆ˜๋ ด ์‹œ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ์‹คํ—˜์—๋Š” ๋ณ„๋„ ์•ˆ์ •ํ™” ๋Œ€๊ธฐ ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. scenario seed๋Š” ์•ž์„œ ์„ค๋ช…ํ•œ ์กฐ๊ฑด์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ sampling๊ณผ ์ˆœ์„œ๋ฅผ ์žฌํ˜„ํ•˜์ง€๋งŒ, ์ปค๋„์˜ packet impairment๋‚˜ ๋„คํŠธ์›Œํฌ ํƒ€์ด๋ฐ๊นŒ์ง€ ๋™์ผํ•˜๊ฒŒ ์žฌํ˜„ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์„ ํƒ์  HopWave ์ „๋‹ฌ์€ ํ˜ธํ™˜ ๋นŒ๋“œ์™€ ๋ช…์‹œ์  ํ™œ์„ฑํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Agent๋Š” ํ™•์ธ๋œ ์ข…๋ฃŒ ์ด๋ ฅ์„ ์ œํ•œ๋œ ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ์— ๋‚จ๊ธฐ๊ณ  ์˜ค๋ž˜๋œ ๊ธฐ๋ก์€ ๋กœ์ปฌ์— ๋ณด๊ด€ํ•˜๋ฉฐ, ์žฌ๋“ฑ๋ก ์‹œ ์ œํ•œ๋œ ํŽ˜์ด์ง€๋กœ ๋‹ค์‹œ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ํ•œ๋„์™€ ๋ณต๊ตฌ ๊ทœ์น™์€ Agent ์ด๋ ฅ ๋ณด์กด์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค. Controller์˜ ์ „์ฒด snapshot์—๋Š” ๋ณด์กด ์ค‘์ธ ๋…ธ๋“œ ์ด๋ ฅ์ด ๊ณ„์† ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํ‰์ƒ์‹œ ๋ถ€๋ถ„ heartbeat, discovery, dashboard SSE๋Š” ํ™œ์„ฑ ๋…ธ๋“œ์™€ ์ „์†กํ•  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด ์ด๋ ฅ์˜ ๋ฐ˜๋ณต ์ฒ˜๋ฆฌ๋ฅผ ํ”ผํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ parallel phase์—๋Š” parallelism์„ ๋ช…์‹œํ•˜์‹ญ์‹œ์˜ค. ์ƒ๋žตํ•˜๋ฉด ์—ฌ์ „ํžˆ batch ์ „์ฒด์˜ ๋™์‹œ ์‹คํ–‰์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ