[{"data":1,"prerenderedAt":2341},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-kit-worker":442,"-hu-kit-worker-surround":2336},[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":263,"body":444,"description":2329,"extension":2330,"links":2331,"meta":2332,"navigation":2333,"path":264,"seo":2334,"stem":265,"__hash__":2335},"docs_hu\u002Fhu\u002F3.kit\u002F4.worker.md",{"type":445,"value":446,"toc":2315},"minimark",[447,460,489,508,543,566,573,590,1298,1332,1335,1427,1454,1459,1465,1534,1548,1552,1565,1599,1605,1609,1678,1685,1833,1837,1862,1878,1896,1899,1909,1980,2077,2086,2136,2141,2145,2152,2194,2205,2209,2212,2243,2250,2254,2287,2311],[448,449,450,451,455,456,459],"p",{},"A worker-chassis a háttérfeldolgozásodat (eventek, listenerek, ütemezett jobok) saját binárisként futtatja, ",[452,453,454],"code",{},"cmd\u002Fworker"," néven, a HTTP API mellett. Ugyanúgy importálod, mint a ",[452,457,458],{},"server","-t:",[461,462,467],"pre",{"className":463,"code":464,"language":465,"meta":466,"style":466},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import \"github.com\u002Fgp-system\u002Fgpsystem\u002Fworker\"\n","go","",[452,468,469],{"__ignoreMap":466},[470,471,474,478,482,486],"span",{"class":472,"line":473},"line",1,[470,475,477],{"class":476},"s7zQu","import",[470,479,481],{"class":480},"sMK4o"," \"",[470,483,485],{"class":484},"sBMFI","github.com\u002Fgp-system\u002Fgpsystem\u002Fworker",[470,487,488],{"class":480},"\"\n",[448,490,491,492,495,496,499,500,507],{},"A ",[452,493,494],{},"worker.Run"," a HTTP-engine-ek ",[452,497,498],{},"Run","-jának háttérmunka-párja: ugyanaz az ",[501,502,503,506],"a",{"href":254},[452,504,505],{},"app"," életciklus"," (jelkezelés, graceful shutdown, closerek, telemetria-flush), csak HTTP-szerver helyett három dolgot futtat egy binárisban:",[509,510,511,525,534],"ul",{},[512,513,514,515,519,520,524],"li",{},"az ",[516,517,518],"strong",{},"asynq szervert",": az ",[501,521,523],{"href":522},"\u002Fhu\u002Fqueue\u002Ftasks#task-t%C3%ADpusok","event-, listener-, ütemezett- és job-taskok"," feldolgozása;",[512,526,514,527,533],{},[516,528,529],{},[501,530,532],{"href":531},"\u002Fhu\u002Fevents\u002Foutbox#a-relay","outbox relay-t",": a commitált eventek továbbítása a queue-ba;",[512,535,536,537,542],{},"a ",[516,538,539],{},[501,540,541],{"href":78},"schedule runnert",": a cron-bejegyzések tüzelése, leader-electionnel.",[448,544,545,546,549,550,552,553,555,556,559,560,565],{},"Ez a task-feldolgozást és az ütemezést ",[516,547,548],{},"egyetlen folyamatban"," futtatja: külön worker- és scheduler-deployment helyett egy ",[452,551,454],{}," binárist skálázol. A bináris alapból a ",[452,554,320],{},"-tel készül; ha egy projekt ",[452,557,558],{},"new project --no-worker","-rel jött létre, az ",[501,561,562],{"href":350},[452,563,564],{},"add worker"," adja hozzá. Akárhogy is, az API-tól függetlenül deployolod és skálázod.",[567,568,570,571],"h2",{"id":569},"a-generált-cmdworker","A generált ",[452,572,454],{},[448,574,575,576,578,579,578,582,585,586,589],{},"A shop worker-binárisa: minden sorát a generátor írta, a modulokat a ",[452,577,325],{}," \u002F ",[452,580,581],{},"add listener",[452,583,584],{},"add job"," drótozza be a ",[452,587,588],{},"\u002F\u002F gpsystem:*"," anchoroknál.",[461,591,594],{"className":463,"code":592,"filename":593,"language":465,"meta":466,"style":466},"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\u002Fgpsystem\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",[452,595,596,604,611,619,630,640,645,655,665,675,685,695,704,709,719,734,747,757,763,768,784,816,835,870,918,923,993,1012,1037,1058,1099,1105,1127,1148,1157,1163,1181,1218,1231,1239,1245,1251,1268,1286,1292],{"__ignoreMap":466},[470,597,598,601],{"class":472,"line":473},[470,599,600],{"class":480},"package",[470,602,603],{"class":484}," main\n",[470,605,607],{"class":472,"line":606},2,[470,608,610],{"emptyLinePlaceholder":609},true,"\n",[470,612,614,616],{"class":472,"line":613},3,[470,615,477],{"class":476},[470,617,618],{"class":480}," (\n",[470,620,622,625,628],{"class":472,"line":621},4,[470,623,624],{"class":480},"    \"",[470,626,627],{"class":484},"context",[470,629,488],{"class":480},[470,631,633,635,638],{"class":472,"line":632},5,[470,634,624],{"class":480},[470,636,637],{"class":484},"log",[470,639,488],{"class":480},[470,641,643],{"class":472,"line":642},6,[470,644,610],{"emptyLinePlaceholder":609},[470,646,648,650,653],{"class":472,"line":647},7,[470,649,624],{"class":480},[470,651,652],{"class":484},"github.com\u002Fgp-system\u002Fdbx\u002Fpg",[470,654,488],{"class":480},[470,656,658,660,663],{"class":472,"line":657},8,[470,659,624],{"class":480},[470,661,662],{"class":484},"github.com\u002Fgp-system\u002Fenvconf",[470,664,488],{"class":480},[470,666,668,670,673],{"class":472,"line":667},9,[470,669,624],{"class":480},[470,671,672],{"class":484},"github.com\u002Fgp-system\u002Fevents",[470,674,488],{"class":480},[470,676,678,680,683],{"class":472,"line":677},10,[470,679,624],{"class":480},[470,681,682],{"class":484},"github.com\u002Fgp-system\u002Fevents\u002Foutbox",[470,684,488],{"class":480},[470,686,688,690,693],{"class":472,"line":687},11,[470,689,624],{"class":480},[470,691,692],{"class":484},"github.com\u002Fgp-system\u002Fevents\u002Fscheduler",[470,694,488],{"class":480},[470,696,698,700,702],{"class":472,"line":697},12,[470,699,624],{"class":480},[470,701,485],{"class":484},[470,703,488],{"class":480},[470,705,707],{"class":472,"line":706},13,[470,708,610],{"emptyLinePlaceholder":609},[470,710,712,714,717],{"class":472,"line":711},14,[470,713,624],{"class":480},[470,715,716],{"class":484},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop",[470,718,488],{"class":480},[470,720,722,726,729,732],{"class":472,"line":721},15,[470,723,725],{"class":724},"sTEyZ","    shopjobs ",[470,727,728],{"class":480},"\"",[470,730,731],{"class":484},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fjobs",[470,733,488],{"class":480},[470,735,737,740,742,745],{"class":472,"line":736},16,[470,738,739],{"class":724},"    shoplisteners ",[470,741,728],{"class":480},[470,743,744],{"class":484},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Flisteners",[470,746,488],{"class":480},[470,748,750,752,755],{"class":472,"line":749},17,[470,751,624],{"class":480},[470,753,754],{"class":484},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fplatform\u002Fconfig",[470,756,488],{"class":480},[470,758,760],{"class":472,"line":759},18,[470,761,762],{"class":480},")\n",[470,764,766],{"class":472,"line":765},19,[470,767,610],{"emptyLinePlaceholder":609},[470,769,771,774,778,781],{"class":472,"line":770},20,[470,772,773],{"class":480},"func",[470,775,777],{"class":776},"s2Zo4"," main",[470,779,780],{"class":480},"()",[470,782,783],{"class":480}," {\n",[470,785,787,790,793,796,799,802,805,808,810,813],{"class":472,"line":786},21,[470,788,789],{"class":724},"    cfg ",[470,791,792],{"class":480},":=",[470,794,795],{"class":724}," envconf",[470,797,798],{"class":480},".",[470,800,801],{"class":776},"MustLoad",[470,803,804],{"class":480},"[",[470,806,807],{"class":484},"config",[470,809,798],{"class":480},[470,811,812],{"class":484},"Config",[470,814,815],{"class":480},"]()\n",[470,817,819,822,824,827,829,832],{"class":472,"line":818},22,[470,820,821],{"class":724},"    ctx ",[470,823,792],{"class":480},[470,825,826],{"class":724}," context",[470,828,798],{"class":480},[470,830,831],{"class":776},"Background",[470,833,834],{"class":480},"()\n",[470,836,838,841,843,846,848,851,854,857,860,863,865,868],{"class":472,"line":837},23,[470,839,840],{"class":724},"    pool ",[470,842,792],{"class":480},[470,844,845],{"class":724}," pg",[470,847,798],{"class":480},[470,849,850],{"class":776},"MustNewPool",[470,852,853],{"class":480},"(",[470,855,856],{"class":724},"ctx",[470,858,859],{"class":480},",",[470,861,862],{"class":724}," cfg",[470,864,798],{"class":480},[470,866,867],{"class":724},"DB",[470,869,762],{"class":480},[470,871,873,876,878,881,883,886,888,890,892,894,896,898,900,903,905,907,909,911,913,916],{"class":472,"line":872},24,[470,874,875],{"class":724},"    relay ",[470,877,792],{"class":480},[470,879,880],{"class":724}," outbox",[470,882,798],{"class":480},[470,884,885],{"class":776},"MustNewRelay",[470,887,853],{"class":480},[470,889,856],{"class":724},[470,891,859],{"class":480},[470,893,862],{"class":724},[470,895,798],{"class":480},[470,897,72],{"class":724},[470,899,859],{"class":480},[470,901,902],{"class":724}," pool",[470,904,859],{"class":480},[470,906,862],{"class":724},[470,908,798],{"class":480},[470,910,263],{"class":724},[470,912,798],{"class":480},[470,914,915],{"class":724},"Valkey",[470,917,762],{"class":480},[470,919,921],{"class":472,"line":920},25,[470,922,610],{"emptyLinePlaceholder":609},[470,924,926,929,931,934,936,938,940,942,944,946,948,950,952,955,959,962,964,966,969,971,974,976,979,981,984,987,991],{"class":472,"line":925},26,[470,927,928],{"class":724},"    err ",[470,930,792],{"class":480},[470,932,933],{"class":724}," worker",[470,935,798],{"class":480},[470,937,498],{"class":776},[470,939,853],{"class":480},[470,941,856],{"class":724},[470,943,859],{"class":480},[470,945,862],{"class":724},[470,947,798],{"class":480},[470,949,263],{"class":724},[470,951,859],{"class":480},[470,953,954],{"class":480}," func(",[470,956,958],{"class":957},"sHdIc","reg",[470,960,961],{"class":480}," *",[470,963,61],{"class":484},[470,965,798],{"class":480},[470,967,968],{"class":484},"Registry",[470,970,859],{"class":480},[470,972,973],{"class":957}," sched",[470,975,961],{"class":480},[470,977,978],{"class":484},"scheduler",[470,980,798],{"class":480},[470,982,983],{"class":484},"Schedule",[470,985,986],{"class":480},")",[470,988,990],{"class":989},"spNyl"," error",[470,992,783],{"class":480},[470,994,996,999,1001,1004,1006,1009],{"class":472,"line":995},27,[470,997,998],{"class":724},"        shopDeps ",[470,1000,792],{"class":480},[470,1002,1003],{"class":484}," shop",[470,1005,798],{"class":480},[470,1007,1008],{"class":484},"Dependencies",[470,1010,1011],{"class":480},"{\n",[470,1013,1015,1018,1021,1024,1026,1029,1031,1034],{"class":472,"line":1014},28,[470,1016,1017],{"class":724},"            DB",[470,1019,1020],{"class":480},":",[470,1022,1023],{"class":724},"         pg",[470,1025,798],{"class":480},[470,1027,1028],{"class":776},"NewDB",[470,1030,853],{"class":480},[470,1032,1033],{"class":724},"pool",[470,1035,1036],{"class":480},"),\n",[470,1038,1040,1043,1045,1047,1049,1052,1054,1056],{"class":472,"line":1039},29,[470,1041,1042],{"class":724},"            Transactor",[470,1044,1020],{"class":480},[470,1046,845],{"class":724},[470,1048,798],{"class":480},[470,1050,1051],{"class":776},"NewTransactor",[470,1053,853],{"class":480},[470,1055,1033],{"class":724},[470,1057,1036],{"class":480},[470,1059,1061,1064,1066,1068,1070,1073,1075,1078,1080,1083,1085,1088,1090,1092,1094,1096],{"class":472,"line":1060},30,[470,1062,1063],{"class":724},"            Dispatcher",[470,1065,1020],{"class":480},[470,1067,880],{"class":724},[470,1069,798],{"class":480},[470,1071,1072],{"class":776},"NewDispatcher",[470,1074,853],{"class":480},[470,1076,1077],{"class":724},"outbox",[470,1079,798],{"class":480},[470,1081,1082],{"class":776},"NewStore",[470,1084,853],{"class":480},[470,1086,1087],{"class":724},"pg",[470,1089,798],{"class":480},[470,1091,1028],{"class":776},[470,1093,853],{"class":480},[470,1095,1033],{"class":724},[470,1097,1098],{"class":480},"))),\n",[470,1100,1102],{"class":472,"line":1101},31,[470,1103,1104],{"class":480},"        }\n",[470,1106,1108,1111,1113,1116,1118,1120,1122,1125],{"class":472,"line":1107},32,[470,1109,1110],{"class":724},"        shoplisteners",[470,1112,798],{"class":480},[470,1114,1115],{"class":776},"Register",[470,1117,853],{"class":480},[470,1119,958],{"class":724},[470,1121,859],{"class":480},[470,1123,1124],{"class":724}," shopDeps",[470,1126,762],{"class":480},[470,1128,1130,1133,1135,1137,1139,1142,1144,1146],{"class":472,"line":1129},33,[470,1131,1132],{"class":724},"        shopjobs",[470,1134,798],{"class":480},[470,1136,1115],{"class":776},[470,1138,853],{"class":480},[470,1140,1141],{"class":724},"sched",[470,1143,859],{"class":480},[470,1145,1124],{"class":724},[470,1147,762],{"class":480},[470,1149,1151,1154],{"class":472,"line":1150},34,[470,1152,1153],{"class":476},"        return",[470,1155,1156],{"class":480}," nil\n",[470,1158,1160],{"class":472,"line":1159},35,[470,1161,1162],{"class":480},"    },\n",[470,1164,1166,1169,1171,1174,1176,1179],{"class":472,"line":1165},36,[470,1167,1168],{"class":724},"        worker",[470,1170,798],{"class":480},[470,1172,1173],{"class":776},"WithOutboxRelay",[470,1175,853],{"class":480},[470,1177,1178],{"class":724},"relay",[470,1180,1036],{"class":480},[470,1182,1184,1186,1188,1191,1193,1195,1199,1201,1203,1205,1207,1209,1212,1214,1216],{"class":472,"line":1183},37,[470,1185,1168],{"class":724},[470,1187,798],{"class":480},[470,1189,1190],{"class":776},"WithCloser",[470,1192,853],{"class":480},[470,1194,728],{"class":480},[470,1196,1198],{"class":1197},"sfazB","pgxpool",[470,1200,728],{"class":480},[470,1202,859],{"class":480},[470,1204,954],{"class":480},[470,1206,627],{"class":484},[470,1208,798],{"class":480},[470,1210,1211],{"class":484},"Context",[470,1213,986],{"class":480},[470,1215,990],{"class":989},[470,1217,783],{"class":480},[470,1219,1221,1224,1226,1229],{"class":472,"line":1220},38,[470,1222,1223],{"class":724},"            pool",[470,1225,798],{"class":480},[470,1227,1228],{"class":776},"Close",[470,1230,834],{"class":480},[470,1232,1234,1237],{"class":472,"line":1233},39,[470,1235,1236],{"class":476},"            return",[470,1238,1156],{"class":480},[470,1240,1242],{"class":472,"line":1241},40,[470,1243,1244],{"class":480},"        }),\n",[470,1246,1248],{"class":472,"line":1247},41,[470,1249,1250],{"class":480},"    )\n",[470,1252,1254,1257,1260,1263,1266],{"class":472,"line":1253},42,[470,1255,1256],{"class":476},"    if",[470,1258,1259],{"class":724}," err ",[470,1261,1262],{"class":480},"!=",[470,1264,1265],{"class":480}," nil",[470,1267,783],{"class":480},[470,1269,1271,1274,1276,1279,1281,1284],{"class":472,"line":1270},43,[470,1272,1273],{"class":724},"        log",[470,1275,798],{"class":480},[470,1277,1278],{"class":776},"Fatal",[470,1280,853],{"class":480},[470,1282,1283],{"class":724},"err",[470,1285,762],{"class":480},[470,1287,1289],{"class":472,"line":1288},44,[470,1290,1291],{"class":480},"    }\n",[470,1293,1295],{"class":472,"line":1294},45,[470,1296,1297],{"class":480},"}\n",[448,1299,1300,1301,1304,1305,1307,1308,1310,1311,1313,1314,578,1317,1320,1321,1323,1324,1327,1328,1331],{},"A minta ugyanaz, mint a HTTP-oldalon: a függőségek ",[516,1302,1303],{},"explicit"," ",[452,1306,1008],{}," structban utaznak, a register callback pedig megkapja az event-",[452,1309,968],{},"-t és a ",[452,1312,983],{},"-t, amiket a modulok generált ",[452,1315,1316],{},"listeners",[452,1318,1319],{},"jobs"," alcsomagjainak ",[452,1322,1115],{}," függvényei töltenek fel. A worker ",[452,1325,1326],{},"Dispatcher","-e is az ",[501,1329,1330],{"href":73},"outboxos",": egy listener által dispatchelt esemény ugyanazt a garanciát kapja, mint egy HTTP-kérésből dobott.",[567,1333,498],{"id":1334},"run",[461,1336,1338],{"className":463,"code":1337,"language":465,"meta":466,"style":466},"func Run(ctx context.Context, cfg Config, register RegisterFunc, opts ...Option) error\n\ntype RegisterFunc func(reg *events.Registry, sched *scheduler.Schedule) error\n",[452,1339,1340,1388,1392],{"__ignoreMap":466},[470,1341,1342,1344,1347,1349,1351,1353,1355,1357,1359,1361,1364,1366,1369,1372,1374,1377,1380,1383,1385],{"class":472,"line":473},[470,1343,773],{"class":480},[470,1345,1346],{"class":776}," Run",[470,1348,853],{"class":480},[470,1350,856],{"class":957},[470,1352,826],{"class":484},[470,1354,798],{"class":480},[470,1356,1211],{"class":484},[470,1358,859],{"class":480},[470,1360,862],{"class":957},[470,1362,1363],{"class":484}," Config",[470,1365,859],{"class":480},[470,1367,1368],{"class":957}," register",[470,1370,1371],{"class":484}," RegisterFunc",[470,1373,859],{"class":480},[470,1375,1376],{"class":957}," opts",[470,1378,1379],{"class":480}," ...",[470,1381,1382],{"class":484},"Option",[470,1384,986],{"class":480},[470,1386,1387],{"class":989}," error\n",[470,1389,1390],{"class":472,"line":606},[470,1391,610],{"emptyLinePlaceholder":609},[470,1393,1394,1397,1399,1401,1403,1405,1407,1409,1411,1413,1415,1417,1419,1421,1423,1425],{"class":472,"line":613},[470,1395,1396],{"class":480},"type",[470,1398,1371],{"class":484},[470,1400,954],{"class":480},[470,1402,958],{"class":957},[470,1404,961],{"class":480},[470,1406,61],{"class":484},[470,1408,798],{"class":480},[470,1410,968],{"class":484},[470,1412,859],{"class":480},[470,1414,973],{"class":957},[470,1416,961],{"class":480},[470,1418,978],{"class":484},[470,1420,798],{"class":480},[470,1422,983],{"class":484},[470,1424,986],{"class":480},[470,1426,1387],{"class":989},[448,1428,491,1429,1431,1432,1435,1436,1439,1440,1446,1447,1449,1450,1453],{},[452,1430,498],{}," sorban: telemetria-bootstrap (",[452,1433,1434],{},"telemetry.Setup",") → a ",[452,1437,1438],{},"register"," felépíti a registryt és a schedule-t → ",[501,1441,1443],{"href":1442},"\u002Fhu\u002Fqueue\u002Foverview#client",[452,1444,1445],{},"queue.Client"," nyitása (PING) → asynq szerver indítása, mellette a relay (ha ",[452,1448,1173],{},"-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 ",[452,1451,1452],{},"nil","-t ad vissza.",[1455,1456,1458],"h3",{"id":1457},"mi-dolgozza-fel-a-taskokat","Mi dolgozza fel a taskokat",[448,1460,1461,1462,1020],{},"A worker négy beépített handlert regisztrál a ",[501,1463,1464],{"href":522},"task-típus-prefixekre",[1466,1467,1468,1481],"table",{},[1469,1470,1471],"thead",{},[1472,1473,1474,1478],"tr",{},[1475,1476,1477],"th",{},"Task",[1475,1479,1480],{},"Mit csinál a handler",[1482,1483,1484,1499,1514,1524],"tbody",{},[1472,1485,1486,1492],{},[1487,1488,1489],"td",{},[452,1490,1491],{},"event:\u003Cnév>",[1487,1493,1494,1495,1498],{},"fan-out: listenerenként egy ",[452,1496,1497],{},"listener:"," taskot enqueue-l, determinisztikus TaskID-vel",[1472,1500,1501,1506],{},[1487,1502,1503],{},[452,1504,1505],{},"listener:\u003Cevent>:\u003Cnév>",[1487,1507,1508,1509,1513],{},"dekódolja a borítékot, contextre teszi a ",[501,1510,1512],{"href":1511},"\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",[1472,1515,1516,1521],{},[1487,1517,1518],{},[452,1519,1520],{},"schedule:\u003Cevent>",[1487,1522,1523],{},"ütemezett tüzelés: friss borítékot épít (id = a trigger task-id-ja), és fan-outol",[1472,1525,1526,1531],{},[1487,1527,1528],{},[452,1529,1530],{},"job:\u003Cnév>",[1487,1532,1533],{},"meghívja az ütemezett job handlerét",[448,1535,1536,1537,1540,1541,1543,1544,1547],{},"Minden handler három middleware-en át fut: Sentry-hub taskonként (breadcrumb-izoláció), ",[516,1538,1539],{},"panic-recovery"," (a panikoló handler ",[452,1542,358],{},"-hibává válik és retry-zik, a worker nem hal bele) és tracing: a consumer span a boríték trace-kontextusát folytatja, így a ",[501,1545,1546],{"href":189},"teljes út egy trace",". Olyan taskot, aminek nincs regisztrált handlere (pl. egy deploy kivette a listenert), a worker warning mellett átugrik, nem retry-zik örökké.",[1455,1549,1551],{"id":1550},"shutdown-sorrend","Shutdown-sorrend",[448,1553,1554,1557,1558,1561,1562,1564],{},[452,1555,1556],{},"SIGINT","\u002F",[452,1559,1560],{},"SIGTERM","-re a ",[452,1563,498],{}," determinisztikus sorrendben áll le:",[1566,1567,1568,1574,1584,1593],"ol",{},[512,1569,1570,1573],{},[516,1571,1572],{},"leállnak a termelő ciklusok",": a schedule runner (elengedi a lease-t) és a relay poll-ciklusa;",[512,1575,1576,1579,1580,1583],{},[516,1577,1578],{},"kiürülnek a folyamatban lévő taskok",": legfeljebb ",[452,1581,1582],{},"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);",[512,1585,1586,1589,1590,1592],{},[516,1587,1588],{},"a closerek LIFO-ban futnak",": előbb a kit sajátjai (scheduler, relay, queue-kliens), aztán a te ",[452,1591,1190],{},"-eid (a shopban a pgx-pool);",[512,1594,1595,1598],{},[516,1596,1597],{},"telemetria-flush",": az utolsó spanok és logok még elmennek.",[448,1600,1601,1602,798],{},"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 ",[501,1603,1604],{"href":254},"alkalmazás-életciklust",[567,1606,1608],{"id":1607},"opciók","Opciók",[1466,1610,1611,1621],{},[1469,1612,1613],{},[1472,1614,1615,1618],{},[1475,1616,1617],{},"Opció",[1475,1619,1620],{},"Hatás",[1482,1622,1623,1636,1646,1658,1668],{},[1472,1624,1625,1630],{},[1487,1626,1627],{},[452,1628,1629],{},"WithOutboxRelay(*outbox.Relay)",[1487,1631,514,1632,1635],{},[501,1633,1634],{"href":531},"outbox relay"," futtatása ebben a workerben (N replikán biztonságos)",[1472,1637,1638,1643],{},[1487,1639,1640],{},[452,1641,1642],{},"WithCloser(name, fn)",[1487,1644,1645],{},"takarítás graceful shutdownkor, a taskok kiürítése után (LIFO)",[1472,1647,1648,1653],{},[1487,1649,1650],{},[452,1651,1652],{},"WithoutTelemetry()",[1487,1654,536,1655,1657],{},[452,1656,1434],{}," kihagyása; teszthez, vagy ha a folyamat maga konfigurálja",[1472,1659,1660,1665],{},[1487,1661,1662],{},[452,1663,1664],{},"WithAsynqConfig(func(*asynq.Config))",[1487,1666,1667],{},"a nyers asynq-konfig módosítása a szerver felépítése előtt; escape hatch a kit által nem exponált beállításokhoz",[1472,1669,1670,1675],{},[1487,1671,1672],{},[452,1673,1674],{},"WithMux(func(*asynq.ServeMux))",[1487,1676,1677],{},"extra nyers asynq handlerek regisztrálása, olyan task-típusokhoz, amiket a kit nem modellez",[448,1679,1680,1681,1684],{},"A két escape hatch a kit ",[501,1682,1683],{"href":53},"\"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.",[461,1686,1688],{"className":463,"code":1687,"language":465,"meta":466,"style":466},"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",[452,1689,1690,1718,1747,1763,1768,1795,1825,1829],{"__ignoreMap":466},[470,1691,1692,1695,1697,1699,1701,1703,1705,1707,1709,1711,1713,1715],{"class":472,"line":473},[470,1693,1694],{"class":724},"worker",[470,1696,798],{"class":480},[470,1698,498],{"class":776},[470,1700,853],{"class":480},[470,1702,856],{"class":724},[470,1704,859],{"class":480},[470,1706,862],{"class":724},[470,1708,798],{"class":480},[470,1710,263],{"class":724},[470,1712,859],{"class":480},[470,1714,1368],{"class":724},[470,1716,1717],{"class":480},",\n",[470,1719,1720,1723,1725,1728,1731,1734,1736,1739,1741,1743,1745],{"class":472,"line":606},[470,1721,1722],{"class":724},"    worker",[470,1724,798],{"class":480},[470,1726,1727],{"class":776},"WithAsynqConfig",[470,1729,1730],{"class":480},"(func(",[470,1732,1733],{"class":957},"c",[470,1735,961],{"class":480},[470,1737,1738],{"class":484},"asynq",[470,1740,798],{"class":480},[470,1742,812],{"class":484},[470,1744,986],{"class":480},[470,1746,783],{"class":480},[470,1748,1749,1752,1754,1757,1760],{"class":472,"line":613},[470,1750,1751],{"class":724},"        c",[470,1753,798],{"class":480},[470,1755,1756],{"class":724},"HealthCheckFunc ",[470,1758,1759],{"class":480},"=",[470,1761,1762],{"class":724}," reportHealth\n",[470,1764,1765],{"class":472,"line":621},[470,1766,1767],{"class":480},"    }),\n",[470,1769,1770,1772,1774,1777,1779,1782,1784,1786,1788,1791,1793],{"class":472,"line":632},[470,1771,1722],{"class":724},[470,1773,798],{"class":480},[470,1775,1776],{"class":776},"WithMux",[470,1778,1730],{"class":480},[470,1780,1781],{"class":957},"mux",[470,1783,961],{"class":480},[470,1785,1738],{"class":484},[470,1787,798],{"class":480},[470,1789,1790],{"class":484},"ServeMux",[470,1792,986],{"class":480},[470,1794,783],{"class":480},[470,1796,1797,1800,1802,1805,1807,1809,1812,1814,1816,1819,1821],{"class":472,"line":642},[470,1798,1799],{"class":724},"        mux",[470,1801,798],{"class":480},[470,1803,1804],{"class":776},"HandleFunc",[470,1806,853],{"class":480},[470,1808,728],{"class":480},[470,1810,1811],{"class":1197},"import:products",[470,1813,728],{"class":480},[470,1815,859],{"class":480},[470,1817,1818],{"class":724}," handleProductImport",[470,1820,986],{"class":480},[470,1822,1824],{"class":1823},"sHwdD"," \u002F\u002F saját task-típus\n",[470,1826,1827],{"class":472,"line":647},[470,1828,1767],{"class":480},[470,1830,1831],{"class":472,"line":657},[470,1832,762],{"class":480},[567,1834,1836],{"id":1835},"queue-prioritások","Queue-prioritások",[448,1838,1839,1840,1843,1844,1847,1848,1851,1852,1854,1855,1861],{},"A worker a queue-kat súlyozottan szolgálja ki: a ",[452,1841,1842],{},"WORKER_QUEUES"," egy ",[452,1845,1846],{},"név:súly"," lista, a Horizon ",[452,1849,1850],{},"balance","\u002Fqueue-súlyozásának megfelelője. A shop a leveleit külön ",[452,1853,113],{}," queue-ba teszi (a listener ",[501,1856,1858],{"href":1857},"\u002Fhu\u002Fevents\u002Foverview#listenerek",[452,1859,1860],{},"queue.OnQueue(\"mail\")"," regisztrációja), így egy levél-burst nem szoríthatja ki a többi munkát:",[461,1863,1867],{"className":1864,"code":1865,"language":1866,"meta":466,"style":466},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","WORKER_QUEUES=default:3,mail:1\n","sh",[452,1868,1869],{"__ignoreMap":466},[470,1870,1871,1873,1875],{"class":472,"line":473},[470,1872,1842],{"class":724},[470,1874,1759],{"class":480},[470,1876,1877],{"class":1197},"default:3,mail:1\n",[448,1879,1880,1881,1884,1885,1887,1888,1891,1892,1895],{},"Így a worker a kapacitása ~75%-át a ",[452,1882,1883],{},"default",", ~25%-át a ",[452,1886,113],{}," queue-ra fordítja, amikor mindkettőben van munka. A ",[452,1889,1890],{},"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 ",[452,1893,1894],{},"critical"," sorod, ami mindent megelőz.",[567,1897,204],{"id":1898},"konfiguráció",[448,1900,491,1901,1904,1905,1908],{},[452,1902,1903],{},"worker.Config","-ot prefix nélkül ágyazod a projekt-konfigba (a generált ",[452,1906,1907],{},"config.go","-ban készen van):",[461,1910,1912],{"className":463,"code":1911,"language":465,"meta":466,"style":466},"type Config struct {\n    Worker worker.Config\n    DB     dbx.Config    `envPrefix:\"DB_\"`\n    Outbox outbox.Config `envPrefix:\"OUTBOX_\"`\n}\n",[452,1913,1914,1925,1937,1957,1976],{"__ignoreMap":466},[470,1915,1916,1918,1920,1923],{"class":472,"line":473},[470,1917,1396],{"class":480},[470,1919,1363],{"class":484},[470,1921,1922],{"class":480}," struct",[470,1924,783],{"class":480},[470,1926,1927,1930,1932,1934],{"class":472,"line":606},[470,1928,1929],{"class":724},"    Worker ",[470,1931,1694],{"class":484},[470,1933,798],{"class":480},[470,1935,1936],{"class":484},"Config\n",[470,1938,1939,1942,1944,1946,1948,1951,1954],{"class":472,"line":613},[470,1940,1941],{"class":724},"    DB     ",[470,1943,405],{"class":484},[470,1945,798],{"class":480},[470,1947,812],{"class":484},[470,1949,1950],{"class":480},"    `",[470,1952,1953],{"class":1197},"envPrefix:\"DB_\"",[470,1955,1956],{"class":480},"`\n",[470,1958,1959,1962,1964,1966,1968,1971,1974],{"class":472,"line":621},[470,1960,1961],{"class":724},"    Outbox ",[470,1963,1077],{"class":484},[470,1965,798],{"class":480},[470,1967,812],{"class":484},[470,1969,1970],{"class":480}," `",[470,1972,1973],{"class":1197},"envPrefix:\"OUTBOX_\"",[470,1975,1956],{"class":480},[470,1977,1978],{"class":472,"line":632},[470,1979,1297],{"class":480},[1466,1981,1982,1995],{},[1469,1983,1984],{},[1472,1985,1986,1989,1992],{},[1475,1987,1988],{},"Változó",[1475,1990,1991],{},"Default",[1475,1993,1994],{},"Jelentés",[1482,1996,1997,2012,2029,2044,2058],{},[1472,1998,1999,2004,2009],{},[1487,2000,2001],{},[452,2002,2003],{},"WORKER_CONCURRENCY",[1487,2005,2006],{},[452,2007,2008],{},"10",[1487,2010,2011],{},"egyszerre ennyi task dolgozódik fel",[1472,2013,2014,2018,2023],{},[1487,2015,2016],{},[452,2017,1842],{},[1487,2019,2020],{},[452,2021,2022],{},"default:1",[1487,2024,2025,2026,986],{},"queue → súly párok (",[452,2027,2028],{},"critical:6,default:3,low:1",[1472,2030,2031,2036,2041],{},[1487,2032,2033],{},[452,2034,2035],{},"WORKER_STRICT_PRIORITY",[1487,2037,2038],{},[452,2039,2040],{},"false",[1487,2042,2043],{},"súlyozás helyett szigorú prioritás-sorrend",[1472,2045,2046,2050,2055],{},[1487,2047,2048],{},[452,2049,1582],{},[1487,2051,2052],{},[452,2053,2054],{},"30s",[1487,2056,2057],{},"a graceful drain korlátja; a be nem fejezett taskok visszakerülnek a sorba",[1472,2059,2060,2065,2070],{},[1487,2061,2062],{},[452,2063,2064],{},"WORKER_DEFAULT_MAX_RETRY",[1487,2066,2067],{},[452,2068,2069],{},"25",[1487,2071,2072,2073,2076],{},"a saját ",[452,2074,2075],{},"queue.MaxRetry"," nélküli listener-\u002Fjob-taskok retry-kerete",[448,2078,491,2079,2081,2082,2085],{},[452,2080,1903],{}," három további configot ágyaz be, így a worker-bináris ",[516,2083,2084],{},"egyetlen env-készletből"," konfigurálódik:",[509,2087,2088,2104,2116],{},[512,2089,2090,1304,2096,2099,2100,2103],{},[501,2091,2093],{"href":2092},"\u002Fhu\u002Fqueue\u002Foverview#konfigur%C3%A1ci%C3%B3",[452,2094,2095],{},"queue.Config",[452,2097,2098],{},"VALKEY_"," prefixszel (",[452,2101,2102],{},"VALKEY_ADDR",", ...),",[512,2105,2106,1304,2112,2115],{},[501,2107,2109],{"href":2108},"\u002Fhu\u002Fevents\u002Fscheduler#konfigur%C3%A1ci%C3%B3",[452,2110,2111],{},"scheduler.Config",[452,2113,2114],{},"SCHEDULER_"," prefixszel,",[512,2117,2118,2121,2122,2125,2126,2125,2129,2132,2133,798],{},[452,2119,2120],{},"telemetry.Config"," prefix nélkül (a standard ",[452,2123,2124],{},"OTEL_*",", ",[452,2127,2128],{},"LOG_*",[452,2130,2131],{},"SENTRY_*"," nevek), lásd az ",[501,2134,2135],{"href":180},"observability áttekintőt",[448,2137,2138,2139,798],{},"A teljes env-referencia: ",[501,2140,1898],{"href":205},[567,2142,2144],{"id":2143},"logging","Logging",[448,2146,2147,2148,2151],{},"A worker taskonként logol az alapértelmezett ",[452,2149,2150],{},"slog"," loggeren át, a consumer spanhez trace-korreláltan:",[509,2153,2154,2170,2180],{},[512,2155,2156,2159,2160,2125,2163,2125,2166,2169],{},[452,2157,2158],{},"worker: task started"," (Info): ",[452,2161,2162],{},"task_type",[452,2164,2165],{},"task_id",[452,2167,2168],{},"attempt"," attribútumokkal;",[512,2171,2172,2175,2176,2179],{},[452,2173,2174],{},"worker: task done"," (Info): plusz ",[452,2177,2178],{},"duration",";",[512,2181,2182,2185,2186,2189,2190,2193],{},[452,2183,2184],{},"worker: task failed"," (Error): plusz ",[452,2187,2188],{},"error","; a szándékos skip (",[452,2191,2192],{},"SkipRetry",", pl. nincs regisztrált handler) csak egyszer, warningként jelenik meg.",[448,2195,2196,2197,2200,2201,2204],{},"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 ",[501,2198,2199],{"href":184},"logging-konfig"," dönti el; ",[452,2202,2203],{},"LOG_LEVEL=WARN"," elnémítja a taskonkénti Info-sorokat.",[567,2206,2208],{"id":2207},"skálázás","Skálázás",[448,2210,2211],{},"A worker állapotmentes: annyi replikát futtatsz, amennyi munkád van, és mindhárom komponens replikabiztos.",[509,2213,2214,2220,2233],{},[512,2215,514,2216,2219],{},[516,2217,2218],{},"asynq szerver"," természeténél fogva: egy taskot egyszerre egy worker kap;",[512,2221,514,2222,2224,2225,2232],{},[516,2223,1634],{}," a ",[501,2226,2228,2231],{"href":2227},"\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",[452,2229,2230],{},"FOR UPDATE SKIP LOCKED"," + determinisztikus TaskID"," párossal;",[512,2234,536,2235,2224,2238,2242],{},[516,2236,2237],{},"schedule runner",[501,2239,2241],{"href":2240},"\u002Fhu\u002Fevents\u002Fscheduler#replika-biztons%C3%A1g-a-leader-election","Valkey-lease leader-electionnel",": N replikából egy tüzel.",[448,2244,2245,2246,798],{},"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 ",[501,2247,2249],{"href":2248},"\u002Fhu\u002Fevents\u002Foverview#idempotencia","listenerek idempotensek",[567,2251,2253],{"id":2252},"helyi-futtatás","Helyi futtatás",[461,2255,2257],{"className":1864,"code":2256,"language":1866,"meta":466,"style":466},"go run .\u002Fcmd\u002Fmigrate up   # az outbox_events migráció is lefut\nmise run worker           # go run .\u002Fcmd\u002Fworker\n",[452,2258,2259,2275],{"__ignoreMap":466},[470,2260,2261,2263,2266,2269,2272],{"class":472,"line":473},[470,2262,465],{"class":484},[470,2264,2265],{"class":1197}," run",[470,2267,2268],{"class":1197}," .\u002Fcmd\u002Fmigrate",[470,2270,2271],{"class":1197}," up",[470,2273,2274],{"class":1823},"   # az outbox_events migráció is lefut\n",[470,2276,2277,2280,2282,2284],{"class":472,"line":606},[470,2278,2279],{"class":484},"mise",[470,2281,2265],{"class":1197},[470,2283,933],{"class":1197},[470,2285,2286],{"class":1823},"           # go run .\u002Fcmd\u002Fworker\n",[448,2288,2289,2290,2293,2294,2297,2298,2125,2301,2125,2303,2125,2305,2307,2308,798],{},"A Valkey a projekt ",[452,2291,2292],{},"compose.yml","-jéből jön (",[452,2295,2296],{},"mise run dev","). A generátorparancsokhoz (",[452,2299,2300],{},"add event",[452,2302,581],{},[452,2304,584],{},[452,2306,564],{},") lásd a ",[501,2309,2310],{"href":350},"CLI worker-generátorokat",[2312,2313,2314],"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":466,"searchDepth":606,"depth":606,"links":2316},[2317,2319,2323,2324,2325,2326,2327,2328],{"id":569,"depth":606,"text":2318},"A generált cmd\u002Fworker",{"id":1334,"depth":606,"text":498,"children":2320},[2321,2322],{"id":1457,"depth":613,"text":1458},{"id":1550,"depth":613,"text":1551},{"id":1607,"depth":606,"text":1608},{"id":1835,"depth":606,"text":1836},{"id":1898,"depth":606,"text":204},{"id":2143,"depth":606,"text":2144},{"id":2207,"depth":606,"text":2208},{"id":2252,"depth":606,"text":2253},"A háttérmunka-chassis, asynq szerver, outbox relay és schedule runner egyetlen binárisban, közös graceful shutdownnal.","md",null,{},{"icon":266},{"title":263,"description":2329},"vD22AQlR8gjFw2aD-EQSJ_DFd7nyetMkltUIuLn8zDM",[2337,2339],{"title":258,"path":259,"stem":260,"description":2338,"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.",{"title":268,"path":269,"stem":270,"description":2340,"icon":70,"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.",1785445885011]