[{"data":1,"prerenderedAt":1326},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-kit-app":442,"-hu-kit-app-surround":1321},[4,45,60,81,112,129,146,173,197,213,242,280,357,373,385,404,430],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Kezdő lépések","i-lucide-rocket","\u002Fhu\u002Fgetting-started","hu\u002F1.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Bevezetés","\u002Fhu\u002Fgetting-started\u002Fintroduction","hu\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Laravelből érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-laravel","hu\u002F1.getting-started\u002F2.coming-from-laravel","i-lucide-arrow-right-left",{"title":21,"path":22,"stem":23,"icon":19},"Symfonyból érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-symfony","hu\u002F1.getting-started\u002F3.coming-from-symfony",{"title":25,"path":26,"stem":27,"icon":28},"Telepítés","\u002Fhu\u002Fgetting-started\u002Finstallation","hu\u002F1.getting-started\u002F4.installation","i-lucide-download",{"title":30,"path":31,"stem":32,"icon":33},"Az első modulod","\u002Fhu\u002Fgetting-started\u002Ffirst-module","hu\u002F1.getting-started\u002F5.first-module","i-lucide-package-plus",{"title":35,"path":36,"stem":37,"icon":38},"Projektstruktúra","\u002Fhu\u002Fgetting-started\u002Fproject-structure","hu\u002F1.getting-started\u002F6.project-structure","i-lucide-folder-tree",{"title":40,"path":41,"stem":42,"icon":43},"A shop mintaalkalmazás","\u002Fhu\u002Fgetting-started\u002Fsample-app","hu\u002F1.getting-started\u002F7.sample-app","i-lucide-shopping-cart",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"queue","i-lucide-layers","\u002Fhu\u002Fqueue","hu\u002F10.queue",[51,56],{"title":52,"path":53,"stem":54,"icon":55},"Áttekintés","\u002Fhu\u002Fqueue\u002Foverview","hu\u002F10.queue\u002F1.overview","i-lucide-list-ordered",{"title":57,"path":58,"stem":59,"icon":47},"Taskok","\u002Fhu\u002Fqueue\u002Ftasks","hu\u002F10.queue\u002F2.tasks",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":44},"events","i-lucide-workflow","\u002Fhu\u002Fevents","hu\u002F11.events",[66,71,76],{"title":67,"path":68,"stem":69,"icon":70},"Események","\u002Fhu\u002Fevents\u002Foverview","hu\u002F11.events\u002F1.overview","i-lucide-radio",{"title":72,"path":73,"stem":74,"icon":75},"Outbox","\u002Fhu\u002Fevents\u002Foutbox","hu\u002F11.events\u002F2.outbox","i-lucide-inbox",{"title":77,"path":78,"stem":79,"icon":80},"Ütemezés","\u002Fhu\u002Fevents\u002Fscheduler","hu\u002F11.events\u002F3.scheduler","i-lucide-calendar-clock",{"title":82,"icon":83,"path":84,"stem":85,"children":86,"page":44},"auth","i-lucide-shield-check","\u002Fhu\u002Fauth","hu\u002F12.auth",[87,92,97,102,107],{"title":88,"path":89,"stem":90,"icon":91},"Autentikáció","\u002Fhu\u002Fauth\u002Foverview","hu\u002F12.auth\u002F1.overview","i-lucide-key-round",{"title":93,"path":94,"stem":95,"icon":96},"RBAC","\u002Fhu\u002Fauth\u002Frbac","hu\u002F12.auth\u002F2.rbac","i-lucide-users",{"title":98,"path":99,"stem":100,"icon":101},"Policy-k","\u002Fhu\u002Fauth\u002Fpolicy","hu\u002F12.auth\u002F3.policy","i-lucide-gavel",{"title":103,"path":104,"stem":105,"icon":106},"Az auth önálló használata","\u002Fhu\u002Fauth\u002Fstandalone","hu\u002F12.auth\u002F4.standalone","i-lucide-plug",{"title":108,"path":109,"stem":110,"icon":111},"Social login goth-tal, önállóan","\u002Fhu\u002Fauth\u002Fsocial-standalone","hu\u002F12.auth\u002F5.social-standalone","i-lucide-log-in",{"title":113,"icon":114,"path":115,"stem":116,"children":117,"page":44},"mail","i-lucide-mail","\u002Fhu\u002Fmail","hu\u002F13.mail",[118,121,125],{"title":52,"path":119,"stem":120,"icon":114},"\u002Fhu\u002Fmail\u002Foverview","hu\u002F13.mail\u002F1.overview",{"title":122,"path":123,"stem":124,"icon":114},"SMTP","\u002Fhu\u002Fmail\u002Fsmtp","hu\u002F13.mail\u002F2.smtp",{"title":126,"path":127,"stem":128,"icon":114},"MJML","\u002Fhu\u002Fmail\u002Fmjml","hu\u002F13.mail\u002F3.mjml",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":44},"notify","i-lucide-bell","\u002Fhu\u002Fnotify","hu\u002F14.notify",[135,138,142],{"title":52,"path":136,"stem":137,"icon":131},"\u002Fhu\u002Fnotify\u002Foverview","hu\u002F14.notify\u002F1.overview",{"title":139,"path":140,"stem":141,"icon":131},"Database csatorna","\u002Fhu\u002Fnotify\u002Fdatabase","hu\u002F14.notify\u002F2.database",{"title":143,"path":144,"stem":145,"icon":131},"Broadcast csatorna","\u002Fhu\u002Fnotify\u002Fbroadcast","hu\u002F14.notify\u002F3.broadcast",{"title":147,"icon":148,"path":149,"stem":150,"children":151,"page":44},"storage","i-lucide-hard-drive","\u002Fhu\u002Fstorage","hu\u002F15.storage",[152,155,159,163,168],{"title":52,"path":153,"stem":154,"icon":148},"\u002Fhu\u002Fstorage\u002Foverview","hu\u002F15.storage\u002F1.overview",{"title":156,"path":157,"stem":158},"Disk API","\u002Fhu\u002Fstorage\u002Fdisk-api","hu\u002F15.storage\u002F2.disk-api",{"title":160,"path":161,"stem":162,"icon":148},"Memória és helyi lemez","\u002Fhu\u002Fstorage\u002Flocal","hu\u002F15.storage\u002F3.local",{"title":164,"path":165,"stem":166,"icon":167},"S3","\u002Fhu\u002Fstorage\u002Fs3","hu\u002F15.storage\u002F4.s3","i-lucide-cloud",{"title":169,"path":170,"stem":171,"icon":172},"Tesztelés","\u002Fhu\u002Fstorage\u002Ftesting","hu\u002F15.storage\u002F5.testing","i-lucide-flask-conical",{"title":174,"icon":175,"path":176,"stem":177,"children":178,"page":44},"telemetry","i-lucide-activity","\u002Fhu\u002Ftelemetry","hu\u002F16.telemetry",[179,182,187,192],{"title":52,"path":180,"stem":181,"icon":175},"\u002Fhu\u002Ftelemetry\u002Foverview","hu\u002F16.telemetry\u002F1.overview",{"title":183,"path":184,"stem":185,"icon":186},"Logolás","\u002Fhu\u002Ftelemetry\u002Flogging","hu\u002F16.telemetry\u002F2.logging","i-lucide-scroll-text",{"title":188,"path":189,"stem":190,"icon":191},"OpenTelemetry","\u002Fhu\u002Ftelemetry\u002Fopentelemetry","hu\u002F16.telemetry\u002F3.opentelemetry","i-lucide-radar",{"title":193,"path":194,"stem":195,"icon":196},"Sentry","\u002Fhu\u002Ftelemetry\u002Fsentry","hu\u002F16.telemetry\u002F4.sentry","i-lucide-bug",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":44},"Referencia","i-lucide-book-open","\u002Fhu\u002Freference","hu\u002F17.reference",[203,208],{"title":204,"path":205,"stem":206,"icon":207},"Konfiguráció","\u002Fhu\u002Freference\u002Fconfiguration","hu\u002F17.reference\u002F1.configuration","i-lucide-settings",{"title":209,"path":210,"stem":211,"icon":212},"Külső függőségek","\u002Fhu\u002Freference\u002Fdependencies","hu\u002F17.reference\u002F2.dependencies","i-lucide-package",{"title":214,"icon":215,"path":216,"stem":217,"children":218,"page":44},"Koncepciók","i-lucide-lightbulb","\u002Fhu\u002Fconcepts","hu\u002F2.concepts",[219,223,228,232,237],{"title":220,"path":221,"stem":222,"icon":47},"Architektúra","\u002Fhu\u002Fconcepts\u002Farchitecture","hu\u002F2.concepts\u002F1.architecture",{"title":224,"path":225,"stem":226,"icon":227},"Hibamodell","\u002Fhu\u002Fconcepts\u002Ferror-model","hu\u002F2.concepts\u002F2.error-model","i-lucide-shield-alert",{"title":204,"path":229,"stem":230,"icon":231},"\u002Fhu\u002Fconcepts\u002Fconfiguration","hu\u002F2.concepts\u002F3.configuration","i-lucide-settings-2",{"title":233,"path":234,"stem":235,"icon":236},"Codegen pipeline","\u002Fhu\u002Fconcepts\u002Fcodegen-pipeline","hu\u002F2.concepts\u002F4.codegen-pipeline","i-lucide-file-json",{"title":238,"path":239,"stem":240,"icon":241},"Design patternek","\u002Fhu\u002Fconcepts\u002Fdesign-patterns","hu\u002F2.concepts\u002F5.design-patterns","i-lucide-puzzle",{"title":243,"icon":244,"path":245,"stem":246,"children":247,"page":44},"A kit","i-lucide-box","\u002Fhu\u002Fkit","hu\u002F3.kit",[248,252,257,262,267,271,276],{"title":249,"path":250,"stem":251,"icon":244},"A kit áttekintése","\u002Fhu\u002Fkit\u002Foverview","hu\u002F3.kit\u002F1.overview",{"title":253,"path":254,"stem":255,"icon":256},"Alkalmazás-életciklus","\u002Fhu\u002Fkit\u002Fapp","hu\u002F3.kit\u002F2.app","i-lucide-power",{"title":258,"path":259,"stem":260,"icon":261},"Szerver","\u002Fhu\u002Fkit\u002Fserver","hu\u002F3.kit\u002F3.server","i-lucide-server",{"title":263,"path":264,"stem":265,"icon":266},"Worker","\u002Fhu\u002Fkit\u002Fworker","hu\u002F3.kit\u002F4.worker","i-lucide-cog",{"title":268,"path":269,"stem":270,"icon":70},"Realtime","\u002Fhu\u002Fkit\u002Frealtime","hu\u002F3.kit\u002F5.realtime",{"title":272,"path":273,"stem":274,"icon":275},"Migrációk","\u002Fhu\u002Fkit\u002Fmigrations","hu\u002F3.kit\u002F6.migrations","i-lucide-file-stack",{"title":277,"path":278,"stem":279,"icon":111},"Social login","\u002Fhu\u002Fkit\u002Fsocial-login","hu\u002F3.kit\u002F7.social-login",{"title":281,"icon":282,"path":283,"stem":284,"children":285,"page":44},"CLI referencia","i-lucide-terminal","\u002Fhu\u002Fcli","hu\u002F4.cli",[286,289,294,299,304,309,314,319,324,329,334,338,343,348,352],{"title":52,"path":287,"stem":288,"icon":282},"\u002Fhu\u002Fcli\u002Foverview","hu\u002F4.cli\u002F1.overview",{"title":290,"path":291,"stem":292,"icon":293},"add db","\u002Fhu\u002Fcli\u002Fadd-db","hu\u002F4.cli\u002F10.add-db","i-lucide-database-zap",{"title":295,"path":296,"stem":297,"icon":298},"add compose \u002F add docker","\u002Fhu\u002Fcli\u002Fadd-compose","hu\u002F4.cli\u002F11.add-compose","i-lucide-container",{"title":300,"path":301,"stem":302,"icon":303},"add mail","\u002Fhu\u002Fcli\u002Fadd-mail","hu\u002F4.cli\u002F12.add-mail","i-lucide-mail-plus",{"title":305,"path":306,"stem":307,"icon":308},"add notification","\u002Fhu\u002Fcli\u002Fadd-notification","hu\u002F4.cli\u002F13.add-notification","i-lucide-bell-plus",{"title":310,"path":311,"stem":312,"icon":313},"add realtime","\u002Fhu\u002Fcli\u002Fadd-realtime","hu\u002F4.cli\u002F14.add-realtime","i-lucide-radio-tower",{"title":315,"path":316,"stem":317,"icon":318},"add seeder","\u002Fhu\u002Fcli\u002Fadd-seeder","hu\u002F4.cli\u002F15.add-seeder","i-lucide-sprout",{"title":320,"path":321,"stem":322,"icon":323},"new project","\u002Fhu\u002Fcli\u002Fnew-project","hu\u002F4.cli\u002F2.new-project","i-lucide-folder-plus",{"title":325,"path":326,"stem":327,"icon":328},"new module","\u002Fhu\u002Fcli\u002Fnew-module","hu\u002F4.cli\u002F3.new-module","i-lucide-blocks",{"title":330,"path":331,"stem":332,"icon":333},"add surface","\u002Fhu\u002Fcli\u002Fadd-surface","hu\u002F4.cli\u002F4.add-surface","i-lucide-layers-2",{"title":335,"path":336,"stem":337,"icon":244},"add core","\u002Fhu\u002Fcli\u002Fadd-core","hu\u002F4.cli\u002F5.add-core",{"title":339,"path":340,"stem":341,"icon":342},"add handler","\u002Fhu\u002Fcli\u002Fadd-handler","hu\u002F4.cli\u002F6.add-handler","i-lucide-webhook",{"title":344,"path":345,"stem":346,"icon":347},"new migration","\u002Fhu\u002Fcli\u002Fnew-migration","hu\u002F4.cli\u002F7.new-migration","i-lucide-file-plus",{"title":349,"path":350,"stem":351,"icon":266},"worker generátorok","\u002Fhu\u002Fcli\u002Fworker-generators","hu\u002F4.cli\u002F8.worker-generators",{"title":353,"path":354,"stem":355,"icon":356},"upgrade templates","\u002Fhu\u002Fcli\u002Fupgrade-templates","hu\u002F4.cli\u002F9.upgrade-templates","i-lucide-refresh-cw",{"title":358,"icon":227,"path":359,"stem":360,"children":361,"page":44},"errs","\u002Fhu\u002Ferrs","hu\u002F5.errs",[362,365,369],{"title":52,"path":363,"stem":364,"icon":227},"\u002Fhu\u002Ferrs\u002Foverview","hu\u002F5.errs\u002F1.overview",{"title":366,"path":367,"stem":368},"API","\u002Fhu\u002Ferrs\u002Fapi","hu\u002F5.errs\u002F2.api",{"title":370,"path":371,"stem":372,"icon":227},"Integráció","\u002Fhu\u002Ferrs\u002Fintegration","hu\u002F5.errs\u002F3.integration",{"title":374,"icon":231,"path":375,"stem":376,"children":377,"page":44},"envconf","\u002Fhu\u002Fenvconf","hu\u002F6.envconf",[378,381],{"title":52,"path":379,"stem":380,"icon":231},"\u002Fhu\u002Fenvconf\u002Foverview","hu\u002F6.envconf\u002F1.overview",{"title":382,"path":383,"stem":384},"Receptek","\u002Fhu\u002Fenvconf\u002Frecipes","hu\u002F6.envconf\u002F2.recipes",{"title":386,"icon":387,"path":388,"stem":389,"children":390,"page":44},"httperr","i-lucide-globe","\u002Fhu\u002Fhttperr","hu\u002F7.httperr",[391,394,399],{"title":52,"path":392,"stem":393,"icon":387},"\u002Fhu\u002Fhttperr\u002Foverview","hu\u002F7.httperr\u002F1.overview",{"title":395,"path":396,"stem":397,"icon":398},"Hibaválaszok","\u002Fhu\u002Fhttperr\u002Ferror-responses","hu\u002F7.httperr\u002F2.error-responses","i-lucide-octagon-alert",{"title":400,"path":401,"stem":402,"icon":403},"Validáció","\u002Fhu\u002Fhttperr\u002Fvalidation","hu\u002F7.httperr\u002F3.validation","i-lucide-badge-check",{"title":405,"icon":406,"path":407,"stem":408,"children":409,"page":44},"dbx","i-lucide-database","\u002Fhu\u002Fdbx","hu\u002F8.dbx",[410,413,417,421,426],{"title":52,"path":411,"stem":412,"icon":406},"\u002Fhu\u002Fdbx\u002Foverview","hu\u002F8.dbx\u002F1.overview",{"title":414,"path":415,"stem":416,"icon":106},"pgx","\u002Fhu\u002Fdbx\u002Fpg","hu\u002F8.dbx\u002F2.pg",{"title":418,"path":419,"stem":420,"icon":47},"bun","\u002Fhu\u002Fdbx\u002Fbunx","hu\u002F8.dbx\u002F3.bunx",{"title":422,"path":423,"stem":424,"icon":425},"Tranzakciók","\u002Fhu\u002Fdbx\u002Ftransactions","hu\u002F8.dbx\u002F4.transactions","i-lucide-git-merge",{"title":427,"path":428,"stem":429,"icon":318},"Seederek","\u002Fhu\u002Fdbx\u002Fseed","hu\u002F8.dbx\u002F5.seed",{"title":431,"icon":55,"path":432,"stem":433,"children":434,"page":44},"paginate","\u002Fhu\u002Fpaginate","hu\u002F9.paginate",[435,438],{"title":52,"path":436,"stem":437,"icon":55},"\u002Fhu\u002Fpaginate\u002Foverview","hu\u002F9.paginate\u002F1.overview",{"title":439,"path":440,"stem":441,"icon":19},"Cursor-lapozás","\u002Fhu\u002Fpaginate\u002Fcursor","hu\u002F9.paginate\u002F2.cursor",{"id":443,"title":253,"body":444,"description":1314,"extension":1315,"links":1316,"meta":1317,"navigation":1318,"path":254,"seo":1319,"stem":255,"__hash__":1320},"docs_hu\u002Fhu\u002F3.kit\u002F2.app.md",{"type":445,"value":446,"toc":1306},"minimark",[447,465,474,479,485,733,740,847,852,863,870,874,885,992,1017,1023,1027,1038,1206,1234,1248,1252,1289,1302],[448,449,450,451,455,456,460,461,464],"p",{},"PHP-ban a folyamat életciklusa nem a te problémád volt: a php-fpm elindította a workert, lefuttatta a kérést, és ha deployoltál, a supervisor gondoskodott a cseréről. Go-ban a binárisod ",[452,453,454],"strong",{},"maga a szerver",": neki kell figyelnie a ",[457,458,459],"code",{},"SIGTERM","-et, kivárnia az in-flight kéréseket, lezárnia a connection poolt és kiflusholnia a telemetriát, mielőtt kilép. Ez tipikusan az a ~60 sor boilerplate, amit minden service ",[457,462,463],{},"main.go","-jába bemásolnak, és amit mindig kicsit másképp rontanak el.",[448,466,467,468,473],{},"A kit ezt egyszer írja meg, az ",[452,469,470],{},[457,471,472],{},"app"," csomagban, és ettől a téma megint nem-téma: a generált projektekben a graceful shutdown egyszerűen ott van, és most láthatod is, mi történik.",[475,476,478],"h2",{"id":477},"apprun-és-a-params","app.Run és a Params",[448,480,481,482,484],{},"Az ",[457,483,472],{}," csomag engine-agnosztikus: se HTTP-t, se más transzportot nem ismer. Egyetlen belépési pontja van:",[486,487,492],"pre",{"className":488,"code":489,"language":490,"meta":491,"style":491},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Closer egy nevesített cleanup-függvény, graceful shutdownkor fut.\ntype Closer struct {\n    Name string\n    Fn   func(context.Context) error\n}\n\n\u002F\u002F Params egy processzfutást ír le.\ntype Params struct {\n    ListenAddr      string                          \u002F\u002F csak a startup-loghoz\n    ShutdownTimeout time.Duration                   \u002F\u002F az in-flight drain kerete\n    Serve           func() error                    \u002F\u002F blokkoló listen; goroutine-ban fut\n    Shutdown        func(context.Context) error     \u002F\u002F nincs új kérés, in-flight drain\n    Closers         []Closer                        \u002F\u002F rendezett cleanup-lista\n    Flush           func(context.Context) error     \u002F\u002F telemetria-flush, legutolsóként\n}\n\nfunc Run(ctx context.Context, p Params) error\n","go","",[457,493,494,503,520,531,555,561,568,574,586,598,615,630,651,666,687,692,697],{"__ignoreMap":491},[495,496,499],"span",{"class":497,"line":498},"line",1,[495,500,502],{"class":501},"sHwdD","\u002F\u002F Closer egy nevesített cleanup-függvény, graceful shutdownkor fut.\n",[495,504,506,510,514,517],{"class":497,"line":505},2,[495,507,509],{"class":508},"sMK4o","type",[495,511,513],{"class":512},"sBMFI"," Closer",[495,515,516],{"class":508}," struct",[495,518,519],{"class":508}," {\n",[495,521,523,527],{"class":497,"line":522},3,[495,524,526],{"class":525},"sTEyZ","    Name ",[495,528,530],{"class":529},"spNyl","string\n",[495,532,534,537,540,543,546,549,552],{"class":497,"line":533},4,[495,535,536],{"class":525},"    Fn   ",[495,538,539],{"class":508},"func(",[495,541,542],{"class":512},"context",[495,544,545],{"class":508},".",[495,547,548],{"class":512},"Context",[495,550,551],{"class":508},")",[495,553,554],{"class":529}," error\n",[495,556,558],{"class":497,"line":557},5,[495,559,560],{"class":508},"}\n",[495,562,564],{"class":497,"line":563},6,[495,565,567],{"emptyLinePlaceholder":566},true,"\n",[495,569,571],{"class":497,"line":570},7,[495,572,573],{"class":501},"\u002F\u002F Params egy processzfutást ír le.\n",[495,575,577,579,582,584],{"class":497,"line":576},8,[495,578,509],{"class":508},[495,580,581],{"class":512}," Params",[495,583,516],{"class":508},[495,585,519],{"class":508},[495,587,589,592,595],{"class":497,"line":588},9,[495,590,591],{"class":525},"    ListenAddr      ",[495,593,594],{"class":529},"string",[495,596,597],{"class":501},"                          \u002F\u002F csak a startup-loghoz\n",[495,599,601,604,607,609,612],{"class":497,"line":600},10,[495,602,603],{"class":525},"    ShutdownTimeout ",[495,605,606],{"class":512},"time",[495,608,545],{"class":508},[495,610,611],{"class":512},"Duration",[495,613,614],{"class":501},"                   \u002F\u002F az in-flight drain kerete\n",[495,616,618,621,624,627],{"class":497,"line":617},11,[495,619,620],{"class":525},"    Serve           ",[495,622,623],{"class":508},"func()",[495,625,626],{"class":529}," error",[495,628,629],{"class":501},"                    \u002F\u002F blokkoló listen; goroutine-ban fut\n",[495,631,633,636,638,640,642,644,646,648],{"class":497,"line":632},12,[495,634,635],{"class":525},"    Shutdown        ",[495,637,539],{"class":508},[495,639,542],{"class":512},[495,641,545],{"class":508},[495,643,548],{"class":512},[495,645,551],{"class":508},[495,647,626],{"class":529},[495,649,650],{"class":501},"     \u002F\u002F nincs új kérés, in-flight drain\n",[495,652,654,657,660,663],{"class":497,"line":653},13,[495,655,656],{"class":525},"    Closers         ",[495,658,659],{"class":508},"[]",[495,661,662],{"class":512},"Closer",[495,664,665],{"class":501},"                        \u002F\u002F rendezett cleanup-lista\n",[495,667,669,672,674,676,678,680,682,684],{"class":497,"line":668},14,[495,670,671],{"class":525},"    Flush           ",[495,673,539],{"class":508},[495,675,542],{"class":512},[495,677,545],{"class":508},[495,679,548],{"class":512},[495,681,551],{"class":508},[495,683,626],{"class":529},[495,685,686],{"class":501},"     \u002F\u002F telemetria-flush, legutolsóként\n",[495,688,690],{"class":497,"line":689},15,[495,691,560],{"class":508},[495,693,695],{"class":497,"line":694},16,[495,696,567],{"emptyLinePlaceholder":566},[495,698,700,703,707,710,714,717,719,721,724,727,729,731],{"class":497,"line":699},17,[495,701,702],{"class":508},"func",[495,704,706],{"class":705},"s2Zo4"," Run",[495,708,709],{"class":508},"(",[495,711,713],{"class":712},"sHdIc","ctx",[495,715,716],{"class":512}," context",[495,718,545],{"class":508},[495,720,548],{"class":512},[495,722,723],{"class":508},",",[495,725,726],{"class":712}," p",[495,728,581],{"class":512},[495,730,551],{"class":508},[495,732,554],{"class":529},[448,734,735,736,739],{},"A ",[457,737,738],{},"Run"," blokkol, amíg a processz le nem áll, és a következő gépezetet hajtja:",[741,742,743,766,782,806,824,836],"ol",{},[744,745,746,751,752,755,756,758,759,761,762,765],"li",{},[452,747,748],{},[457,749,750],{},"signal.NotifyContext(ctx, os.Interrupt, syscall.SIGTERM)",": a ",[457,753,754],{},"SIGINT","\u002F",[457,757,459],{}," a contextet cancelezi. Mivel a szülő ",[457,760,713],{},"-ből származik, a ",[452,763,764],{},"szülő context cancelje is shutdownt vált ki",": tesztben így állítasz le egy futó service-t signal nélkül.",[744,767,768,774,775,777,778,781],{},[452,769,770,773],{},[457,771,772],{},"Serve"," goroutine-ban indul."," Ha magától hibával tér vissza (pl. foglalt a port), a ",[457,776,738],{}," ",[457,779,780],{},"app: listen:"," hibával lép ki, de a closerek és a flush ilyenkor is lefutnak.",[744,783,784,751,787,789,790,797,798,801,802,805],{},[452,785,786],{},"Signalra",[457,788,738],{}," visszaállítja az alapértelmezett signal-kezelést (ezért ",[452,791,792,793,796],{},"egy második ",[457,794,795],{},"Ctrl-C"," azonnal, kegyelem nélkül öli a processzt","), majd meghívja a ",[457,799,800],{},"Shutdown","-t egy ",[457,803,804],{},"ShutdownTimeout","-os contexttel. Itt drainelnek az in-flight kérések.",[744,807,808,811,812,816,817,819,820,823],{},[452,809,810],{},"Cleanup saját kerettel",": a closerek és a flush egy ",[813,814,815],"em",{},"friss",", szintén ",[457,818,804],{},"-os contextet kapnak. Ha a HTTP-drain felélte a teljes keretet, a cleanup akkor sem nulla idővel indul: a pool-lezárás és a telemetria-export nem esik áldozatul egy lassú kérésnek. (Mindkét shutdown-context ",[457,821,822],{},"context.WithoutCancel","-lel válik le a szülőről: egy már cancelezett szülő nem vágja rövidre a rendezett leállást.)",[744,825,826,829,830,545],{},[452,827,828],{},"Closerek LIFO sorrendben",", majd ",[452,831,832,833],{},"legvégül a ",[457,834,835],{},"Flush",[744,837,838,839,842,843,846],{},"Tiszta leállásnál ",[457,840,841],{},"nil"," a visszatérési érték; a részhibák ",[457,844,845],{},"errors.Join","-nal gyűlnek, tehát egy hibázó closer nem nyeli el a többiét.",[848,849,851],"h3",{"id":850},"miért-lifo-és-miért-utolsó-a-flush","Miért LIFO, és miért utolsó a flush?",[448,853,854,855,858,859,862],{},"A closerek ",[452,856,857],{},"fordított regisztrációs sorrendben"," futnak, mert a függőségek így záródnak helyes irányban: amit előbb nyitottál (pl. a pgx pool), arra még szüksége lehet annak, amit később építettél rá (pl. egy rá támaszkodó consumer). Amit utoljára nyitottál, azt zárod először, pontosan ahogy a ",[457,860,861],{},"defer"," működik egy függvényen belül.",[448,864,865,866,869],{},"A telemetria-flush pedig azért a legutolsó, mert ",[452,867,868],{},"a closerek maguk is bocsátanak ki telemetriát",": egy pool-lezárás loga, egy cleanup közben nyitott span csak akkor jut el az OTLP-endpointig vagy a Sentrybe, ha az exporterek még élnek. Ha a flush a closerek előtt futna, a leállás utolsó másodpercei vakfoltba esnének.",[475,871,873],{"id":872},"ki-ül-rajta","Ki ül rajta?",[448,875,876,877,880,881,884],{},"Mindhárom chassis ugyanezt az ",[457,878,879],{},"app.Run","-t tölti ki, csak a ",[457,882,883],{},"Params"," tartalma más:",[886,887,888,912],"table",{},[889,890,891],"thead",{},[892,893,894,897,902,907],"tr",{},[895,896,883],"th",{},[895,898,899],{},[457,900,901],{},"server.Run",[895,903,904],{},[457,905,906],{},"worker.Run",[895,908,909],{},[457,910,911],{},"realtime.Run",[913,914,915,933,953,975],"tbody",{},[892,916,917,922,927,930],{},[918,919,920],"td",{},[457,921,772],{},[918,923,924],{},[457,925,926],{},"srv.ListenAndServe",[918,928,929],{},"asynq szerver + outbox relay + ütemező",[918,931,932],{},"a kapcsolatokat fogadó centrifuge node",[892,934,935,939,944,947],{},[918,936,937],{},[457,938,800],{},[918,940,941],{},[457,942,943],{},"srv.Shutdown",[918,945,946],{},"loopok leállítása, in-flight taskok drainelése",[918,948,949,952],{},[457,950,951],{},"node.Shutdown",", tartott kapcsolatok drainelése",[892,954,955,960,967,971],{},[918,956,957],{},[457,958,959],{},"Closers",[918,961,962,963,966],{},"a ",[457,964,965],{},"WithCloser"," opciók",[918,968,962,969,966],{},[457,970,965],{},[918,972,962,973,966],{},[457,974,965],{},[892,976,977,981,987,990],{},[918,978,979],{},[457,980,835],{},[918,982,983,986],{},[457,984,985],{},"telemetry.Setup"," shutdown-függvénye",[918,988,989],{},"ugyanaz",[918,991,989],{},[448,993,994,995,997,998,1000,1001,1004,1005,1009,1010,1013,1014,1016],{},"Mindhárom a ",[457,996,985],{},"-pal indít, és a visszakapott shutdown-függvényt adja át ",[457,999,835],{},"-ként, így a \"Sentry és OTel flush a legvégén\" garancia bináris-típustól függetlenül azonos. A workernél az in-flight drain mást jelent: a ",[457,1002,1003],{},"WORKER_SHUTDOWN_TIMEOUT"," alatt be nem fejezett taskokat az asynq visszateszi a sorba, és később újra kézbesíti (",[1006,1007,1008],"a",{"href":264},"at-least-once","); a ",[457,1011,1012],{},"realtime","-nál pedig azt, hogy minden tartott WebSocket-kapcsolat reconnect-jogosult close-kódot kap, mielőtt a processz kilép (",[1006,1015,268],{"href":269},").",[448,1018,1019,1020,1022],{},"Ha egy saját, negyedik chassis-t építenél (pl. egy gRPC-szervert), ugyanígy az ",[457,1021,879],{},"-ra teheted: a csomagnak nincs HTTP-függősége.",[475,1024,1026],{"id":1025},"a-shop-maingo-ja","A shop main.go-ja",[448,1028,1029,1030,1033,1034,1037],{},"A gyakorlatban az életciklushoz egyetlen ponton nyúlsz hozzá: closert regisztrálsz mindenre, amit a ",[457,1031,1032],{},"main","-ben nyitottál. A ",[1006,1035,1036],{"href":41},"shop mintaalkalmazás"," belépési pontjában ez a pgx pool:",[486,1039,1042],{"className":488,"code":1040,"filename":1041,"language":490,"meta":491,"style":491},"pool := pg.MustNewPool(ctx, cfg.DB)\n\nerr := server.Run(ctx, cfg.Server, func(r chi.Router) error {\n    \u002F\u002F ... modulregisztráció ...\n    return nil\n}, server.WithCloser(\"pgxpool\", func(context.Context) error {\n    pool.Close()\n    return nil\n}))\n","cmd\u002Fshop\u002Fmain.go",[457,1043,1044,1077,1081,1130,1135,1144,1182,1195,1201],{"__ignoreMap":491},[495,1045,1046,1049,1052,1055,1057,1060,1062,1064,1066,1069,1071,1074],{"class":497,"line":498},[495,1047,1048],{"class":525},"pool ",[495,1050,1051],{"class":508},":=",[495,1053,1054],{"class":525}," pg",[495,1056,545],{"class":508},[495,1058,1059],{"class":705},"MustNewPool",[495,1061,709],{"class":508},[495,1063,713],{"class":525},[495,1065,723],{"class":508},[495,1067,1068],{"class":525}," cfg",[495,1070,545],{"class":508},[495,1072,1073],{"class":525},"DB",[495,1075,1076],{"class":508},")\n",[495,1078,1079],{"class":497,"line":505},[495,1080,567],{"emptyLinePlaceholder":566},[495,1082,1083,1086,1088,1091,1093,1095,1097,1099,1101,1103,1105,1108,1110,1113,1116,1119,1121,1124,1126,1128],{"class":497,"line":522},[495,1084,1085],{"class":525},"err ",[495,1087,1051],{"class":508},[495,1089,1090],{"class":525}," server",[495,1092,545],{"class":508},[495,1094,738],{"class":705},[495,1096,709],{"class":508},[495,1098,713],{"class":525},[495,1100,723],{"class":508},[495,1102,1068],{"class":525},[495,1104,545],{"class":508},[495,1106,1107],{"class":525},"Server",[495,1109,723],{"class":508},[495,1111,1112],{"class":508}," func(",[495,1114,1115],{"class":712},"r",[495,1117,1118],{"class":512}," chi",[495,1120,545],{"class":508},[495,1122,1123],{"class":512},"Router",[495,1125,551],{"class":508},[495,1127,626],{"class":529},[495,1129,519],{"class":508},[495,1131,1132],{"class":497,"line":533},[495,1133,1134],{"class":501},"    \u002F\u002F ... modulregisztráció ...\n",[495,1136,1137,1141],{"class":497,"line":557},[495,1138,1140],{"class":1139},"s7zQu","    return",[495,1142,1143],{"class":508}," nil\n",[495,1145,1146,1149,1151,1153,1155,1157,1160,1164,1166,1168,1170,1172,1174,1176,1178,1180],{"class":497,"line":563},[495,1147,1148],{"class":508},"},",[495,1150,1090],{"class":525},[495,1152,545],{"class":508},[495,1154,965],{"class":705},[495,1156,709],{"class":508},[495,1158,1159],{"class":508},"\"",[495,1161,1163],{"class":1162},"sfazB","pgxpool",[495,1165,1159],{"class":508},[495,1167,723],{"class":508},[495,1169,1112],{"class":508},[495,1171,542],{"class":512},[495,1173,545],{"class":508},[495,1175,548],{"class":512},[495,1177,551],{"class":508},[495,1179,626],{"class":529},[495,1181,519],{"class":508},[495,1183,1184,1187,1189,1192],{"class":497,"line":570},[495,1185,1186],{"class":525},"    pool",[495,1188,545],{"class":508},[495,1190,1191],{"class":705},"Close",[495,1193,1194],{"class":508},"()\n",[495,1196,1197,1199],{"class":497,"line":576},[495,1198,1140],{"class":1139},[495,1200,1143],{"class":508},[495,1202,1203],{"class":497,"line":588},[495,1204,1205],{"class":508},"}))\n",[448,1207,1208,1209,1211,1212,1215,1216,1219,1220,1222,1223,1225,1226,1229,1230,1233],{},"Egy ",[457,1210,459],{}," érkezésekor tehát a sorrend: a shop nem fogad több kérést → a folyamatban lévő ",[457,1213,1214],{},"PlaceOrder"," még lefut (a tranzakciójával és az ",[1006,1217,1218],{"href":73},"outbox-írásával"," együtt) → a ",[457,1221,1163],{}," closer lezárja a poolt → a telemetria kiflusholja a kérés spanjeit. Kubernetes alatt ez pontosan az a viselkedés, amit egy rolling deploy elvár: a ",[457,1224,804],{},"-ot (",[457,1227,1228],{},"SHUTDOWN_TIMEOUT",", default 10s) érdemes a pod ",[457,1231,1232],{},"terminationGracePeriodSeconds","-énél rövidebbre hangolni.",[1235,1236,1237,1238,1241,1242,777,1244,1247],"note",{},"A closer neve (",[457,1239,1240],{},"\"pgxpool\"",") nem dísz: hibázó closernél a ",[457,1243,738],{},[457,1245,1246],{},"app: closer \"pgxpool\": ..."," formában adja vissza a hibát, így a logból azonnal látszik, melyik cleanup bukott el.",[475,1249,1251],{"id":1250},"mit-jelent-ez-a-mindennapokban","Mit jelent ez a mindennapokban",[1253,1254,1255,1269,1280],"ul",{},[744,1256,1257,1260,1261,1263,1264,1263,1266,1268],{},[452,1258,1259],{},"Nem írsz signal-kezelést."," Soha. A ",[457,1262,901],{}," \u002F ",[457,1265,906],{},[457,1267,911],{}," hívása maga az életciklus.",[744,1270,1271,1276,1277,1279],{},[452,1272,735,1273,1275],{},[457,1274,1032],{},"-ben nyitott erőforrásokhoz closer jár",": a generátorok a pgx poolét maguktól bekötik, a sajátjaidat (pl. egy Valkey-klienst) te adod hozzá ",[457,1278,965],{},"-rel, a nyitás sorrendjében.",[744,1281,1282,1288],{},[452,1283,1284,1285,1287],{},"A dupla ",[457,1286,795],{}," menekülőútvonal marad",": ha fejlesztés közben beragadna egy drain, a második signal azonnal kilő.",[448,1290,1291,1292,1295,1296,1298,1299,1301],{},"A HTTP-oldali lépéssort (telemetria → router-építés → regisztráció → listen → shutdown) a ",[1006,1293,1294],{"href":259},"szerver"," oldal mutatja be; a worker-oldali drain részleteit a ",[1006,1297,263],{"href":264}," oldal; a kapcsolat-drainelés részleteit a ",[1006,1300,268],{"href":269}," oldal.",[1303,1304,1305],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":491,"searchDepth":505,"depth":505,"links":1307},[1308,1311,1312,1313],{"id":477,"depth":505,"text":478,"children":1309},[1310],{"id":850,"depth":522,"text":851},{"id":872,"depth":505,"text":873},{"id":1025,"depth":505,"text":1026},{"id":1250,"depth":505,"text":1251},"Az app csomag: signal-vezérelt graceful shutdown, amin minden gpsystem bináris ül.","md",null,{},{"icon":256},{"title":253,"description":1314},"l53ZSEsPVXFFNze3phlileJumEKKJpCifB5uHdaAc18",[1322,1324],{"title":249,"path":250,"stem":251,"description":1323,"icon":244,"children":-1},"Mi maradt a vékony gpsystem kitben, és hogyan komponálja az önálló modulokat.",{"title":258,"path":259,"stem":260,"description":1325,"icon":261,"children":-1},"A chi-alapú HTTP-chassis: Config (timeoutok, CORS, body limit), a közös életciklus, és hogy mit köt be a server.Run.",1785445886046]