[{"data":1,"prerenderedAt":2399},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-framework-worker":449,"-hu-framework-worker-surround":2394},[4,45,120,158,174,204,234,260,272,288,308,327,340,357,374,387,399,426],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Kezdő lépések","i-lucide-rocket","\u002Fhu\u002Fgetting-started","hu\u002F01.getting-started",[10,15,20,25,30,35,40],{"title":11,"path":12,"stem":13,"icon":14},"Bevezetés","\u002Fhu\u002Fgetting-started\u002Fintroduction","hu\u002F01.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Telepítés","\u002Fhu\u002Fgetting-started\u002Finstallation","hu\u002F01.getting-started\u002F2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Az első modulod","\u002Fhu\u002Fgetting-started\u002Ffirst-module","hu\u002F01.getting-started\u002F3.first-module","i-lucide-package-plus",{"title":26,"path":27,"stem":28,"icon":29},"Projektstruktúra","\u002Fhu\u002Fgetting-started\u002Fproject-structure","hu\u002F01.getting-started\u002F4.project-structure","i-lucide-folder-tree",{"title":31,"path":32,"stem":33,"icon":34},"A shop mintaalkalmazás","\u002Fhu\u002Fgetting-started\u002Fsample-app","hu\u002F01.getting-started\u002F5.sample-app","i-lucide-shopping-cart",{"title":36,"path":37,"stem":38,"icon":39},"Laravelből érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-laravel","hu\u002F01.getting-started\u002F6.coming-from-laravel","i-lucide-arrow-right-left",{"title":41,"path":42,"stem":43,"icon":39},"Symfonyból érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-symfony","hu\u002F01.getting-started\u002F7.coming-from-symfony",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"CLI referencia","i-lucide-terminal","\u002Fhu\u002Fcli","hu\u002F02.cli",[51,55,60,65,70,75,80,85,90,95,100,105,110,115],{"title":52,"path":53,"stem":54,"icon":47},"Áttekintés","\u002Fhu\u002Fcli\u002Foverview","hu\u002F02.cli\u002F1.overview",{"title":56,"path":57,"stem":58,"icon":59},"add compose \u002F add docker","\u002Fhu\u002Fcli\u002Fadd-compose","hu\u002F02.cli\u002F10.add-compose","i-lucide-container",{"title":61,"path":62,"stem":63,"icon":64},"add mail","\u002Fhu\u002Fcli\u002Fadd-mail","hu\u002F02.cli\u002F11.add-mail","i-lucide-mail-plus",{"title":66,"path":67,"stem":68,"icon":69},"add notification","\u002Fhu\u002Fcli\u002Fadd-notification","hu\u002F02.cli\u002F12.add-notification","i-lucide-bell-plus",{"title":71,"path":72,"stem":73,"icon":74},"add realtime","\u002Fhu\u002Fcli\u002Fadd-realtime","hu\u002F02.cli\u002F13.add-realtime","i-lucide-radio-tower",{"title":76,"path":77,"stem":78,"icon":79},"add seeder","\u002Fhu\u002Fcli\u002Fadd-seeder","hu\u002F02.cli\u002F14.add-seeder","i-lucide-sprout",{"title":81,"path":82,"stem":83,"icon":84},"new project","\u002Fhu\u002Fcli\u002Fnew-project","hu\u002F02.cli\u002F2.new-project","i-lucide-folder-plus",{"title":86,"path":87,"stem":88,"icon":89},"new module","\u002Fhu\u002Fcli\u002Fnew-module","hu\u002F02.cli\u002F3.new-module","i-lucide-blocks",{"title":91,"path":92,"stem":93,"icon":94},"add surface","\u002Fhu\u002Fcli\u002Fadd-surface","hu\u002F02.cli\u002F4.add-surface","i-lucide-layers-2",{"title":96,"path":97,"stem":98,"icon":99},"add domain","\u002Fhu\u002Fcli\u002Fadd-domain","hu\u002F02.cli\u002F5.add-domain","i-lucide-box",{"title":101,"path":102,"stem":103,"icon":104},"add handler","\u002Fhu\u002Fcli\u002Fadd-handler","hu\u002F02.cli\u002F6.add-handler","i-lucide-webhook",{"title":106,"path":107,"stem":108,"icon":109},"new migration","\u002Fhu\u002Fcli\u002Fnew-migration","hu\u002F02.cli\u002F7.new-migration","i-lucide-file-plus",{"title":111,"path":112,"stem":113,"icon":114},"worker generátorok","\u002Fhu\u002Fcli\u002Fworker-generators","hu\u002F02.cli\u002F8.worker-generators","i-lucide-cog",{"title":116,"path":117,"stem":118,"icon":119},"add db","\u002Fhu\u002Fcli\u002Fadd-db","hu\u002F02.cli\u002F9.add-db","i-lucide-database-zap",{"title":121,"icon":99,"path":122,"stem":123,"children":124,"page":44},"A framework","\u002Fhu\u002Fframework","hu\u002F03.framework",[125,129,134,139,143,148,153],{"title":126,"path":127,"stem":128,"icon":99},"A framework áttekintése","\u002Fhu\u002Fframework\u002Foverview","hu\u002F03.framework\u002F1.overview",{"title":130,"path":131,"stem":132,"icon":133},"Alkalmazás-életciklus","\u002Fhu\u002Fframework\u002Fapp","hu\u002F03.framework\u002F2.app","i-lucide-power",{"title":135,"path":136,"stem":137,"icon":138},"Szerver","\u002Fhu\u002Fframework\u002Fserver","hu\u002F03.framework\u002F3.server","i-lucide-server",{"title":140,"path":141,"stem":142,"icon":114},"Worker","\u002Fhu\u002Fframework\u002Fworker","hu\u002F03.framework\u002F4.worker",{"title":144,"path":145,"stem":146,"icon":147},"Realtime","\u002Fhu\u002Fframework\u002Frealtime","hu\u002F03.framework\u002F5.realtime","i-lucide-radio",{"title":149,"path":150,"stem":151,"icon":152},"Migrációk","\u002Fhu\u002Fframework\u002Fmigrations","hu\u002F03.framework\u002F6.migrations","i-lucide-file-stack",{"title":154,"path":155,"stem":156,"icon":157},"Social login","\u002Fhu\u002Fframework\u002Fsocial-login","hu\u002F03.framework\u002F7.social-login","i-lucide-log-in",{"title":159,"icon":160,"path":161,"stem":162,"children":163,"page":44},"Referencia","i-lucide-book-open","\u002Fhu\u002Freference","hu\u002F04.reference",[164,169],{"title":165,"path":166,"stem":167,"icon":168},"Konfiguráció","\u002Fhu\u002Freference\u002Fconfiguration","hu\u002F04.reference\u002F1.configuration","i-lucide-settings",{"title":170,"path":171,"stem":172,"icon":173},"Külső függőségek","\u002Fhu\u002Freference\u002Fdependencies","hu\u002F04.reference\u002F2.dependencies","i-lucide-package",{"title":175,"icon":176,"path":177,"stem":178,"children":179,"page":44},"Koncepciók","i-lucide-lightbulb","\u002Fhu\u002Fconcepts","hu\u002F05.concepts",[180,185,190,194,199],{"title":181,"path":182,"stem":183,"icon":184},"Architektúra","\u002Fhu\u002Fconcepts\u002Farchitecture","hu\u002F05.concepts\u002F1.architecture","i-lucide-layers",{"title":186,"path":187,"stem":188,"icon":189},"Hibamodell","\u002Fhu\u002Fconcepts\u002Ferror-model","hu\u002F05.concepts\u002F2.error-model","i-lucide-shield-alert",{"title":165,"path":191,"stem":192,"icon":193},"\u002Fhu\u002Fconcepts\u002Fconfiguration","hu\u002F05.concepts\u002F3.configuration","i-lucide-settings-2",{"title":195,"path":196,"stem":197,"icon":198},"Codegen pipeline","\u002Fhu\u002Fconcepts\u002Fcodegen-pipeline","hu\u002F05.concepts\u002F4.codegen-pipeline","i-lucide-file-json",{"title":200,"path":201,"stem":202,"icon":203},"Design patternek","\u002Fhu\u002Fconcepts\u002Fdesign-patterns","hu\u002F05.concepts\u002F5.design-patterns","i-lucide-puzzle",{"title":205,"icon":206,"path":207,"stem":208,"children":209,"page":44},"auth","i-lucide-shield-check","\u002Fhu\u002Fauth","hu\u002F06.auth",[210,215,220,225,230],{"title":211,"path":212,"stem":213,"icon":214},"Autentikáció","\u002Fhu\u002Fauth\u002Foverview","hu\u002F06.auth\u002F1.overview","i-lucide-key-round",{"title":216,"path":217,"stem":218,"icon":219},"RBAC","\u002Fhu\u002Fauth\u002Frbac","hu\u002F06.auth\u002F2.rbac","i-lucide-users",{"title":221,"path":222,"stem":223,"icon":224},"Policy-k","\u002Fhu\u002Fauth\u002Fpolicy","hu\u002F06.auth\u002F3.policy","i-lucide-gavel",{"title":226,"path":227,"stem":228,"icon":229},"Az auth önálló használata","\u002Fhu\u002Fauth\u002Fstandalone","hu\u002F06.auth\u002F4.standalone","i-lucide-plug",{"title":231,"path":232,"stem":233,"icon":157},"Social login goth-tal, önállóan","\u002Fhu\u002Fauth\u002Fsocial-standalone","hu\u002F06.auth\u002F5.social-standalone",{"title":235,"icon":236,"path":237,"stem":238,"children":239,"page":44},"dbx","i-lucide-database","\u002Fhu\u002Fdbx","hu\u002F07.dbx",[240,243,247,251,256],{"title":52,"path":241,"stem":242,"icon":236},"\u002Fhu\u002Fdbx\u002Foverview","hu\u002F07.dbx\u002F1.overview",{"title":244,"path":245,"stem":246,"icon":229},"pgx","\u002Fhu\u002Fdbx\u002Fpg","hu\u002F07.dbx\u002F2.pg",{"title":248,"path":249,"stem":250,"icon":184},"bun","\u002Fhu\u002Fdbx\u002Fbunx","hu\u002F07.dbx\u002F3.bunx",{"title":252,"path":253,"stem":254,"icon":255},"Tranzakciók","\u002Fhu\u002Fdbx\u002Ftransactions","hu\u002F07.dbx\u002F4.transactions","i-lucide-git-merge",{"title":257,"path":258,"stem":259,"icon":79},"Seederek","\u002Fhu\u002Fdbx\u002Fseed","hu\u002F07.dbx\u002F5.seed",{"title":261,"icon":193,"path":262,"stem":263,"children":264,"page":44},"envconf","\u002Fhu\u002Fenvconf","hu\u002F08.envconf",[265,268],{"title":52,"path":266,"stem":267,"icon":193},"\u002Fhu\u002Fenvconf\u002Foverview","hu\u002F08.envconf\u002F1.overview",{"title":269,"path":270,"stem":271,"icon":193},"Receptek","\u002Fhu\u002Fenvconf\u002Frecipes","hu\u002F08.envconf\u002F2.recipes",{"title":273,"icon":189,"path":274,"stem":275,"children":276,"page":44},"errs","\u002Fhu\u002Ferrs","hu\u002F09.errs",[277,280,284],{"title":52,"path":278,"stem":279,"icon":189},"\u002Fhu\u002Ferrs\u002Foverview","hu\u002F09.errs\u002F1.overview",{"title":281,"path":282,"stem":283,"icon":189},"API","\u002Fhu\u002Ferrs\u002Fapi","hu\u002F09.errs\u002F2.api",{"title":285,"path":286,"stem":287,"icon":189},"Integráció","\u002Fhu\u002Ferrs\u002Fintegration","hu\u002F09.errs\u002F3.integration",{"title":289,"icon":290,"path":291,"stem":292,"children":293,"page":44},"events","i-lucide-workflow","\u002Fhu\u002Fevents","hu\u002F10.events",[294,298,303],{"title":295,"path":296,"stem":297,"icon":147},"Események","\u002Fhu\u002Fevents\u002Foverview","hu\u002F10.events\u002F1.overview",{"title":299,"path":300,"stem":301,"icon":302},"Outbox","\u002Fhu\u002Fevents\u002Foutbox","hu\u002F10.events\u002F2.outbox","i-lucide-inbox",{"title":304,"path":305,"stem":306,"icon":307},"Ütemezés","\u002Fhu\u002Fevents\u002Fscheduler","hu\u002F10.events\u002F3.scheduler","i-lucide-calendar-clock",{"title":309,"icon":310,"path":311,"stem":312,"children":313,"page":44},"httperr","i-lucide-globe","\u002Fhu\u002Fhttperr","hu\u002F11.httperr",[314,317,322],{"title":52,"path":315,"stem":316,"icon":310},"\u002Fhu\u002Fhttperr\u002Foverview","hu\u002F11.httperr\u002F1.overview",{"title":318,"path":319,"stem":320,"icon":321},"Hibaválaszok","\u002Fhu\u002Fhttperr\u002Ferror-responses","hu\u002F11.httperr\u002F2.error-responses","i-lucide-octagon-alert",{"title":323,"path":324,"stem":325,"icon":326},"Validáció","\u002Fhu\u002Fhttperr\u002Fvalidation","hu\u002F11.httperr\u002F3.validation","i-lucide-badge-check",{"title":328,"icon":329,"path":330,"stem":331,"children":332,"page":44},"logx","i-lucide-scroll-text","\u002Fhu\u002Flogx","hu\u002F12.logx",[333,336],{"title":52,"path":334,"stem":335,"icon":329},"\u002Fhu\u002Flogx\u002Foverview","hu\u002F12.logx\u002F1.overview",{"title":337,"path":338,"stem":339,"icon":47},"Monolog-formázó","\u002Fhu\u002Flogx\u002Fmonolog","hu\u002F12.logx\u002F2.monolog",{"title":341,"icon":342,"path":343,"stem":344,"children":345,"page":44},"mail","i-lucide-mail","\u002Fhu\u002Fmail","hu\u002F13.mail",[346,349,353],{"title":52,"path":347,"stem":348,"icon":342},"\u002Fhu\u002Fmail\u002Foverview","hu\u002F13.mail\u002F1.overview",{"title":350,"path":351,"stem":352,"icon":342},"SMTP","\u002Fhu\u002Fmail\u002Fsmtp","hu\u002F13.mail\u002F2.smtp",{"title":354,"path":355,"stem":356,"icon":342},"MJML","\u002Fhu\u002Fmail\u002Fmjml","hu\u002F13.mail\u002F3.mjml",{"title":358,"icon":359,"path":360,"stem":361,"children":362,"page":44},"notify","i-lucide-bell","\u002Fhu\u002Fnotify","hu\u002F14.notify",[363,366,370],{"title":52,"path":364,"stem":365,"icon":359},"\u002Fhu\u002Fnotify\u002Foverview","hu\u002F14.notify\u002F1.overview",{"title":367,"path":368,"stem":369,"icon":359},"Database csatorna","\u002Fhu\u002Fnotify\u002Fdatabase","hu\u002F14.notify\u002F2.database",{"title":371,"path":372,"stem":373,"icon":359},"Broadcast csatorna","\u002Fhu\u002Fnotify\u002Fbroadcast","hu\u002F14.notify\u002F3.broadcast",{"title":375,"icon":376,"path":377,"stem":378,"children":379,"page":44},"paginate","i-lucide-list-ordered","\u002Fhu\u002Fpaginate","hu\u002F15.paginate",[380,383],{"title":52,"path":381,"stem":382,"icon":376},"\u002Fhu\u002Fpaginate\u002Foverview","hu\u002F15.paginate\u002F1.overview",{"title":384,"path":385,"stem":386,"icon":39},"Cursor-lapozás","\u002Fhu\u002Fpaginate\u002Fcursor","hu\u002F15.paginate\u002F2.cursor",{"title":388,"icon":184,"path":389,"stem":390,"children":391,"page":44},"queue","\u002Fhu\u002Fqueue","hu\u002F16.queue",[392,395],{"title":52,"path":393,"stem":394,"icon":376},"\u002Fhu\u002Fqueue\u002Foverview","hu\u002F16.queue\u002F1.overview",{"title":396,"path":397,"stem":398,"icon":184},"Taskok","\u002Fhu\u002Fqueue\u002Ftasks","hu\u002F16.queue\u002F2.tasks",{"title":400,"icon":401,"path":402,"stem":403,"children":404,"page":44},"storage","i-lucide-hard-drive","\u002Fhu\u002Fstorage","hu\u002F17.storage",[405,408,412,416,421],{"title":52,"path":406,"stem":407,"icon":401},"\u002Fhu\u002Fstorage\u002Foverview","hu\u002F17.storage\u002F1.overview",{"title":409,"path":410,"stem":411,"icon":401},"Disk API","\u002Fhu\u002Fstorage\u002Fdisk-api","hu\u002F17.storage\u002F2.disk-api",{"title":413,"path":414,"stem":415,"icon":401},"Memória és helyi lemez","\u002Fhu\u002Fstorage\u002Flocal","hu\u002F17.storage\u002F3.local",{"title":417,"path":418,"stem":419,"icon":420},"S3","\u002Fhu\u002Fstorage\u002Fs3","hu\u002F17.storage\u002F4.s3","i-lucide-cloud",{"title":422,"path":423,"stem":424,"icon":425},"Tesztelés","\u002Fhu\u002Fstorage\u002Ftesting","hu\u002F17.storage\u002F5.testing","i-lucide-flask-conical",{"title":427,"icon":428,"path":429,"stem":430,"children":431,"page":44},"telemetry","i-lucide-activity","\u002Fhu\u002Ftelemetry","hu\u002F18.telemetry",[432,435,439,444],{"title":52,"path":433,"stem":434,"icon":428},"\u002Fhu\u002Ftelemetry\u002Foverview","hu\u002F18.telemetry\u002F1.overview",{"title":436,"path":437,"stem":438,"icon":329},"Logolás","\u002Fhu\u002Ftelemetry\u002Flogging","hu\u002F18.telemetry\u002F2.logging",{"title":440,"path":441,"stem":442,"icon":443},"OpenTelemetry","\u002Fhu\u002Ftelemetry\u002Fopentelemetry","hu\u002F18.telemetry\u002F3.opentelemetry","i-lucide-radar",{"title":445,"path":446,"stem":447,"icon":448},"Sentry","\u002Fhu\u002Ftelemetry\u002Fsentry","hu\u002F18.telemetry\u002F4.sentry","i-lucide-bug",{"id":450,"title":140,"body":451,"description":2387,"extension":2388,"links":2389,"meta":2390,"navigation":2391,"path":141,"seo":2392,"stem":142,"__hash__":2393},"docs_hu\u002Fhu\u002F03.framework\u002F4.worker.md",{"type":452,"value":453,"toc":2373},"minimark",[454,467,496,515,550,573,580,597,1305,1339,1342,1434,1461,1466,1472,1541,1580,1584,1597,1631,1637,1640,1737,1744,1892,1896,1921,1937,1955,1958,1968,2039,2136,2145,2194,2199,2203,2210,2252,2263,2267,2270,2301,2308,2312,2345,2369],[455,456,457,458,462,463,466],"p",{},"A worker-chassis a háttérfeldolgozásodat (eventek, listenerek, ütemezett jobok) saját binárisként futtatja, ",[459,460,461],"code",{},"cmd\u002Fworker"," néven, a HTTP API mellett. Ugyanúgy importálod, mint a ",[459,464,465],{},"server","-t:",[468,469,474],"pre",{"className":470,"code":471,"language":472,"meta":473,"style":473},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import \"github.com\u002Fgp-system\u002Fframework\u002Fworker\"\n","go","",[459,475,476],{"__ignoreMap":473},[477,478,481,485,489,493],"span",{"class":479,"line":480},"line",1,[477,482,484],{"class":483},"s7zQu","import",[477,486,488],{"class":487},"sMK4o"," \"",[477,490,492],{"class":491},"sBMFI","github.com\u002Fgp-system\u002Fframework\u002Fworker",[477,494,495],{"class":487},"\"\n",[455,497,498,499,502,503,506,507,514],{},"A ",[459,500,501],{},"worker.Run"," a HTTP-engine-ek ",[459,504,505],{},"Run","-jának háttérmunka-párja: ugyanaz az ",[508,509,510,513],"a",{"href":131},[459,511,512],{},"app"," életciklus"," (jelkezelés, graceful shutdown, closerek, telemetria-flush), csak HTTP-szerver helyett három dolgot futtat egy binárisban:",[516,517,518,532,541],"ul",{},[519,520,521,522,526,527,531],"li",{},"az ",[523,524,525],"strong",{},"asynq szervert",": az ",[508,528,530],{"href":529},"\u002Fhu\u002Fqueue\u002Ftasks#task-t%C3%ADpusok","event-, listener-, ütemezett- és job-taskok"," feldolgozása;",[519,533,521,534,540],{},[523,535,536],{},[508,537,539],{"href":538},"\u002Fhu\u002Fevents\u002Foutbox#a-relay","outbox relay-t",": a commitált eventek továbbítása a queue-ba;",[519,542,543,544,549],{},"a ",[523,545,546],{},[508,547,548],{"href":305},"schedule runnert",": a cron-bejegyzések tüzelése, leader-electionnel.",[455,551,552,553,556,557,559,560,562,563,566,567,572],{},"Ez a task-feldolgozást és az ütemezést ",[523,554,555],{},"egyetlen folyamatban"," futtatja: külön worker- és scheduler-deployment helyett egy ",[459,558,461],{}," binárist skálázol. A bináris alapból a ",[459,561,81],{},"-tel készül; ha egy projekt ",[459,564,565],{},"new project --no-worker","-rel jött létre, az ",[508,568,569],{"href":112},[459,570,571],{},"add worker"," adja hozzá. Akárhogy is, az API-tól függetlenül deployolod és skálázod.",[574,575,577,578],"h2",{"id":576},"a-generált-cmdworker","A generált ",[459,579,461],{},[455,581,582,583,585,586,585,589,592,593,596],{},"A shop worker-binárisa: minden sorát a generátor írta, a modulokat a ",[459,584,86],{}," \u002F ",[459,587,588],{},"add listener",[459,590,591],{},"add job"," drótozza be a ",[459,594,595],{},"\u002F\u002F gpsystem:*"," anchoroknál.",[468,598,601],{"className":470,"code":599,"filename":600,"language":472,"meta":473,"style":473},"package main\n\nimport (\n    \"context\"\n    \"log\"\n\n    \"github.com\u002Fgp-system\u002Fdbx\u002Fpg\"\n    \"github.com\u002Fgp-system\u002Fenvconf\"\n    \"github.com\u002Fgp-system\u002Fevents\"\n    \"github.com\u002Fgp-system\u002Fevents\u002Foutbox\"\n    \"github.com\u002Fgp-system\u002Fevents\u002Fscheduler\"\n    \"github.com\u002Fgp-system\u002Fframework\u002Fworker\"\n\n    \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\"\n    shopjobs \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fjobs\"\n    shoplisteners \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Flisteners\"\n    \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fplatform\u002Fconfig\"\n)\n\nfunc main() {\n    cfg := envconf.MustLoad[config.Config]()\n    ctx := context.Background()\n    pool := pg.MustNewPool(ctx, cfg.DB)\n    relay := outbox.MustNewRelay(ctx, cfg.Outbox, pool, cfg.Worker.Valkey)\n\n    err := worker.Run(ctx, cfg.Worker, func(reg *events.Registry, sched *scheduler.Schedule) error {\n        shopDeps := shop.Dependencies{\n            DB:         pg.NewDB(pool),\n            Transactor: pg.NewTransactor(pool),\n            Dispatcher: outbox.NewDispatcher(outbox.NewStore(pg.NewDB(pool))),\n        }\n        shoplisteners.Register(reg, shopDeps)\n        shopjobs.Register(sched, shopDeps)\n        return nil\n    },\n        worker.WithOutboxRelay(relay),\n        worker.WithCloser(\"pgxpool\", func(context.Context) error {\n            pool.Close()\n            return nil\n        }),\n    )\n    if err != nil {\n        log.Fatal(err)\n    }\n}\n","cmd\u002Fworker\u002Fmain.go",[459,602,603,611,618,626,637,647,652,662,672,682,692,702,711,716,726,741,754,764,770,775,791,823,842,877,925,930,1000,1019,1044,1065,1106,1112,1134,1155,1164,1170,1188,1225,1238,1246,1252,1258,1275,1293,1299],{"__ignoreMap":473},[477,604,605,608],{"class":479,"line":480},[477,606,607],{"class":487},"package",[477,609,610],{"class":491}," main\n",[477,612,614],{"class":479,"line":613},2,[477,615,617],{"emptyLinePlaceholder":616},true,"\n",[477,619,621,623],{"class":479,"line":620},3,[477,622,484],{"class":483},[477,624,625],{"class":487}," (\n",[477,627,629,632,635],{"class":479,"line":628},4,[477,630,631],{"class":487},"    \"",[477,633,634],{"class":491},"context",[477,636,495],{"class":487},[477,638,640,642,645],{"class":479,"line":639},5,[477,641,631],{"class":487},[477,643,644],{"class":491},"log",[477,646,495],{"class":487},[477,648,650],{"class":479,"line":649},6,[477,651,617],{"emptyLinePlaceholder":616},[477,653,655,657,660],{"class":479,"line":654},7,[477,656,631],{"class":487},[477,658,659],{"class":491},"github.com\u002Fgp-system\u002Fdbx\u002Fpg",[477,661,495],{"class":487},[477,663,665,667,670],{"class":479,"line":664},8,[477,666,631],{"class":487},[477,668,669],{"class":491},"github.com\u002Fgp-system\u002Fenvconf",[477,671,495],{"class":487},[477,673,675,677,680],{"class":479,"line":674},9,[477,676,631],{"class":487},[477,678,679],{"class":491},"github.com\u002Fgp-system\u002Fevents",[477,681,495],{"class":487},[477,683,685,687,690],{"class":479,"line":684},10,[477,686,631],{"class":487},[477,688,689],{"class":491},"github.com\u002Fgp-system\u002Fevents\u002Foutbox",[477,691,495],{"class":487},[477,693,695,697,700],{"class":479,"line":694},11,[477,696,631],{"class":487},[477,698,699],{"class":491},"github.com\u002Fgp-system\u002Fevents\u002Fscheduler",[477,701,495],{"class":487},[477,703,705,707,709],{"class":479,"line":704},12,[477,706,631],{"class":487},[477,708,492],{"class":491},[477,710,495],{"class":487},[477,712,714],{"class":479,"line":713},13,[477,715,617],{"emptyLinePlaceholder":616},[477,717,719,721,724],{"class":479,"line":718},14,[477,720,631],{"class":487},[477,722,723],{"class":491},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop",[477,725,495],{"class":487},[477,727,729,733,736,739],{"class":479,"line":728},15,[477,730,732],{"class":731},"sTEyZ","    shopjobs ",[477,734,735],{"class":487},"\"",[477,737,738],{"class":491},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fjobs",[477,740,495],{"class":487},[477,742,744,747,749,752],{"class":479,"line":743},16,[477,745,746],{"class":731},"    shoplisteners ",[477,748,735],{"class":487},[477,750,751],{"class":491},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Flisteners",[477,753,495],{"class":487},[477,755,757,759,762],{"class":479,"line":756},17,[477,758,631],{"class":487},[477,760,761],{"class":491},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fplatform\u002Fconfig",[477,763,495],{"class":487},[477,765,767],{"class":479,"line":766},18,[477,768,769],{"class":487},")\n",[477,771,773],{"class":479,"line":772},19,[477,774,617],{"emptyLinePlaceholder":616},[477,776,778,781,785,788],{"class":479,"line":777},20,[477,779,780],{"class":487},"func",[477,782,784],{"class":783},"s2Zo4"," main",[477,786,787],{"class":487},"()",[477,789,790],{"class":487}," {\n",[477,792,794,797,800,803,806,809,812,815,817,820],{"class":479,"line":793},21,[477,795,796],{"class":731},"    cfg ",[477,798,799],{"class":487},":=",[477,801,802],{"class":731}," envconf",[477,804,805],{"class":487},".",[477,807,808],{"class":783},"MustLoad",[477,810,811],{"class":487},"[",[477,813,814],{"class":491},"config",[477,816,805],{"class":487},[477,818,819],{"class":491},"Config",[477,821,822],{"class":487},"]()\n",[477,824,826,829,831,834,836,839],{"class":479,"line":825},22,[477,827,828],{"class":731},"    ctx ",[477,830,799],{"class":487},[477,832,833],{"class":731}," context",[477,835,805],{"class":487},[477,837,838],{"class":783},"Background",[477,840,841],{"class":487},"()\n",[477,843,845,848,850,853,855,858,861,864,867,870,872,875],{"class":479,"line":844},23,[477,846,847],{"class":731},"    pool ",[477,849,799],{"class":487},[477,851,852],{"class":731}," pg",[477,854,805],{"class":487},[477,856,857],{"class":783},"MustNewPool",[477,859,860],{"class":487},"(",[477,862,863],{"class":731},"ctx",[477,865,866],{"class":487},",",[477,868,869],{"class":731}," cfg",[477,871,805],{"class":487},[477,873,874],{"class":731},"DB",[477,876,769],{"class":487},[477,878,880,883,885,888,890,893,895,897,899,901,903,905,907,910,912,914,916,918,920,923],{"class":479,"line":879},24,[477,881,882],{"class":731},"    relay ",[477,884,799],{"class":487},[477,886,887],{"class":731}," outbox",[477,889,805],{"class":487},[477,891,892],{"class":783},"MustNewRelay",[477,894,860],{"class":487},[477,896,863],{"class":731},[477,898,866],{"class":487},[477,900,869],{"class":731},[477,902,805],{"class":487},[477,904,299],{"class":731},[477,906,866],{"class":487},[477,908,909],{"class":731}," pool",[477,911,866],{"class":487},[477,913,869],{"class":731},[477,915,805],{"class":487},[477,917,140],{"class":731},[477,919,805],{"class":487},[477,921,922],{"class":731},"Valkey",[477,924,769],{"class":487},[477,926,928],{"class":479,"line":927},25,[477,929,617],{"emptyLinePlaceholder":616},[477,931,933,936,938,941,943,945,947,949,951,953,955,957,959,962,966,969,971,973,976,978,981,983,986,988,991,994,998],{"class":479,"line":932},26,[477,934,935],{"class":731},"    err ",[477,937,799],{"class":487},[477,939,940],{"class":731}," worker",[477,942,805],{"class":487},[477,944,505],{"class":783},[477,946,860],{"class":487},[477,948,863],{"class":731},[477,950,866],{"class":487},[477,952,869],{"class":731},[477,954,805],{"class":487},[477,956,140],{"class":731},[477,958,866],{"class":487},[477,960,961],{"class":487}," func(",[477,963,965],{"class":964},"sHdIc","reg",[477,967,968],{"class":487}," *",[477,970,289],{"class":491},[477,972,805],{"class":487},[477,974,975],{"class":491},"Registry",[477,977,866],{"class":487},[477,979,980],{"class":964}," sched",[477,982,968],{"class":487},[477,984,985],{"class":491},"scheduler",[477,987,805],{"class":487},[477,989,990],{"class":491},"Schedule",[477,992,993],{"class":487},")",[477,995,997],{"class":996},"spNyl"," error",[477,999,790],{"class":487},[477,1001,1003,1006,1008,1011,1013,1016],{"class":479,"line":1002},27,[477,1004,1005],{"class":731},"        shopDeps ",[477,1007,799],{"class":487},[477,1009,1010],{"class":491}," shop",[477,1012,805],{"class":487},[477,1014,1015],{"class":491},"Dependencies",[477,1017,1018],{"class":487},"{\n",[477,1020,1022,1025,1028,1031,1033,1036,1038,1041],{"class":479,"line":1021},28,[477,1023,1024],{"class":731},"            DB",[477,1026,1027],{"class":487},":",[477,1029,1030],{"class":731},"         pg",[477,1032,805],{"class":487},[477,1034,1035],{"class":783},"NewDB",[477,1037,860],{"class":487},[477,1039,1040],{"class":731},"pool",[477,1042,1043],{"class":487},"),\n",[477,1045,1047,1050,1052,1054,1056,1059,1061,1063],{"class":479,"line":1046},29,[477,1048,1049],{"class":731},"            Transactor",[477,1051,1027],{"class":487},[477,1053,852],{"class":731},[477,1055,805],{"class":487},[477,1057,1058],{"class":783},"NewTransactor",[477,1060,860],{"class":487},[477,1062,1040],{"class":731},[477,1064,1043],{"class":487},[477,1066,1068,1071,1073,1075,1077,1080,1082,1085,1087,1090,1092,1095,1097,1099,1101,1103],{"class":479,"line":1067},30,[477,1069,1070],{"class":731},"            Dispatcher",[477,1072,1027],{"class":487},[477,1074,887],{"class":731},[477,1076,805],{"class":487},[477,1078,1079],{"class":783},"NewDispatcher",[477,1081,860],{"class":487},[477,1083,1084],{"class":731},"outbox",[477,1086,805],{"class":487},[477,1088,1089],{"class":783},"NewStore",[477,1091,860],{"class":487},[477,1093,1094],{"class":731},"pg",[477,1096,805],{"class":487},[477,1098,1035],{"class":783},[477,1100,860],{"class":487},[477,1102,1040],{"class":731},[477,1104,1105],{"class":487},"))),\n",[477,1107,1109],{"class":479,"line":1108},31,[477,1110,1111],{"class":487},"        }\n",[477,1113,1115,1118,1120,1123,1125,1127,1129,1132],{"class":479,"line":1114},32,[477,1116,1117],{"class":731},"        shoplisteners",[477,1119,805],{"class":487},[477,1121,1122],{"class":783},"Register",[477,1124,860],{"class":487},[477,1126,965],{"class":731},[477,1128,866],{"class":487},[477,1130,1131],{"class":731}," shopDeps",[477,1133,769],{"class":487},[477,1135,1137,1140,1142,1144,1146,1149,1151,1153],{"class":479,"line":1136},33,[477,1138,1139],{"class":731},"        shopjobs",[477,1141,805],{"class":487},[477,1143,1122],{"class":783},[477,1145,860],{"class":487},[477,1147,1148],{"class":731},"sched",[477,1150,866],{"class":487},[477,1152,1131],{"class":731},[477,1154,769],{"class":487},[477,1156,1158,1161],{"class":479,"line":1157},34,[477,1159,1160],{"class":483},"        return",[477,1162,1163],{"class":487}," nil\n",[477,1165,1167],{"class":479,"line":1166},35,[477,1168,1169],{"class":487},"    },\n",[477,1171,1173,1176,1178,1181,1183,1186],{"class":479,"line":1172},36,[477,1174,1175],{"class":731},"        worker",[477,1177,805],{"class":487},[477,1179,1180],{"class":783},"WithOutboxRelay",[477,1182,860],{"class":487},[477,1184,1185],{"class":731},"relay",[477,1187,1043],{"class":487},[477,1189,1191,1193,1195,1198,1200,1202,1206,1208,1210,1212,1214,1216,1219,1221,1223],{"class":479,"line":1190},37,[477,1192,1175],{"class":731},[477,1194,805],{"class":487},[477,1196,1197],{"class":783},"WithCloser",[477,1199,860],{"class":487},[477,1201,735],{"class":487},[477,1203,1205],{"class":1204},"sfazB","pgxpool",[477,1207,735],{"class":487},[477,1209,866],{"class":487},[477,1211,961],{"class":487},[477,1213,634],{"class":491},[477,1215,805],{"class":487},[477,1217,1218],{"class":491},"Context",[477,1220,993],{"class":487},[477,1222,997],{"class":996},[477,1224,790],{"class":487},[477,1226,1228,1231,1233,1236],{"class":479,"line":1227},38,[477,1229,1230],{"class":731},"            pool",[477,1232,805],{"class":487},[477,1234,1235],{"class":783},"Close",[477,1237,841],{"class":487},[477,1239,1241,1244],{"class":479,"line":1240},39,[477,1242,1243],{"class":483},"            return",[477,1245,1163],{"class":487},[477,1247,1249],{"class":479,"line":1248},40,[477,1250,1251],{"class":487},"        }),\n",[477,1253,1255],{"class":479,"line":1254},41,[477,1256,1257],{"class":487},"    )\n",[477,1259,1261,1264,1267,1270,1273],{"class":479,"line":1260},42,[477,1262,1263],{"class":483},"    if",[477,1265,1266],{"class":731}," err ",[477,1268,1269],{"class":487},"!=",[477,1271,1272],{"class":487}," nil",[477,1274,790],{"class":487},[477,1276,1278,1281,1283,1286,1288,1291],{"class":479,"line":1277},43,[477,1279,1280],{"class":731},"        log",[477,1282,805],{"class":487},[477,1284,1285],{"class":783},"Fatal",[477,1287,860],{"class":487},[477,1289,1290],{"class":731},"err",[477,1292,769],{"class":487},[477,1294,1296],{"class":479,"line":1295},44,[477,1297,1298],{"class":487},"    }\n",[477,1300,1302],{"class":479,"line":1301},45,[477,1303,1304],{"class":487},"}\n",[455,1306,1307,1308,1311,1312,1314,1315,1317,1318,1320,1321,585,1324,1327,1328,1330,1331,1334,1335,1338],{},"A minta ugyanaz, mint a HTTP-oldalon: a függőségek ",[523,1309,1310],{},"explicit"," ",[459,1313,1015],{}," structban utaznak, a register callback pedig megkapja az event-",[459,1316,975],{},"-t és a ",[459,1319,990],{},"-t, amiket a modulok generált ",[459,1322,1323],{},"listeners",[459,1325,1326],{},"jobs"," alcsomagjainak ",[459,1329,1122],{}," függvényei töltenek fel. A worker ",[459,1332,1333],{},"Dispatcher","-e is az ",[508,1336,1337],{"href":300},"outboxos",": egy listener által dispatchelt esemény ugyanazt a garanciát kapja, mint egy HTTP-kérésből dobott.",[574,1340,505],{"id":1341},"run",[468,1343,1345],{"className":470,"code":1344,"language":472,"meta":473,"style":473},"func Run(ctx context.Context, cfg Config, register RegisterFunc, opts ...Option) error\n\ntype RegisterFunc func(reg *events.Registry, sched *scheduler.Schedule) error\n",[459,1346,1347,1395,1399],{"__ignoreMap":473},[477,1348,1349,1351,1354,1356,1358,1360,1362,1364,1366,1368,1371,1373,1376,1379,1381,1384,1387,1390,1392],{"class":479,"line":480},[477,1350,780],{"class":487},[477,1352,1353],{"class":783}," Run",[477,1355,860],{"class":487},[477,1357,863],{"class":964},[477,1359,833],{"class":491},[477,1361,805],{"class":487},[477,1363,1218],{"class":491},[477,1365,866],{"class":487},[477,1367,869],{"class":964},[477,1369,1370],{"class":491}," Config",[477,1372,866],{"class":487},[477,1374,1375],{"class":964}," register",[477,1377,1378],{"class":491}," RegisterFunc",[477,1380,866],{"class":487},[477,1382,1383],{"class":964}," opts",[477,1385,1386],{"class":487}," ...",[477,1388,1389],{"class":491},"Option",[477,1391,993],{"class":487},[477,1393,1394],{"class":996}," error\n",[477,1396,1397],{"class":479,"line":613},[477,1398,617],{"emptyLinePlaceholder":616},[477,1400,1401,1404,1406,1408,1410,1412,1414,1416,1418,1420,1422,1424,1426,1428,1430,1432],{"class":479,"line":620},[477,1402,1403],{"class":487},"type",[477,1405,1378],{"class":491},[477,1407,961],{"class":487},[477,1409,965],{"class":964},[477,1411,968],{"class":487},[477,1413,289],{"class":491},[477,1415,805],{"class":487},[477,1417,975],{"class":491},[477,1419,866],{"class":487},[477,1421,980],{"class":964},[477,1423,968],{"class":487},[477,1425,985],{"class":491},[477,1427,805],{"class":487},[477,1429,990],{"class":491},[477,1431,993],{"class":487},[477,1433,1394],{"class":996},[455,1435,498,1436,1438,1439,1442,1443,1446,1447,1453,1454,1456,1457,1460],{},[459,1437,505],{}," sorban: telemetria-bootstrap (",[459,1440,1441],{},"app.Telemetry",") → a ",[459,1444,1445],{},"register"," felépíti a registryt és a schedule-t → ",[508,1448,1450],{"href":1449},"\u002Fhu\u002Fqueue\u002Foverview#client",[459,1451,1452],{},"queue.Client"," nyitása (PING) → asynq szerver indítása, mellette a relay (ha ",[459,1455,1180],{},"-jel átadtad) és a schedule runner (ha a schedule nem üres; üres schedule mellett leader-election sincs) → blokkol SIGINT\u002FSIGTERM-ig. Tiszta leállásnál ",[459,1458,1459],{},"nil","-t ad vissza.",[1462,1463,1465],"h3",{"id":1464},"mi-dolgozza-fel-a-taskokat","Mi dolgozza fel a taskokat",[455,1467,1468,1469,1027],{},"A worker négy beépített handlert regisztrál a ",[508,1470,1471],{"href":529},"task-típus-prefixekre",[1473,1474,1475,1488],"table",{},[1476,1477,1478],"thead",{},[1479,1480,1481,1485],"tr",{},[1482,1483,1484],"th",{},"Task",[1482,1486,1487],{},"Mit csinál a handler",[1489,1490,1491,1506,1521,1531],"tbody",{},[1479,1492,1493,1499],{},[1494,1495,1496],"td",{},[459,1497,1498],{},"event:\u003Cnév>",[1494,1500,1501,1502,1505],{},"fan-out: listenerenként egy ",[459,1503,1504],{},"listener:"," taskot enqueue-l, determinisztikus TaskID-vel",[1479,1507,1508,1513],{},[1494,1509,1510],{},[459,1511,1512],{},"listener:\u003Cevent>:\u003Cnév>",[1494,1514,1515,1516,1520],{},"dekódolja a borítékot, contextre teszi a ",[508,1517,1519],{"href":1518},"\u002Fhu\u002Fevents\u002Foverview#a-bor%C3%ADt%C3%A9k-%C3%A9s-a-k%C3%A9zbes%C3%ADt%C3%A9si-metaadat","Meta-t",", meghívja a listeneredet",[1479,1522,1523,1528],{},[1494,1524,1525],{},[459,1526,1527],{},"schedule:\u003Cevent>",[1494,1529,1530],{},"ütemezett tüzelés: friss borítékot épít (id = a trigger task-id-ja), és fan-outol",[1479,1532,1533,1538],{},[1494,1534,1535],{},[459,1536,1537],{},"job:\u003Cnév>",[1494,1539,1540],{},"meghívja az ütemezett job handlerét",[455,1542,1543,1544,1547,1548,1551,1552,1555,1556,1558,1559,1562,1563,1566,1567,1570,1571,1574,1575,1579],{},"Minden handler a framework exportált middleware-trióján át fut: ",[459,1545,1546],{},"worker.HubMiddleware"," (taskonkénti Sentry-hub, breadcrumb-izoláció), ",[459,1549,1550],{},"worker.RecoverMiddleware"," (",[523,1553,1554],{},"panic-recovery",": a panikoló handler ",[459,1557,273],{},"-hibává válik és retry-zik, a worker nem hal bele) és ",[459,1560,1561],{},"worker.TracingMiddleware",": a consumer span a boríték trace-kontextusát folytatja, így a ",[508,1564,1565],{"href":441},"teljes út egy trace",". Saját ",[459,1568,1569],{},"asynq.MiddlewareFunc"," a trió után fűzhető a ",[459,1572,1573],{},"WithTaskMiddleware","-rel (lásd ",[508,1576,1578],{"href":1577},"#opci%C3%B3k","Opciók","). Olyan taskot, aminek nincs regisztrált handlere (pl. egy deploy kivette a listenert), a worker warning mellett átugrik, nem retry-zik örökké.",[1462,1581,1583],{"id":1582},"shutdown-sorrend","Shutdown-sorrend",[455,1585,1586,1589,1590,1593,1594,1596],{},[459,1587,1588],{},"SIGINT","\u002F",[459,1591,1592],{},"SIGTERM","-re a ",[459,1595,505],{}," determinisztikus sorrendben áll le:",[1598,1599,1600,1606,1616,1625],"ol",{},[519,1601,1602,1605],{},[523,1603,1604],{},"leállnak a termelő ciklusok",": a schedule runner (elengedi a lease-t) és a relay poll-ciklusa;",[519,1607,1608,1611,1612,1615],{},[523,1609,1610],{},"kiürülnek a folyamatban lévő taskok",": legfeljebb ",[459,1613,1614],{},"WORKER_SHUTDOWN_TIMEOUT","-ig; ami nem fér bele, azt az asynq visszateszi a sorba, és később újra kézbesíti (ezért is: idempotens listenerek);",[519,1617,1618,1621,1622,1624],{},[523,1619,1620],{},"a closerek LIFO-ban futnak",": előbb a framework sajátjai (scheduler, relay, queue-kliens), aztán a te ",[459,1623,1197],{},"-eid (a shopban a pgx-pool);",[519,1626,1627,1630],{},[523,1628,1629],{},"telemetria-flush",": az utolsó spanok és logok még elmennek.",[455,1632,1633,1634,805],{},"Ez ugyanaz a garancia, mint a HTTP-oldalon: egy deploy nem vág el félbe levélküldést. A részletekhez lásd az ",[508,1635,1636],{"href":131},"alkalmazás-életciklust",[574,1638,1578],{"id":1639},"opciók",[1473,1641,1642,1652],{},[1476,1643,1644],{},[1479,1645,1646,1649],{},[1482,1647,1648],{},"Opció",[1482,1650,1651],{},"Hatás",[1489,1653,1654,1667,1677,1689,1699,1709],{},[1479,1655,1656,1661],{},[1494,1657,1658],{},[459,1659,1660],{},"WithOutboxRelay(*outbox.Relay)",[1494,1662,521,1663,1666],{},[508,1664,1665],{"href":538},"outbox relay"," futtatása ebben a workerben (N replikán biztonságos)",[1479,1668,1669,1674],{},[1494,1670,1671],{},[459,1672,1673],{},"WithCloser(name, fn)",[1494,1675,1676],{},"takarítás graceful shutdownkor, a taskok kiürítése után (LIFO)",[1479,1678,1679,1684],{},[1494,1680,1681],{},[459,1682,1683],{},"WithoutTelemetry()",[1494,1685,521,1686,1688],{},[459,1687,1441],{}," kihagyása; teszthez, vagy ha a folyamat maga konfigurálja",[1479,1690,1691,1696],{},[1494,1692,1693],{},[459,1694,1695],{},"WithAsynqConfig(func(*asynq.Config))",[1494,1697,1698],{},"a nyers asynq-konfig módosítása a szerver felépítése előtt; escape hatch a framework által nem exponált beállításokhoz",[1479,1700,1701,1706],{},[1494,1702,1703],{},[459,1704,1705],{},"WithMux(func(*asynq.ServeMux))",[1494,1707,1708],{},"extra nyers asynq handlerek regisztrálása, olyan task-típusokhoz, amiket a framework nem modellez",[1479,1710,1711,1716],{},[1494,1712,1713],{},[459,1714,1715],{},"WithTaskMiddleware(...asynq.MiddlewareFunc)",[1494,1717,1718,1719,1722,1723,1722,1726,1729,1730,1733,1734],{},"saját task-middleware-ek fűzése a framework triója (",[459,1720,1721],{},"HubMiddleware",", ",[459,1724,1725],{},"RecoverMiddleware",[459,1727,1728],{},"TracingMiddleware",") után, a task-handlerek elé; a ",[459,1731,1732],{},"server.WithMiddleware"," worker-oldali párja, pl. ",[459,1735,1736],{},"worker.WithTaskMiddleware(perTaskMetrics)",[455,1738,1739,1740,1743],{},"A két escape hatch a framework ",[508,1741,1742],{"href":393},"\"centralizál, nem absztrahál\""," elvének worker-oldali fele: ha az asynq egy képességére van szükséged, nem kell kilépned a chassis-ból.",[468,1745,1747],{"className":470,"code":1746,"language":472,"meta":473,"style":473},"worker.Run(ctx, cfg.Worker, register,\n    worker.WithAsynqConfig(func(c *asynq.Config) {\n        c.HealthCheckFunc = reportHealth\n    }),\n    worker.WithMux(func(mux *asynq.ServeMux) {\n        mux.HandleFunc(\"import:products\", handleProductImport) \u002F\u002F saját task-típus\n    }),\n)\n",[459,1748,1749,1777,1806,1822,1827,1854,1884,1888],{"__ignoreMap":473},[477,1750,1751,1754,1756,1758,1760,1762,1764,1766,1768,1770,1772,1774],{"class":479,"line":480},[477,1752,1753],{"class":731},"worker",[477,1755,805],{"class":487},[477,1757,505],{"class":783},[477,1759,860],{"class":487},[477,1761,863],{"class":731},[477,1763,866],{"class":487},[477,1765,869],{"class":731},[477,1767,805],{"class":487},[477,1769,140],{"class":731},[477,1771,866],{"class":487},[477,1773,1375],{"class":731},[477,1775,1776],{"class":487},",\n",[477,1778,1779,1782,1784,1787,1790,1793,1795,1798,1800,1802,1804],{"class":479,"line":613},[477,1780,1781],{"class":731},"    worker",[477,1783,805],{"class":487},[477,1785,1786],{"class":783},"WithAsynqConfig",[477,1788,1789],{"class":487},"(func(",[477,1791,1792],{"class":964},"c",[477,1794,968],{"class":487},[477,1796,1797],{"class":491},"asynq",[477,1799,805],{"class":487},[477,1801,819],{"class":491},[477,1803,993],{"class":487},[477,1805,790],{"class":487},[477,1807,1808,1811,1813,1816,1819],{"class":479,"line":620},[477,1809,1810],{"class":731},"        c",[477,1812,805],{"class":487},[477,1814,1815],{"class":731},"HealthCheckFunc ",[477,1817,1818],{"class":487},"=",[477,1820,1821],{"class":731}," reportHealth\n",[477,1823,1824],{"class":479,"line":628},[477,1825,1826],{"class":487},"    }),\n",[477,1828,1829,1831,1833,1836,1838,1841,1843,1845,1847,1850,1852],{"class":479,"line":639},[477,1830,1781],{"class":731},[477,1832,805],{"class":487},[477,1834,1835],{"class":783},"WithMux",[477,1837,1789],{"class":487},[477,1839,1840],{"class":964},"mux",[477,1842,968],{"class":487},[477,1844,1797],{"class":491},[477,1846,805],{"class":487},[477,1848,1849],{"class":491},"ServeMux",[477,1851,993],{"class":487},[477,1853,790],{"class":487},[477,1855,1856,1859,1861,1864,1866,1868,1871,1873,1875,1878,1880],{"class":479,"line":649},[477,1857,1858],{"class":731},"        mux",[477,1860,805],{"class":487},[477,1862,1863],{"class":783},"HandleFunc",[477,1865,860],{"class":487},[477,1867,735],{"class":487},[477,1869,1870],{"class":1204},"import:products",[477,1872,735],{"class":487},[477,1874,866],{"class":487},[477,1876,1877],{"class":731}," handleProductImport",[477,1879,993],{"class":487},[477,1881,1883],{"class":1882},"sHwdD"," \u002F\u002F saját task-típus\n",[477,1885,1886],{"class":479,"line":654},[477,1887,1826],{"class":487},[477,1889,1890],{"class":479,"line":664},[477,1891,769],{"class":487},[574,1893,1895],{"id":1894},"queue-prioritások","Queue-prioritások",[455,1897,1898,1899,1902,1903,1906,1907,1910,1911,1913,1914,1920],{},"A worker a queue-kat súlyozottan szolgálja ki: a ",[459,1900,1901],{},"WORKER_QUEUES"," egy ",[459,1904,1905],{},"név:súly"," lista, a Horizon ",[459,1908,1909],{},"balance","\u002Fqueue-súlyozásának megfelelője. A shop a leveleit külön ",[459,1912,341],{}," queue-ba teszi (a listener ",[508,1915,1917],{"href":1916},"\u002Fhu\u002Fevents\u002Foverview#listenerek",[459,1918,1919],{},"queue.OnQueue(\"mail\")"," regisztrációja), így egy levél-burst nem szoríthatja ki a többi munkát:",[468,1922,1926],{"className":1923,"code":1924,"language":1925,"meta":473,"style":473},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","WORKER_QUEUES=default:3,mail:1\n","sh",[459,1927,1928],{"__ignoreMap":473},[477,1929,1930,1932,1934],{"class":479,"line":480},[477,1931,1901],{"class":731},[477,1933,1818],{"class":487},[477,1935,1936],{"class":1204},"default:3,mail:1\n",[455,1938,1939,1940,1943,1944,1946,1947,1950,1951,1954],{},"Így a worker a kapacitása ~75%-át a ",[459,1941,1942],{},"default",", ~25%-át a ",[459,1945,341],{}," queue-ra fordítja, amikor mindkettőben van munka. A ",[459,1948,1949],{},"WORKER_STRICT_PRIORITY=true"," súlyozás helyett szigorú sorrendet ad: előbb a legnagyobb súlyú queue ürül ki teljesen, csak aztán jön a következő, ami hasznos, ha van egy ",[459,1952,1953],{},"critical"," sorod, ami mindent megelőz.",[574,1956,165],{"id":1957},"konfiguráció",[455,1959,498,1960,1963,1964,1967],{},[459,1961,1962],{},"worker.Config","-ot prefix nélkül ágyazod a projekt-konfigba (a generált ",[459,1965,1966],{},"config.go","-ban készen van):",[468,1969,1971],{"className":470,"code":1970,"language":472,"meta":473,"style":473},"type Config struct {\n    Worker worker.Config\n    DB     dbx.Config    `envPrefix:\"DB_\"`\n    Outbox outbox.Config `envPrefix:\"OUTBOX_\"`\n}\n",[459,1972,1973,1984,1996,2016,2035],{"__ignoreMap":473},[477,1974,1975,1977,1979,1982],{"class":479,"line":480},[477,1976,1403],{"class":487},[477,1978,1370],{"class":491},[477,1980,1981],{"class":487}," struct",[477,1983,790],{"class":487},[477,1985,1986,1989,1991,1993],{"class":479,"line":613},[477,1987,1988],{"class":731},"    Worker ",[477,1990,1753],{"class":491},[477,1992,805],{"class":487},[477,1994,1995],{"class":491},"Config\n",[477,1997,1998,2001,2003,2005,2007,2010,2013],{"class":479,"line":620},[477,1999,2000],{"class":731},"    DB     ",[477,2002,235],{"class":491},[477,2004,805],{"class":487},[477,2006,819],{"class":491},[477,2008,2009],{"class":487},"    `",[477,2011,2012],{"class":1204},"envPrefix:\"DB_\"",[477,2014,2015],{"class":487},"`\n",[477,2017,2018,2021,2023,2025,2027,2030,2033],{"class":479,"line":628},[477,2019,2020],{"class":731},"    Outbox ",[477,2022,1084],{"class":491},[477,2024,805],{"class":487},[477,2026,819],{"class":491},[477,2028,2029],{"class":487}," `",[477,2031,2032],{"class":1204},"envPrefix:\"OUTBOX_\"",[477,2034,2015],{"class":487},[477,2036,2037],{"class":479,"line":639},[477,2038,1304],{"class":487},[1473,2040,2041,2054],{},[1476,2042,2043],{},[1479,2044,2045,2048,2051],{},[1482,2046,2047],{},"Változó",[1482,2049,2050],{},"Default",[1482,2052,2053],{},"Jelentés",[1489,2055,2056,2071,2088,2103,2117],{},[1479,2057,2058,2063,2068],{},[1494,2059,2060],{},[459,2061,2062],{},"WORKER_CONCURRENCY",[1494,2064,2065],{},[459,2066,2067],{},"10",[1494,2069,2070],{},"egyszerre ennyi task dolgozódik fel",[1479,2072,2073,2077,2082],{},[1494,2074,2075],{},[459,2076,1901],{},[1494,2078,2079],{},[459,2080,2081],{},"default:1",[1494,2083,2084,2085,993],{},"queue → súly párok (",[459,2086,2087],{},"critical:6,default:3,low:1",[1479,2089,2090,2095,2100],{},[1494,2091,2092],{},[459,2093,2094],{},"WORKER_STRICT_PRIORITY",[1494,2096,2097],{},[459,2098,2099],{},"false",[1494,2101,2102],{},"súlyozás helyett szigorú prioritás-sorrend",[1479,2104,2105,2109,2114],{},[1494,2106,2107],{},[459,2108,1614],{},[1494,2110,2111],{},[459,2112,2113],{},"30s",[1494,2115,2116],{},"a graceful drain korlátja; a be nem fejezett taskok visszakerülnek a sorba",[1479,2118,2119,2124,2129],{},[1494,2120,2121],{},[459,2122,2123],{},"WORKER_DEFAULT_MAX_RETRY",[1494,2125,2126],{},[459,2127,2128],{},"25",[1494,2130,2131,2132,2135],{},"a saját ",[459,2133,2134],{},"queue.MaxRetry"," nélküli listener-\u002Fjob-taskok retry-kerete",[455,2137,498,2138,2140,2141,2144],{},[459,2139,1962],{}," három további configot ágyaz be, így a worker-bináris ",[523,2142,2143],{},"egyetlen env-készletből"," konfigurálódik:",[516,2146,2147,2163,2175],{},[519,2148,2149,1311,2155,2158,2159,2162],{},[508,2150,2152],{"href":2151},"\u002Fhu\u002Fqueue\u002Foverview#konfigur%C3%A1ci%C3%B3",[459,2153,2154],{},"queue.Config",[459,2156,2157],{},"VALKEY_"," prefixszel (",[459,2160,2161],{},"VALKEY_ADDR",", ...),",[519,2164,2165,1311,2171,2174],{},[508,2166,2168],{"href":2167},"\u002Fhu\u002Fevents\u002Fscheduler#konfigur%C3%A1ci%C3%B3",[459,2169,2170],{},"scheduler.Config",[459,2172,2173],{},"SCHEDULER_"," prefixszel,",[519,2176,2177,2180,2181,1722,2184,1722,2187,2190,2191,805],{},[459,2178,2179],{},"telemetry.Config"," prefix nélkül (a standard ",[459,2182,2183],{},"OTEL_*",[459,2185,2186],{},"LOG_*",[459,2188,2189],{},"SENTRY_*"," nevek), lásd az ",[508,2192,2193],{"href":433},"observability áttekintőt",[455,2195,2196,2197,805],{},"A teljes env-referencia: ",[508,2198,1957],{"href":166},[574,2200,2202],{"id":2201},"logging","Logging",[455,2204,2205,2206,2209],{},"A worker taskonként logol az alapértelmezett ",[459,2207,2208],{},"slog"," loggeren át, a consumer spanhez trace-korreláltan:",[516,2211,2212,2228,2238],{},[519,2213,2214,2217,2218,1722,2221,1722,2224,2227],{},[459,2215,2216],{},"worker: task started"," (Info): ",[459,2219,2220],{},"task_type",[459,2222,2223],{},"task_id",[459,2225,2226],{},"attempt"," attribútumokkal;",[519,2229,2230,2233,2234,2237],{},[459,2231,2232],{},"worker: task done"," (Info): plusz ",[459,2235,2236],{},"duration",";",[519,2239,2240,2243,2244,2247,2248,2251],{},[459,2241,2242],{},"worker: task failed"," (Error): plusz ",[459,2245,2246],{},"error","; a szándékos skip (",[459,2249,2250],{},"SkipRetry",", pl. nincs regisztrált handler) csak egyszer, warningként jelenik meg.",[455,2253,2254,2255,2258,2259,2262],{},"Az asynq saját belső logjai is ugyanebbe a pipeline-ba folynak. Hogy a sorok hova kerülnek (dev-konzol, JSON-stdout, OTLP), azt a ",[508,2256,2257],{"href":437},"logging-konfig"," dönti el; ",[459,2260,2261],{},"LOG_LEVEL=WARN"," elnémítja a taskonkénti Info-sorokat.",[574,2264,2266],{"id":2265},"skálázás","Skálázás",[455,2268,2269],{},"A worker állapotmentes: annyi replikát futtatsz, amennyi munkád van, és mindhárom komponens replikabiztos.",[516,2271,2272,2278,2291],{},[519,2273,521,2274,2277],{},[523,2275,2276],{},"asynq szerver"," természeténél fogva: egy taskot egyszerre egy worker kap;",[519,2279,521,2280,2282,2283,2290],{},[523,2281,1665],{}," a ",[508,2284,2286,2289],{"href":2285},"\u002Fhu\u002Fevents\u002Foutbox#sk%C3%A1l%C3%A1zhat%C3%B3s%C3%A1g-n-replika-dupla-k%C3%A9zbes%C3%ADt%C3%A9s-n%C3%A9lk%C3%BCl",[459,2287,2288],{},"FOR UPDATE SKIP LOCKED"," + determinisztikus TaskID"," párossal;",[519,2292,543,2293,2282,2296,2300],{},[523,2294,2295],{},"schedule runner",[508,2297,2299],{"href":2298},"\u002Fhu\u002Fevents\u002Fscheduler#replika-biztons%C3%A1g-a-leader-election","Valkey-lease leader-electionnel",": N replikából egy tüzel.",[455,2302,2303,2304,805],{},"Semmit nem kell kikapcsolni vagy külön deployolni a skálázáshoz. Az ára egyetlen szerződés: a kézbesítés legalább-egyszeres, tehát a ",[508,2305,2307],{"href":2306},"\u002Fhu\u002Fevents\u002Foverview#idempotencia","listenerek idempotensek",[574,2309,2311],{"id":2310},"helyi-futtatás","Helyi futtatás",[468,2313,2315],{"className":1923,"code":2314,"language":1925,"meta":473,"style":473},"go run .\u002Fcmd\u002Fmigrate up   # az outbox_events migráció is lefut\nmise run worker           # go run .\u002Fcmd\u002Fworker\n",[459,2316,2317,2333],{"__ignoreMap":473},[477,2318,2319,2321,2324,2327,2330],{"class":479,"line":480},[477,2320,472],{"class":491},[477,2322,2323],{"class":1204}," run",[477,2325,2326],{"class":1204}," .\u002Fcmd\u002Fmigrate",[477,2328,2329],{"class":1204}," up",[477,2331,2332],{"class":1882},"   # az outbox_events migráció is lefut\n",[477,2334,2335,2338,2340,2342],{"class":479,"line":613},[477,2336,2337],{"class":491},"mise",[477,2339,2323],{"class":1204},[477,2341,940],{"class":1204},[477,2343,2344],{"class":1882},"           # go run .\u002Fcmd\u002Fworker\n",[455,2346,2347,2348,2351,2352,2355,2356,1722,2359,1722,2361,1722,2363,2365,2366,805],{},"A Valkey a projekt ",[459,2349,2350],{},"compose.yml","-jéből jön (",[459,2353,2354],{},"mise run dev","). A generátorparancsokhoz (",[459,2357,2358],{},"add event",[459,2360,588],{},[459,2362,591],{},[459,2364,571],{},") lásd a ",[508,2367,2368],{"href":112},"CLI worker-generátorokat",[2370,2371,2372],"style",{},"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 .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 .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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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}",{"title":473,"searchDepth":613,"depth":613,"links":2374},[2375,2377,2381,2382,2383,2384,2385,2386],{"id":576,"depth":613,"text":2376},"A generált cmd\u002Fworker",{"id":1341,"depth":613,"text":505,"children":2378},[2379,2380],{"id":1464,"depth":620,"text":1465},{"id":1582,"depth":620,"text":1583},{"id":1639,"depth":613,"text":1578},{"id":1894,"depth":613,"text":1895},{"id":1957,"depth":613,"text":165},{"id":2201,"depth":613,"text":2202},{"id":2265,"depth":613,"text":2266},{"id":2310,"depth":613,"text":2311},"A háttérmunka-chassis, asynq szerver, outbox relay és schedule runner egyetlen binárisban, közös graceful shutdownnal.","md",null,{},{"icon":114},{"title":140,"description":2387},"G03zbW6lkRZ7SdHso1PbO2ur_OkeNTy2KxhOy0B_PX8",[2395,2397],{"title":135,"path":136,"stem":137,"description":2396,"icon":138,"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.",{"title":144,"path":145,"stem":146,"description":2398,"icon":147,"children":-1},"Dedikált, horizontálisan skálázható gateway, ami élőben pusholja a notificationöket a csatlakozott klienseknek: csak szerver→kliens, centrifuge-ra épülve.",1787346793692]