[{"data":1,"prerenderedAt":723},["ShallowReactive",2],{"doc:\u002Freverse-proxy\u002Foperations\u002Fbenchmarks":3,"surround:\u002Freverse-proxy\u002Foperations\u002Fbenchmarks":472,"navigation":483},{"id":4,"title":5,"body":6,"description":465,"extension":466,"meta":467,"navigation":234,"path":468,"seo":469,"stem":470,"__hash__":471},"docs\u002F02.reverse-proxy\u002F05.operations\u002F05.benchmarks.md","Benchmarki",{"type":7,"value":8,"toc":457},"minimark",[9,14,18,149,153,168,175,183,187,291,295,330,333,363,367,377,397,415,419,422,450,453],[10,11,13],"h2",{"id":12},"wyniki","Wyniki",[15,16,17],"p",{},"Go 1.27, linux\u002Famd64, 2 vCPU sandbox:",[19,20,21,40],"table",{},[22,23,24],"thead",{},[25,26,27,31,34,37],"tr",{},[28,29,30],"th",{},"Benchmark",[28,32,33],{},"ns\u002Fop",[28,35,36],{},"B\u002Fop",[28,38,39],{},"allocs\u002Fop",[41,42,43,61,75,89,103,117,132],"tbody",{},[25,44,45,53,56,59],{},[46,47,48,52],"td",{},[49,50,51],"code",{},"RoundRobinNext"," (parallel)",[46,54,55],{},"47",[46,57,58],{},"0",[46,60,58],{},[25,62,63,68,71,73],{},[46,64,65,52],{},[49,66,67],{},"WeightedRoundRobinNext",[46,69,70],{},"52",[46,72,58],{},[46,74,58],{},[25,76,77,82,85,87],{},[46,78,79,52],{},[49,80,81],{},"LeastConnectionsNext",[46,83,84],{},"85",[46,86,58],{},[46,88,58],{},[25,90,91,96,99,101],{},[46,92,93,52],{},[49,94,95],{},"BackendState",[46,97,98],{},"39",[46,100,58],{},[46,102,58],{},[25,104,105,110,113,115],{},[46,106,107,52],{},[49,108,109],{},"MemoryAllowSingleKey",[46,111,112],{},"189",[46,114,58],{},[46,116,58],{},[25,118,119,124,127,130],{},[46,120,121,52],{},[49,122,123],{},"MemoryAllowManyKeys",[46,125,126],{},"197",[46,128,129],{},"2",[46,131,58],{},[25,133,134,140,143,146],{},[46,135,136,139],{},[49,137,138],{},"ProxyServeHTTP"," (end-to-end hop)",[46,141,142],{},"61 µs",[46,144,145],{},"40 KB",[46,147,148],{},"93",[10,150,152],{"id":151},"wnioski-z-profilowania","Wnioski z profilowania",[15,154,155,156,163,164,167],{},"Koszt requestu dominowany jest przez ",[157,158,159,160],"strong",{},"internale ",[49,161,162],{},"net\u002Fhttp",": klonowanie requestu, parsowanie nagłówków MIME, syscalle socketowe. Ścieżki load balancera, breakera i limitera są ",[157,165,166],{},"allocation-free",".",[15,169,170,171,174],{},"Pozostałe alokacje pochodzą z samego ",[49,172,173],{},"httputil.ReverseProxy"," i nie są warte reimplementacji — to sprawdzony, utrzymywany kod standardowej biblioteki.",[176,177,180],"callout",{"title":178,"type":179},"Liczby per maszyna","info",[15,181,182],{},"Wyniki zależą od sprzętu i wersji Go. Uruchom benchmarki na swojej maszynie przed wyciąganiem wniosków — wartości powyżej to punkt odniesienia, nie obietnica.",[10,184,186],{"id":185},"uruchamianie","Uruchamianie",[188,189,194],"pre",{"className":190,"code":191,"language":192,"meta":193,"style":193},"language-bash shiki shiki-themes github-light github-dark","go vet .\u002F...\ngo test -race -count=1 .\u002F...\n\ngo test -run '^$' -bench=. -benchmem .\u002F...\n\ngo test -run '^$' -bench=BenchmarkProxyServeHTTPParallel \\\n  -cpuprofile=cpu.out -memprofile=mem.out .\u002Finternal\u002Fproxy\u002F\n","bash","",[49,195,196,212,229,236,257,262,279],{"__ignoreMap":193},[197,198,201,205,209],"span",{"class":199,"line":200},"line",1,[197,202,204],{"class":203},"sScJk","go",[197,206,208],{"class":207},"sZZnC"," vet",[197,210,211],{"class":207}," .\u002F...\n",[197,213,215,217,220,224,227],{"class":199,"line":214},2,[197,216,204],{"class":203},[197,218,219],{"class":207}," test",[197,221,223],{"class":222},"sj4cs"," -race",[197,225,226],{"class":222}," -count=1",[197,228,211],{"class":207},[197,230,232],{"class":199,"line":231},3,[197,233,235],{"emptyLinePlaceholder":234},true,"\n",[197,237,239,241,243,246,249,252,255],{"class":199,"line":238},4,[197,240,204],{"class":203},[197,242,219],{"class":207},[197,244,245],{"class":222}," -run",[197,247,248],{"class":207}," '^$'",[197,250,251],{"class":222}," -bench=.",[197,253,254],{"class":222}," -benchmem",[197,256,211],{"class":207},[197,258,260],{"class":199,"line":259},5,[197,261,235],{"emptyLinePlaceholder":234},[197,263,265,267,269,271,273,276],{"class":199,"line":264},6,[197,266,204],{"class":203},[197,268,219],{"class":207},[197,270,245],{"class":222},[197,272,248],{"class":207},[197,274,275],{"class":222}," -bench=BenchmarkProxyServeHTTPParallel",[197,277,278],{"class":222}," \\\n",[197,280,282,285,288],{"class":199,"line":281},7,[197,283,284],{"class":222},"  -cpuprofile=cpu.out",[197,286,287],{"class":222}," -memprofile=mem.out",[197,289,290],{"class":207}," .\u002Finternal\u002Fproxy\u002F\n",[10,292,294],{"id":293},"analiza-profili","Analiza profili",[188,296,298],{"className":190,"code":297,"language":192,"meta":193,"style":193},"go tool pprof -http=:8081 cpu.out\ngo tool pprof -http=:8082 mem.out\n",[49,299,300,316],{"__ignoreMap":193},[197,301,302,304,307,310,313],{"class":199,"line":200},[197,303,204],{"class":203},[197,305,306],{"class":207}," tool",[197,308,309],{"class":207}," pprof",[197,311,312],{"class":222}," -http=:8081",[197,314,315],{"class":207}," cpu.out\n",[197,317,318,320,322,324,327],{"class":199,"line":214},[197,319,204],{"class":203},[197,321,306],{"class":207},[197,323,309],{"class":207},[197,325,326],{"class":222}," -http=:8082",[197,328,329],{"class":207}," mem.out\n",[15,331,332],{},"Szukaj:",[334,335,336,351,357],"ul",{},[337,338,339,340,343,344,343,347,350],"li",{},"alokacji w ",[49,341,342],{},"balancer",", ",[49,345,346],{},"breaker",[49,348,349],{},"limiter"," — powinno być zero,",[337,352,353,354,356],{},"czasu w ",[49,355,162],{}," — to normalne i oczekiwane,",[337,358,359,360,362],{},"lock contention w ",[49,361,95],{}," — atomics, nie mutexy.",[10,364,366],{"id":365},"testy-integracyjne","Testy integracyjne",[15,368,369,372,373,376],{},[49,370,371],{},"internal\u002Fapp"," pokrywa na ",[49,374,375],{},"httptest"," serwerach in-memory:",[334,378,379,382,385,388,391,394],{},[337,380,381],{},"proxying i failover,",[337,383,384],{},"retry i odpowiedzi błędów backendów,",[337,386,387],{},"rate limiting,",[337,389,390],{},"admin authentication i traffic control,",[337,392,393],{},"health-check recovery,",[337,395,396],{},"endpointy operacyjne.",[188,398,400],{"className":190,"code":399,"language":192,"meta":193,"style":193},"go test -race -count=1 .\u002Finternal\u002Fapp\u002F\n",[49,401,402],{"__ignoreMap":193},[197,403,404,406,408,410,412],{"class":199,"line":200},[197,405,204],{"class":203},[197,407,219],{"class":207},[197,409,223],{"class":222},[197,411,226],{"class":222},[197,413,414],{"class":207}," .\u002Finternal\u002Fapp\u002F\n",[10,416,418],{"id":417},"ci","CI",[15,420,421],{},"GitHub Actions uruchamia:",[334,423,424,430,435,441,444,447],{},[337,425,426,429],{},[49,427,428],{},"gofmt",",",[337,431,432,429],{},[49,433,434],{},"go vet",[337,436,437,438,429],{},"testy z ",[49,439,440],{},"-race",[337,442,443],{},"build,",[337,445,446],{},"Docker build,",[337,448,449],{},"benchmarki.",[15,451,452],{},"Release jest automatyzowany dla tagów.",[454,455,456],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":193,"searchDepth":231,"depth":231,"links":458},[459,460,461,462,463,464],{"id":12,"depth":214,"text":13},{"id":151,"depth":214,"text":152},{"id":185,"depth":214,"text":186},{"id":293,"depth":214,"text":294},{"id":365,"depth":214,"text":366},{"id":417,"depth":214,"text":418},"Wyniki benchmarków gorących ścieżek, profilowanie i testy race. Co jest allocation-free i gdzie naprawdę idzie czas.","md",{},"\u002Freverse-proxy\u002Foperations\u002Fbenchmarks",{"title":5,"description":465},"02.reverse-proxy\u002F05.operations\u002F05.benchmarks","_Yyk1HgU19ex97c3gkrR58akT8Y2ZDoKNEmQKoxElzY",[473,478],{"title":474,"path":475,"stem":476,"description":477,"children":-1},"Wdrożenie","\u002Freverse-proxy\u002Foperations\u002Fdeployment","02.reverse-proxy\u002F05.operations\u002F04.deployment","Docker, Docker Compose, HTTPS termination, rozproszony rate limiting z Redis i graceful shutdown. Gotowe przepisy produkcyjne.",{"title":479,"path":480,"stem":481,"description":482,"children":-1},"Troubleshooting","\u002Freverse-proxy\u002Foperations\u002Ftroubleshooting","02.reverse-proxy\u002F05.operations\u002F06.troubleshooting","Objaw → przyczyna → naprawa. Najczęstsze problemy produkcyjne reverse proxy i jak je diagnozować metrykami oraz logami.",[484,603,656],{"title":485,"path":486,"stem":487,"children":488},"2D Game Engine","\u002Fgame-engine","01.game-engine\u002F01.index",[489,491,495,499,503,529,558,571,592,595,599],{"title":490,"path":486,"stem":487},"Przegląd",{"title":492,"path":493,"stem":494},"Szybki start","\u002Fgame-engine\u002Fgetting-started","01.game-engine\u002F02.getting-started",{"title":496,"path":497,"stem":498},"Konfiguracja","\u002Fgame-engine\u002Fconfiguration","01.game-engine\u002F03.configuration",{"title":500,"path":501,"stem":502},"Architektura","\u002Fgame-engine\u002Farchitecture","01.game-engine\u002F04.architecture",{"title":504,"path":505,"stem":506,"children":507,"page":528},"Rdzeń","\u002Fgame-engine\u002Fcore","01.game-engine\u002F05.core",[508,512,516,520,524],{"title":509,"path":510,"stem":511},"Silnik i cykl życia","\u002Fgame-engine\u002Fcore\u002Fengine","01.game-engine\u002F05.core\u002F01.engine",{"title":513,"path":514,"stem":515},"Czas i pętla gry","\u002Fgame-engine\u002Fcore\u002Ftime","01.game-engine\u002F05.core\u002F02.time",{"title":517,"path":518,"stem":519},"Sceny","\u002Fgame-engine\u002Fcore\u002Fscenes","01.game-engine\u002F05.core\u002F03.scenes",{"title":521,"path":522,"stem":523},"Obiekty i komponenty","\u002Fgame-engine\u002Fcore\u002Fobjects","01.game-engine\u002F05.core\u002F04.objects",{"title":525,"path":526,"stem":527},"Zdarzenia i harmonogram","\u002Fgame-engine\u002Fcore\u002Fevents","01.game-engine\u002F05.core\u002F05.events",false,{"title":530,"path":531,"stem":532,"children":533,"page":528},"Systemy","\u002Fgame-engine\u002Fsystems","01.game-engine\u002F06.systems",[534,538,542,546,550,554],{"title":535,"path":536,"stem":537},"Zasoby (AssetManager)","\u002Fgame-engine\u002Fsystems\u002Fassets","01.game-engine\u002F06.systems\u002F01.assets",{"title":539,"path":540,"stem":541},"Wejście (InputManager)","\u002Fgame-engine\u002Fsystems\u002Finput","01.game-engine\u002F06.systems\u002F02.input",{"title":543,"path":544,"stem":545},"Fizyka (PhysicsManager)","\u002Fgame-engine\u002Fsystems\u002Fphysics","01.game-engine\u002F06.systems\u002F03.physics",{"title":547,"path":548,"stem":549},"Kamera (CameraManager)","\u002Fgame-engine\u002Fsystems\u002Fcamera","01.game-engine\u002F06.systems\u002F04.camera",{"title":551,"path":552,"stem":553},"Audio (AudioManager)","\u002Fgame-engine\u002Fsystems\u002Faudio","01.game-engine\u002F06.systems\u002F05.audio",{"title":555,"path":556,"stem":557},"Tweeny i easing","\u002Fgame-engine\u002Fsystems\u002Ftweens","01.game-engine\u002F06.systems\u002F06.tweens",{"title":559,"path":560,"stem":561,"children":562,"page":528},"Dane i zapisy","\u002Fgame-engine\u002Fdata","01.game-engine\u002F07.data",[563,567],{"title":564,"path":565,"stem":566},"Format projektu","\u002Fgame-engine\u002Fdata\u002Fproject-format","01.game-engine\u002F07.data\u002F01.project-format",{"title":568,"path":569,"stem":570},"Zapisy gry","\u002Fgame-engine\u002Fdata\u002Fsaves","01.game-engine\u002F07.data\u002F02.saves",{"title":572,"path":573,"stem":574,"children":575,"page":528},"Zaawansowane","\u002Fgame-engine\u002Fadvanced","01.game-engine\u002F08.advanced",[576,580,584,588],{"title":577,"path":578,"stem":579},"Pluginy","\u002Fgame-engine\u002Fadvanced\u002Fplugins","01.game-engine\u002F08.advanced\u002F01.plugins",{"title":581,"path":582,"stem":583},"WebAssembly","\u002Fgame-engine\u002Fadvanced\u002Fwasm","01.game-engine\u002F08.advanced\u002F02.wasm",{"title":585,"path":586,"stem":587},"Debugowanie","\u002Fgame-engine\u002Fadvanced\u002Fdebugging","01.game-engine\u002F08.advanced\u002F03.debugging",{"title":589,"path":590,"stem":591},"Wydajność i benchmarki","\u002Fgame-engine\u002Fadvanced\u002Fperformance","01.game-engine\u002F08.advanced\u002F04.performance",{"title":474,"path":593,"stem":594},"\u002Fgame-engine\u002Fdeployment","01.game-engine\u002F09.deployment",{"title":596,"path":597,"stem":598},"Przykłady","\u002Fgame-engine\u002Fexamples","01.game-engine\u002F10.examples",{"title":600,"path":601,"stem":602},"Decyzje architektoniczne","\u002Fgame-engine\u002Fadr","01.game-engine\u002F11.adr",{"title":604,"path":605,"stem":606,"children":607},"Reverse Proxy","\u002Freverse-proxy","02.reverse-proxy\u002F01.index",[608,609,612,615,636],{"title":490,"path":605,"stem":606},{"title":492,"path":610,"stem":611},"\u002Freverse-proxy\u002Fgetting-started","02.reverse-proxy\u002F02.getting-started",{"title":496,"path":613,"stem":614},"\u002Freverse-proxy\u002Fconfiguration","02.reverse-proxy\u002F03.configuration",{"title":616,"path":617,"stem":618,"children":619,"page":528},"Ruch i odporność","\u002Freverse-proxy\u002Ftraffic","02.reverse-proxy\u002F04.traffic",[620,624,628,632],{"title":621,"path":622,"stem":623},"Load balancing","\u002Freverse-proxy\u002Ftraffic\u002Fload-balancing","02.reverse-proxy\u002F04.traffic\u002F01.load-balancing",{"title":625,"path":626,"stem":627},"Health checks","\u002Freverse-proxy\u002Ftraffic\u002Fhealth-checks","02.reverse-proxy\u002F04.traffic\u002F02.health-checks",{"title":629,"path":630,"stem":631},"Circuit breaker i retry","\u002Freverse-proxy\u002Ftraffic\u002Fresilience","02.reverse-proxy\u002F04.traffic\u002F03.resilience",{"title":633,"path":634,"stem":635},"Rate limiting","\u002Freverse-proxy\u002Ftraffic\u002Frate-limiting","02.reverse-proxy\u002F04.traffic\u002F04.rate-limiting",{"title":637,"path":638,"stem":639,"children":640,"page":528},"Operacje i wdrożenie","\u002Freverse-proxy\u002Foperations","02.reverse-proxy\u002F05.operations",[641,645,649,653,654,655],{"title":642,"path":643,"stem":644},"Admin API","\u002Freverse-proxy\u002Foperations\u002Fadmin-api","02.reverse-proxy\u002F05.operations\u002F01.admin-api",{"title":646,"path":647,"stem":648},"Metryki i monitoring","\u002Freverse-proxy\u002Foperations\u002Fobservability","02.reverse-proxy\u002F05.operations\u002F02.observability",{"title":650,"path":651,"stem":652},"Bezpieczeństwo","\u002Freverse-proxy\u002Foperations\u002Fsecurity","02.reverse-proxy\u002F05.operations\u002F03.security",{"title":474,"path":475,"stem":476},{"title":5,"path":468,"stem":470},{"title":479,"path":480,"stem":481},{"title":657,"path":658,"stem":659,"children":660},"Vector Engine","\u002Fvector-engine","03.vector-engine\u002F01.index",[661,662,665,686,699,719],{"title":490,"path":658,"stem":659},{"title":492,"path":663,"stem":664},"\u002Fvector-engine\u002Fgetting-started","03.vector-engine\u002F02.getting-started",{"title":666,"path":667,"stem":668,"children":669,"page":528},"Scena","\u002Fvector-engine\u002Fscene","03.vector-engine\u002F03.scene",[670,674,678,682],{"title":671,"path":672,"stem":673},"Format sceny 1.0","\u002Fvector-engine\u002Fscene\u002Fscene-format","03.vector-engine\u002F03.scene\u002F01.scene-format",{"title":675,"path":676,"stem":677},"Obiekty sceny","\u002Fvector-engine\u002Fscene\u002Fobjects","03.vector-engine\u002F03.scene\u002F02.objects",{"title":679,"path":680,"stem":681},"Gradienty i warstwy","\u002Fvector-engine\u002Fscene\u002Fgradients-layers","03.vector-engine\u002F03.scene\u002F03.gradients-layers",{"title":683,"path":684,"stem":685},"Przykłady scen","\u002Fvector-engine\u002Fscene\u002Fexamples","03.vector-engine\u002F03.scene\u002F04.examples",{"title":687,"path":688,"stem":689,"children":690,"page":528},"Eksport","\u002Fvector-engine\u002Fexport","03.vector-engine\u002F04.export",[691,695],{"title":692,"path":693,"stem":694},"Formaty eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-formats","03.vector-engine\u002F04.export\u002F01.export-formats",{"title":696,"path":697,"stem":698},"Proces eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-workflow","03.vector-engine\u002F04.export\u002F02.export-workflow",{"title":700,"path":701,"stem":702,"children":703,"page":528},"Wnętrze silnika","\u002Fvector-engine\u002Finternals","03.vector-engine\u002F05.internals",[704,707,711,715],{"title":500,"path":705,"stem":706},"\u002Fvector-engine\u002Finternals\u002Farchitecture","03.vector-engine\u002F05.internals\u002F01.architecture",{"title":708,"path":709,"stem":710},"WebAssembly i workery","\u002Fvector-engine\u002Finternals\u002Fwasm","03.vector-engine\u002F05.internals\u002F02.wasm",{"title":712,"path":713,"stem":714},"Workspace i panele","\u002Fvector-engine\u002Finternals\u002Fworkspace","03.vector-engine\u002F05.internals\u002F03.workspace",{"title":716,"path":717,"stem":718},"Breakpointy","\u002Fvector-engine\u002Finternals\u002Fbreakpoints","03.vector-engine\u002F05.internals\u002F04.breakpoints",{"title":720,"path":721,"stem":722},"Wdrożenie na Vercel","\u002Fvector-engine\u002Fdeployment","03.vector-engine\u002F06.deployment",1793986308646]