[{"data":1,"prerenderedAt":1702},["ShallowReactive",2],{"navigation_docs_en":3,"-en-queue-overview":441,"-en-queue-overview-surround":1697},[4,45,60,81,112,129,146,173,197,213,242,279,356,372,384,403,429],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Getting Started","i-lucide-rocket","\u002Fen\u002Fgetting-started","en\u002F1.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fen\u002Fgetting-started\u002Fintroduction","en\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Coming from Laravel","\u002Fen\u002Fgetting-started\u002Fcoming-from-laravel","en\u002F1.getting-started\u002F2.coming-from-laravel","i-lucide-arrow-right-left",{"title":21,"path":22,"stem":23,"icon":19},"Coming from Symfony","\u002Fen\u002Fgetting-started\u002Fcoming-from-symfony","en\u002F1.getting-started\u002F3.coming-from-symfony",{"title":25,"path":26,"stem":27,"icon":28},"Installation","\u002Fen\u002Fgetting-started\u002Finstallation","en\u002F1.getting-started\u002F4.installation","i-lucide-download",{"title":30,"path":31,"stem":32,"icon":33},"Your first module","\u002Fen\u002Fgetting-started\u002Ffirst-module","en\u002F1.getting-started\u002F5.first-module","i-lucide-package-plus",{"title":35,"path":36,"stem":37,"icon":38},"Project structure","\u002Fen\u002Fgetting-started\u002Fproject-structure","en\u002F1.getting-started\u002F6.project-structure","i-lucide-folder-tree",{"title":40,"path":41,"stem":42,"icon":43},"The shop sample application","\u002Fen\u002Fgetting-started\u002Fsample-app","en\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","\u002Fen\u002Fqueue","en\u002F10.queue",[51,56],{"title":52,"path":53,"stem":54,"icon":55},"Overview","\u002Fen\u002Fqueue\u002Foverview","en\u002F10.queue\u002F1.overview","i-lucide-list-ordered",{"title":57,"path":58,"stem":59,"icon":47},"Tasks","\u002Fen\u002Fqueue\u002Ftasks","en\u002F10.queue\u002F2.tasks",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":44},"events","i-lucide-workflow","\u002Fen\u002Fevents","en\u002F11.events",[66,71,76],{"title":67,"path":68,"stem":69,"icon":70},"Events","\u002Fen\u002Fevents\u002Foverview","en\u002F11.events\u002F1.overview","i-lucide-radio",{"title":72,"path":73,"stem":74,"icon":75},"Outbox","\u002Fen\u002Fevents\u002Foutbox","en\u002F11.events\u002F2.outbox","i-lucide-inbox",{"title":77,"path":78,"stem":79,"icon":80},"Scheduling","\u002Fen\u002Fevents\u002Fscheduler","en\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","\u002Fen\u002Fauth","en\u002F12.auth",[87,92,97,102,107],{"title":88,"path":89,"stem":90,"icon":91},"Authentication","\u002Fen\u002Fauth\u002Foverview","en\u002F12.auth\u002F1.overview","i-lucide-key-round",{"title":93,"path":94,"stem":95,"icon":96},"RBAC","\u002Fen\u002Fauth\u002Frbac","en\u002F12.auth\u002F2.rbac","i-lucide-users",{"title":98,"path":99,"stem":100,"icon":101},"Policies","\u002Fen\u002Fauth\u002Fpolicy","en\u002F12.auth\u002F3.policy","i-lucide-gavel",{"title":103,"path":104,"stem":105,"icon":106},"Using auth standalone","\u002Fen\u002Fauth\u002Fstandalone","en\u002F12.auth\u002F4.standalone","i-lucide-plug",{"title":108,"path":109,"stem":110,"icon":111},"Social login with goth, standalone","\u002Fen\u002Fauth\u002Fsocial-standalone","en\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","\u002Fen\u002Fmail","en\u002F13.mail",[118,121,125],{"title":52,"path":119,"stem":120,"icon":114},"\u002Fen\u002Fmail\u002Foverview","en\u002F13.mail\u002F1.overview",{"title":122,"path":123,"stem":124,"icon":114},"SMTP","\u002Fen\u002Fmail\u002Fsmtp","en\u002F13.mail\u002F2.smtp",{"title":126,"path":127,"stem":128,"icon":114},"MJML","\u002Fen\u002Fmail\u002Fmjml","en\u002F13.mail\u002F3.mjml",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":44},"notify","i-lucide-bell","\u002Fen\u002Fnotify","en\u002F14.notify",[135,138,142],{"title":52,"path":136,"stem":137,"icon":131},"\u002Fen\u002Fnotify\u002Foverview","en\u002F14.notify\u002F1.overview",{"title":139,"path":140,"stem":141,"icon":131},"Database channel","\u002Fen\u002Fnotify\u002Fdatabase","en\u002F14.notify\u002F2.database",{"title":143,"path":144,"stem":145,"icon":131},"Broadcast channel","\u002Fen\u002Fnotify\u002Fbroadcast","en\u002F14.notify\u002F3.broadcast",{"title":147,"icon":148,"path":149,"stem":150,"children":151,"page":44},"storage","i-lucide-hard-drive","\u002Fen\u002Fstorage","en\u002F15.storage",[152,155,159,163,168],{"title":52,"path":153,"stem":154,"icon":148},"\u002Fen\u002Fstorage\u002Foverview","en\u002F15.storage\u002F1.overview",{"title":156,"path":157,"stem":158},"Disk API","\u002Fen\u002Fstorage\u002Fdisk-api","en\u002F15.storage\u002F2.disk-api",{"title":160,"path":161,"stem":162,"icon":148},"Memory and local disk","\u002Fen\u002Fstorage\u002Flocal","en\u002F15.storage\u002F3.local",{"title":164,"path":165,"stem":166,"icon":167},"S3","\u002Fen\u002Fstorage\u002Fs3","en\u002F15.storage\u002F4.s3","i-lucide-cloud",{"title":169,"path":170,"stem":171,"icon":172},"Testing","\u002Fen\u002Fstorage\u002Ftesting","en\u002F15.storage\u002F5.testing","i-lucide-flask-conical",{"title":174,"icon":175,"path":176,"stem":177,"children":178,"page":44},"telemetry","i-lucide-activity","\u002Fen\u002Ftelemetry","en\u002F16.telemetry",[179,182,187,192],{"title":52,"path":180,"stem":181,"icon":175},"\u002Fen\u002Ftelemetry\u002Foverview","en\u002F16.telemetry\u002F1.overview",{"title":183,"path":184,"stem":185,"icon":186},"Logging","\u002Fen\u002Ftelemetry\u002Flogging","en\u002F16.telemetry\u002F2.logging","i-lucide-scroll-text",{"title":188,"path":189,"stem":190,"icon":191},"OpenTelemetry","\u002Fen\u002Ftelemetry\u002Fopentelemetry","en\u002F16.telemetry\u002F3.opentelemetry","i-lucide-radar",{"title":193,"path":194,"stem":195,"icon":196},"Sentry","\u002Fen\u002Ftelemetry\u002Fsentry","en\u002F16.telemetry\u002F4.sentry","i-lucide-bug",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":44},"Reference","i-lucide-book-open","\u002Fen\u002Freference","en\u002F17.reference",[203,208],{"title":204,"path":205,"stem":206,"icon":207},"Configuration","\u002Fen\u002Freference\u002Fconfiguration","en\u002F17.reference\u002F1.configuration","i-lucide-settings",{"title":209,"path":210,"stem":211,"icon":212},"External dependencies","\u002Fen\u002Freference\u002Fdependencies","en\u002F17.reference\u002F2.dependencies","i-lucide-package",{"title":214,"icon":215,"path":216,"stem":217,"children":218,"page":44},"Concepts","i-lucide-lightbulb","\u002Fen\u002Fconcepts","en\u002F2.concepts",[219,223,228,232,237],{"title":220,"path":221,"stem":222,"icon":47},"Architecture","\u002Fen\u002Fconcepts\u002Farchitecture","en\u002F2.concepts\u002F1.architecture",{"title":224,"path":225,"stem":226,"icon":227},"Error model","\u002Fen\u002Fconcepts\u002Ferror-model","en\u002F2.concepts\u002F2.error-model","i-lucide-shield-alert",{"title":204,"path":229,"stem":230,"icon":231},"\u002Fen\u002Fconcepts\u002Fconfiguration","en\u002F2.concepts\u002F3.configuration","i-lucide-settings-2",{"title":233,"path":234,"stem":235,"icon":236},"Codegen pipeline","\u002Fen\u002Fconcepts\u002Fcodegen-pipeline","en\u002F2.concepts\u002F4.codegen-pipeline","i-lucide-file-json",{"title":238,"path":239,"stem":240,"icon":241},"Design patterns","\u002Fen\u002Fconcepts\u002Fdesign-patterns","en\u002F2.concepts\u002F5.design-patterns","i-lucide-puzzle",{"title":243,"icon":244,"path":245,"stem":246,"children":247,"page":44},"Kit","i-lucide-box","\u002Fen\u002Fkit","en\u002F3.kit",[248,251,256,261,266,270,275],{"title":52,"path":249,"stem":250,"icon":244},"\u002Fen\u002Fkit\u002Foverview","en\u002F3.kit\u002F1.overview",{"title":252,"path":253,"stem":254,"icon":255},"Application lifecycle","\u002Fen\u002Fkit\u002Fapp","en\u002F3.kit\u002F2.app","i-lucide-power",{"title":257,"path":258,"stem":259,"icon":260},"Server","\u002Fen\u002Fkit\u002Fserver","en\u002F3.kit\u002F3.server","i-lucide-server",{"title":262,"path":263,"stem":264,"icon":265},"Worker","\u002Fen\u002Fkit\u002Fworker","en\u002F3.kit\u002F4.worker","i-lucide-cog",{"title":267,"path":268,"stem":269,"icon":70},"Realtime","\u002Fen\u002Fkit\u002Frealtime","en\u002F3.kit\u002F5.realtime",{"title":271,"path":272,"stem":273,"icon":274},"Migrations","\u002Fen\u002Fkit\u002Fmigrations","en\u002F3.kit\u002F6.migrations","i-lucide-file-stack",{"title":276,"path":277,"stem":278,"icon":111},"Social login","\u002Fen\u002Fkit\u002Fsocial-login","en\u002F3.kit\u002F7.social-login",{"title":280,"icon":281,"path":282,"stem":283,"children":284,"page":44},"CLI Reference","i-lucide-terminal","\u002Fen\u002Fcli","en\u002F4.cli",[285,288,293,298,303,308,313,318,323,328,333,337,342,347,351],{"title":52,"path":286,"stem":287,"icon":281},"\u002Fen\u002Fcli\u002Foverview","en\u002F4.cli\u002F1.overview",{"title":289,"path":290,"stem":291,"icon":292},"add db","\u002Fen\u002Fcli\u002Fadd-db","en\u002F4.cli\u002F10.add-db","i-lucide-database-zap",{"title":294,"path":295,"stem":296,"icon":297},"add compose \u002F add docker","\u002Fen\u002Fcli\u002Fadd-compose","en\u002F4.cli\u002F11.add-compose","i-lucide-container",{"title":299,"path":300,"stem":301,"icon":302},"add mail","\u002Fen\u002Fcli\u002Fadd-mail","en\u002F4.cli\u002F12.add-mail","i-lucide-mail-plus",{"title":304,"path":305,"stem":306,"icon":307},"add notification","\u002Fen\u002Fcli\u002Fadd-notification","en\u002F4.cli\u002F13.add-notification","i-lucide-bell-plus",{"title":309,"path":310,"stem":311,"icon":312},"add realtime","\u002Fen\u002Fcli\u002Fadd-realtime","en\u002F4.cli\u002F14.add-realtime","i-lucide-radio-tower",{"title":314,"path":315,"stem":316,"icon":317},"add seeder","\u002Fen\u002Fcli\u002Fadd-seeder","en\u002F4.cli\u002F15.add-seeder","i-lucide-sprout",{"title":319,"path":320,"stem":321,"icon":322},"new project","\u002Fen\u002Fcli\u002Fnew-project","en\u002F4.cli\u002F2.new-project","i-lucide-folder-plus",{"title":324,"path":325,"stem":326,"icon":327},"new module","\u002Fen\u002Fcli\u002Fnew-module","en\u002F4.cli\u002F3.new-module","i-lucide-blocks",{"title":329,"path":330,"stem":331,"icon":332},"add surface","\u002Fen\u002Fcli\u002Fadd-surface","en\u002F4.cli\u002F4.add-surface","i-lucide-layers-2",{"title":334,"path":335,"stem":336,"icon":244},"add core","\u002Fen\u002Fcli\u002Fadd-core","en\u002F4.cli\u002F5.add-core",{"title":338,"path":339,"stem":340,"icon":341},"add handler","\u002Fen\u002Fcli\u002Fadd-handler","en\u002F4.cli\u002F6.add-handler","i-lucide-webhook",{"title":343,"path":344,"stem":345,"icon":346},"new migration","\u002Fen\u002Fcli\u002Fnew-migration","en\u002F4.cli\u002F7.new-migration","i-lucide-file-plus",{"title":348,"path":349,"stem":350,"icon":265},"worker generators","\u002Fen\u002Fcli\u002Fworker-generators","en\u002F4.cli\u002F8.worker-generators",{"title":352,"path":353,"stem":354,"icon":355},"upgrade templates","\u002Fen\u002Fcli\u002Fupgrade-templates","en\u002F4.cli\u002F9.upgrade-templates","i-lucide-refresh-cw",{"title":357,"icon":227,"path":358,"stem":359,"children":360,"page":44},"errs","\u002Fen\u002Ferrs","en\u002F5.errs",[361,364,368],{"title":52,"path":362,"stem":363,"icon":227},"\u002Fen\u002Ferrs\u002Foverview","en\u002F5.errs\u002F1.overview",{"title":365,"path":366,"stem":367},"API","\u002Fen\u002Ferrs\u002Fapi","en\u002F5.errs\u002F2.api",{"title":369,"path":370,"stem":371,"icon":227},"Integration","\u002Fen\u002Ferrs\u002Fintegration","en\u002F5.errs\u002F3.integration",{"title":373,"icon":231,"path":374,"stem":375,"children":376,"page":44},"envconf","\u002Fen\u002Fenvconf","en\u002F6.envconf",[377,380],{"title":52,"path":378,"stem":379,"icon":231},"\u002Fen\u002Fenvconf\u002Foverview","en\u002F6.envconf\u002F1.overview",{"title":381,"path":382,"stem":383},"Recipes","\u002Fen\u002Fenvconf\u002Frecipes","en\u002F6.envconf\u002F2.recipes",{"title":385,"icon":386,"path":387,"stem":388,"children":389,"page":44},"httperr","i-lucide-globe","\u002Fen\u002Fhttperr","en\u002F7.httperr",[390,393,398],{"title":52,"path":391,"stem":392,"icon":386},"\u002Fen\u002Fhttperr\u002Foverview","en\u002F7.httperr\u002F1.overview",{"title":394,"path":395,"stem":396,"icon":397},"Error responses","\u002Fen\u002Fhttperr\u002Ferror-responses","en\u002F7.httperr\u002F2.error-responses","i-lucide-octagon-alert",{"title":399,"path":400,"stem":401,"icon":402},"Validation","\u002Fen\u002Fhttperr\u002Fvalidation","en\u002F7.httperr\u002F3.validation","i-lucide-badge-check",{"title":404,"icon":405,"path":406,"stem":407,"children":408,"page":44},"dbx","i-lucide-database","\u002Fen\u002Fdbx","en\u002F8.dbx",[409,412,416,420,425],{"title":52,"path":410,"stem":411,"icon":405},"\u002Fen\u002Fdbx\u002Foverview","en\u002F8.dbx\u002F1.overview",{"title":413,"path":414,"stem":415,"icon":106},"pgx","\u002Fen\u002Fdbx\u002Fpg","en\u002F8.dbx\u002F2.pg",{"title":417,"path":418,"stem":419,"icon":47},"bun","\u002Fen\u002Fdbx\u002Fbunx","en\u002F8.dbx\u002F3.bunx",{"title":421,"path":422,"stem":423,"icon":424},"Transactions","\u002Fen\u002Fdbx\u002Ftransactions","en\u002F8.dbx\u002F4.transactions","i-lucide-git-merge",{"title":426,"path":427,"stem":428,"icon":317},"Seeders","\u002Fen\u002Fdbx\u002Fseed","en\u002F8.dbx\u002F5.seed",{"title":430,"icon":55,"path":431,"stem":432,"children":433,"page":44},"paginate","\u002Fen\u002Fpaginate","en\u002F9.paginate",[434,437],{"title":52,"path":435,"stem":436,"icon":55},"\u002Fen\u002Fpaginate\u002Foverview","en\u002F9.paginate\u002F1.overview",{"title":438,"path":439,"stem":440,"icon":19},"Cursor pagination","\u002Fen\u002Fpaginate\u002Fcursor","en\u002F9.paginate\u002F2.cursor",{"id":442,"title":52,"body":443,"description":1690,"extension":1691,"links":1692,"meta":1693,"navigation":1694,"path":53,"seo":1695,"stem":54,"__hash__":1696},"docs_en\u002Fen\u002F10.queue\u002F1.overview.md",{"type":444,"value":445,"toc":1683},"minimark",[446,482,510,522,543,548,580,605,608,614,662,734,737,760,774,778,898,918,927,960,1079,1103,1107,1112,1655,1659,1679],[447,448,449,452,453,456,457,460,461,460,464,467,468,471,472,478,479,481],"p",{},[450,451,46],"code",{}," is a standalone Go module (",[450,454,455],{},"github.com\u002Fgp-system\u002Fqueue","): the Valkey\u002Fasynq foundation everything else in the async category builds on: ",[458,459,61],"a",{"href":68},", ",[458,462,463],{"href":73},"outbox",[458,465,466],{"href":78},"scheduling",", and the kit's ",[458,469,470],{"href":263},"worker"," chassis. It combines connection config and task enqueueing in one place; the server side is ",[458,473,477],{"href":474,"rel":475},"https:\u002F\u002Fgithub.com\u002Fhibiken\u002Fasynq",[476],"nofollow","asynq",", which provides the worker processing and monitoring. The higher-level options, the event envelope, and task-type naming are covered on the next page, ",[458,480,57],{"href":58},"; this page stays at the level of connecting and enqueueing.",[483,484,489],"pre",{"className":485,"code":486,"language":487,"meta":488,"style":488},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import \"github.com\u002Fgp-system\u002Fqueue\"\n","go","",[450,490,491],{"__ignoreMap":488},[492,493,496,500,504,507],"span",{"class":494,"line":495},"line",1,[492,497,499],{"class":498},"s7zQu","import",[492,501,503],{"class":502},"sMK4o"," \"",[492,505,455],{"class":506},"sBMFI",[492,508,509],{"class":502},"\"\n",[447,511,512,513,517,518,521],{},"Day to day you rarely call it directly: events reach the queue through a ",[458,514,516],{"href":515},"\u002Fen\u002Fevents\u002Foverview#dispatch","dispatcher",", jobs through the ",[458,519,520],{"href":78},"scheduler",". But the concepts here (config, client, the envelope on the next page) reappear in every higher layer, so this is the right place to start.",[523,524,525,527,528,532,533,460,536,460,539,542],"note",{},[450,526,46],{}," ",[529,530,531],"strong",{},"centralizes, it does not abstract",": asynq's types (",[450,534,535],{},"*asynq.Task",[450,537,538],{},"*asynq.TaskInfo",[450,540,541],{},"asynq.Option",") are visible in the public API. When the event\u002Fscheduler layer doesn't fit, application code is free to use asynq directly through this same client. Since nothing is hidden, asynq's ecosystem tooling (e.g. the Asynqmon web UI, the closest thing to a Horizon dashboard) works immediately against the same Valkey.",[544,545,547],"h2",{"id":546},"install","Install",[483,549,553],{"className":550,"code":551,"language":552,"meta":488,"style":488},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com\u002Fgp-system\u002Fqueue@v0.1.0 # the kit itself uses this tag\ngo get github.com\u002Fgp-system\u002Fqueue@latest\n","sh",[450,554,555,570],{"__ignoreMap":488},[492,556,557,559,563,566],{"class":494,"line":495},[492,558,487],{"class":506},[492,560,562],{"class":561},"sfazB"," get",[492,564,565],{"class":561}," github.com\u002Fgp-system\u002Fqueue@v0.1.0",[492,567,569],{"class":568},"sHwdD"," # the kit itself uses this tag\n",[492,571,573,575,577],{"class":494,"line":572},2,[492,574,487],{"class":506},[492,576,562],{"class":561},[492,578,579],{"class":561}," github.com\u002Fgp-system\u002Fqueue@latest\n",[447,581,582,583,585,586,460,590,596,597,604],{},"Go 1.25+. ",[450,584,46],{}," depends on ",[458,587,588],{"href":362},[450,589,357],{},[458,591,593],{"href":474,"rel":592},[476],[450,594,595],{},"hibiken\u002Fasynq"," and ",[458,598,601],{"href":599,"rel":600},"https:\u002F\u002Fgithub.com\u002Fredis\u002Fgo-redis",[476],[450,602,603],{},"redis\u002Fgo-redis\u002Fv9",", plus OTel's tracing API for the producer span.",[544,606,204],{"id":607},"configuration",[447,609,610,613],{},[450,611,612],{},"queue.Config"," is the single Valkey connection description: the client, the worker, the scheduler and the outbox relay all receive it. Compose it under a prefix:",[483,615,617],{"className":485,"code":616,"language":487,"meta":488,"style":488},"type Config struct {\n    Valkey queue.Config `envPrefix:\"VALKEY_\"`\n}\n",[450,618,619,633,656],{"__ignoreMap":488},[492,620,621,624,627,630],{"class":494,"line":495},[492,622,623],{"class":502},"type",[492,625,626],{"class":506}," Config",[492,628,629],{"class":502}," struct",[492,631,632],{"class":502}," {\n",[492,634,635,639,641,644,647,650,653],{"class":494,"line":572},[492,636,638],{"class":637},"sTEyZ","    Valkey ",[492,640,46],{"class":506},[492,642,643],{"class":502},".",[492,645,646],{"class":506},"Config",[492,648,649],{"class":502}," `",[492,651,652],{"class":561},"envPrefix:\"VALKEY_\"",[492,654,655],{"class":502},"`\n",[492,657,659],{"class":494,"line":658},3,[492,660,661],{"class":502},"}\n",[663,664,665,681],"table",{},[666,667,668],"thead",{},[669,670,671,675,678],"tr",{},[672,673,674],"th",{},"Variable",[672,676,677],{},"Default",[672,679,680],{},"Meaning",[682,683,684,703,719],"tbody",{},[669,685,686,692,697],{},[687,688,689],"td",{},[450,690,691],{},"VALKEY_ADDR",[687,693,694],{},[450,695,696],{},"localhost:6379",[687,698,699,700],{},"Valkey ",[450,701,702],{},"host:port",[669,704,705,710,716],{},[687,706,707],{},[450,708,709],{},"VALKEY_PASSWORD",[687,711,712],{},[713,714,715],"em",{},"(empty)",[687,717,718],{},"password; empty means no auth",[669,720,721,726,731],{},[687,722,723],{},[450,724,725],{},"VALKEY_DB",[687,727,728],{},[450,729,730],{},"0",[687,732,733],{},"logical Valkey database",[447,735,736],{},"The config opens connections in two directions, and both libraries are configured from the same single source:",[738,739,740,751],"ul",{},[741,742,743,746,747,750],"li",{},[450,744,745],{},"cfg.ValkeyConnOpt()"," → ",[450,748,749],{},"asynq.RedisClientOpt"," (asynq client, server, scheduler),",[741,752,753,746,756,759],{},[450,754,755],{},"cfg.ValkeyOptions()",[450,757,758],{},"*redis.Options"," (direct go-redis calls, e.g. the scheduler's lease).",[447,761,762,763,769,770,773],{},"The ",[458,764,766,767],{"href":765},"\u002Fen\u002Fkit\u002Fworker#configuration","worker's ",[450,768,646],{}," already embeds it under the ",[450,771,772],{},"VALKEY_"," prefix. In a generated project there is nothing extra to wire.",[544,775,777],{"id":776},"client","Client",[483,779,781],{"className":485,"code":780,"language":487,"meta":488,"style":488},"client, err := queue.NewClient(ctx, cfg.Valkey)   \u002F\u002F or queue.MustNewClient in main()\ndefer client.Close()\n\ninfo, err := client.Enqueue(ctx, task, queue.OnQueue(\"mail\"))\n",[450,782,783,827,843,849],{"__ignoreMap":488},[492,784,785,787,790,793,796,799,801,805,808,811,813,816,818,821,824],{"class":494,"line":495},[492,786,776],{"class":637},[492,788,789],{"class":502},",",[492,791,792],{"class":637}," err ",[492,794,795],{"class":502},":=",[492,797,798],{"class":637}," queue",[492,800,643],{"class":502},[492,802,804],{"class":803},"s2Zo4","NewClient",[492,806,807],{"class":502},"(",[492,809,810],{"class":637},"ctx",[492,812,789],{"class":502},[492,814,815],{"class":637}," cfg",[492,817,643],{"class":502},[492,819,820],{"class":637},"Valkey",[492,822,823],{"class":502},")",[492,825,826],{"class":568},"   \u002F\u002F or queue.MustNewClient in main()\n",[492,828,829,832,835,837,840],{"class":494,"line":572},[492,830,831],{"class":498},"defer",[492,833,834],{"class":637}," client",[492,836,643],{"class":502},[492,838,839],{"class":803},"Close",[492,841,842],{"class":502},"()\n",[492,844,845],{"class":494,"line":658},[492,846,848],{"emptyLinePlaceholder":847},true,"\n",[492,850,852,855,857,859,861,863,865,868,870,872,874,877,879,881,883,886,888,891,893,895],{"class":494,"line":851},4,[492,853,854],{"class":637},"info",[492,856,789],{"class":502},[492,858,792],{"class":637},[492,860,795],{"class":502},[492,862,834],{"class":637},[492,864,643],{"class":502},[492,866,867],{"class":803},"Enqueue",[492,869,807],{"class":502},[492,871,810],{"class":637},[492,873,789],{"class":502},[492,875,876],{"class":637}," task",[492,878,789],{"class":502},[492,880,798],{"class":637},[492,882,643],{"class":502},[492,884,885],{"class":803},"OnQueue",[492,887,807],{"class":502},[492,889,890],{"class":502},"\"",[492,892,113],{"class":561},[492,894,890],{"class":502},[492,896,897],{"class":502},"))\n",[447,899,900,902,903,906,907,910,911,914,915,643],{},[450,901,804],{}," opens the Valkey connection and ",[529,904,905],{},"verifies it with a PING at construction",", the same convention as ",[450,908,909],{},"pg.NewPool",": a wrong address fails at startup, not at the first enqueue. ",[450,912,913],{},"MustNewClient"," is the panicking variant for ",[450,916,917],{},"main()",[447,919,920,923,924,926],{},[450,921,922],{},"Enqueue(ctx, *asynq.Task, opts...)"," submits the task to Valkey and returns an ",[450,925,538],{},". It adds two things on top of raw asynq:",[738,928,929,944],{},[741,930,931,934,935,938,939,943],{},[529,932,933],{},"A producer span",": every enqueue opens an OpenTelemetry span (",[450,936,937],{},"enqueue \u003Ctask-type>","), so handing work to the queue shows up in the trace (see ",[458,940,942],{"href":941},"\u002Fen\u002Fqueue\u002Ftasks#trace-propagation-across-the-queue","trace propagation"," on the next page).",[741,945,946,951,952,955,956,959],{},[529,947,948],{},[450,949,950],{},"queue.ErrDuplicate",": when a ",[450,953,954],{},"TaskID"," or ",[450,957,958],{},"Unique"," constraint means the task is already there, you get a single sentinel error instead of asynq's two distinct ones. Callers that rely on idempotent delivery (the outbox relay, the event fan-out) treat it as success:",[483,961,963],{"className":485,"code":962,"language":487,"meta":488,"style":488},"if _, err := client.Enqueue(ctx, task, queue.TaskID(id)); err != nil {\n    if errors.Is(err, queue.ErrDuplicate) {\n        return nil \u002F\u002F already enqueued, exactly what we wanted\n    }\n    return err\n}\n",[450,964,965,1019,1050,1060,1065,1074],{"__ignoreMap":488},[492,966,967,970,973,975,977,979,981,983,985,987,989,991,993,995,997,999,1001,1003,1006,1009,1011,1014,1017],{"class":494,"line":495},[492,968,969],{"class":498},"if",[492,971,972],{"class":637}," _",[492,974,789],{"class":502},[492,976,792],{"class":637},[492,978,795],{"class":502},[492,980,834],{"class":637},[492,982,643],{"class":502},[492,984,867],{"class":803},[492,986,807],{"class":502},[492,988,810],{"class":637},[492,990,789],{"class":502},[492,992,876],{"class":637},[492,994,789],{"class":502},[492,996,798],{"class":637},[492,998,643],{"class":502},[492,1000,954],{"class":803},[492,1002,807],{"class":502},[492,1004,1005],{"class":637},"id",[492,1007,1008],{"class":502},"));",[492,1010,792],{"class":637},[492,1012,1013],{"class":502},"!=",[492,1015,1016],{"class":502}," nil",[492,1018,632],{"class":502},[492,1020,1021,1024,1027,1029,1032,1034,1037,1039,1041,1043,1046,1048],{"class":494,"line":572},[492,1022,1023],{"class":498},"    if",[492,1025,1026],{"class":637}," errors",[492,1028,643],{"class":502},[492,1030,1031],{"class":803},"Is",[492,1033,807],{"class":502},[492,1035,1036],{"class":637},"err",[492,1038,789],{"class":502},[492,1040,798],{"class":637},[492,1042,643],{"class":502},[492,1044,1045],{"class":637},"ErrDuplicate",[492,1047,823],{"class":502},[492,1049,632],{"class":502},[492,1051,1052,1055,1057],{"class":494,"line":658},[492,1053,1054],{"class":498},"        return",[492,1056,1016],{"class":502},[492,1058,1059],{"class":568}," \u002F\u002F already enqueued, exactly what we wanted\n",[492,1061,1062],{"class":494,"line":851},[492,1063,1064],{"class":502},"    }\n",[492,1066,1068,1071],{"class":494,"line":1067},5,[492,1069,1070],{"class":498},"    return",[492,1072,1073],{"class":637}," err\n",[492,1075,1077],{"class":494,"line":1076},6,[492,1078,661],{"class":502},[447,1080,1081,1084,1085,1087,1088,1090,1091,460,1093,460,1096,1098,1099,1102],{},[450,1082,1083],{},"Close()"," closes the shared Valkey connection (the asynq client is built from it and doesn't own it). The ",[458,1086,470],{"href":263}," does this for you as part of its shutdown order. The rest of ",[450,1089,867],{},"'s options (",[450,1092,885],{},[450,1094,1095],{},"MaxRetry",[450,1097,958],{},", ...) are covered on the ",[458,1100,57],{"href":1101},"\u002Fen\u002Fqueue\u002Ftasks#enqueue-options"," page, alongside the envelope and task-type naming that build on this client.",[544,1104,1106],{"id":1105},"standalone-example","Standalone example",[447,1108,1109,1111],{},[450,1110,46],{}," needs nothing from the kit: a client, a task, and a minimal asynq server are enough to see work flow end to end.",[483,1113,1116],{"className":485,"code":1114,"filename":1115,"language":487,"meta":488,"style":488},"package main\n\nimport (\n    \"context\"\n    \"log\"\n\n    \"github.com\u002Fgp-system\u002Fqueue\"\n    \"github.com\u002Fhibiken\u002Fasynq\"\n)\n\nfunc main() {\n    ctx := context.Background()\n    cfg := queue.Config{Addr: \"localhost:6379\"}\n\n    client := queue.MustNewClient(ctx, cfg)\n    defer client.Close()\n\n    task := asynq.NewTask(\"email:welcome\", []byte(`{\"user_id\":\"u_1\"}`))\n    if _, err := client.Enqueue(ctx, task, queue.OnQueue(\"mail\")); err != nil {\n        log.Fatal(err)\n    }\n\n    srv := asynq.NewServer(cfg.ValkeyConnOpt(), asynq.Config{Concurrency: 5})\n    mux := asynq.NewServeMux()\n    mux.HandleFunc(\"email:welcome\", func(ctx context.Context, t *asynq.Task) error {\n        log.Printf(\"sending welcome email: %s\", t.Payload())\n        return nil\n    })\n    if err := srv.Run(mux); err != nil {\n        log.Fatal(err)\n    }\n}\n","main.go",[450,1117,1118,1126,1130,1137,1147,1156,1160,1169,1179,1185,1190,1204,1222,1253,1258,1282,1296,1301,1347,1400,1417,1422,1427,1475,1492,1548,1583,1591,1597,1630,1645,1650],{"__ignoreMap":488},[492,1119,1120,1123],{"class":494,"line":495},[492,1121,1122],{"class":502},"package",[492,1124,1125],{"class":506}," main\n",[492,1127,1128],{"class":494,"line":572},[492,1129,848],{"emptyLinePlaceholder":847},[492,1131,1132,1134],{"class":494,"line":658},[492,1133,499],{"class":498},[492,1135,1136],{"class":502}," (\n",[492,1138,1139,1142,1145],{"class":494,"line":851},[492,1140,1141],{"class":502},"    \"",[492,1143,1144],{"class":506},"context",[492,1146,509],{"class":502},[492,1148,1149,1151,1154],{"class":494,"line":1067},[492,1150,1141],{"class":502},[492,1152,1153],{"class":506},"log",[492,1155,509],{"class":502},[492,1157,1158],{"class":494,"line":1076},[492,1159,848],{"emptyLinePlaceholder":847},[492,1161,1163,1165,1167],{"class":494,"line":1162},7,[492,1164,1141],{"class":502},[492,1166,455],{"class":506},[492,1168,509],{"class":502},[492,1170,1172,1174,1177],{"class":494,"line":1171},8,[492,1173,1141],{"class":502},[492,1175,1176],{"class":506},"github.com\u002Fhibiken\u002Fasynq",[492,1178,509],{"class":502},[492,1180,1182],{"class":494,"line":1181},9,[492,1183,1184],{"class":502},")\n",[492,1186,1188],{"class":494,"line":1187},10,[492,1189,848],{"emptyLinePlaceholder":847},[492,1191,1193,1196,1199,1202],{"class":494,"line":1192},11,[492,1194,1195],{"class":502},"func",[492,1197,1198],{"class":803}," main",[492,1200,1201],{"class":502},"()",[492,1203,632],{"class":502},[492,1205,1207,1210,1212,1215,1217,1220],{"class":494,"line":1206},12,[492,1208,1209],{"class":637},"    ctx ",[492,1211,795],{"class":502},[492,1213,1214],{"class":637}," context",[492,1216,643],{"class":502},[492,1218,1219],{"class":803},"Background",[492,1221,842],{"class":502},[492,1223,1225,1228,1230,1232,1234,1236,1239,1242,1245,1247,1249,1251],{"class":494,"line":1224},13,[492,1226,1227],{"class":637},"    cfg ",[492,1229,795],{"class":502},[492,1231,798],{"class":506},[492,1233,643],{"class":502},[492,1235,646],{"class":506},[492,1237,1238],{"class":502},"{",[492,1240,1241],{"class":637},"Addr",[492,1243,1244],{"class":502},":",[492,1246,503],{"class":502},[492,1248,696],{"class":561},[492,1250,890],{"class":502},[492,1252,661],{"class":502},[492,1254,1256],{"class":494,"line":1255},14,[492,1257,848],{"emptyLinePlaceholder":847},[492,1259,1261,1264,1266,1268,1270,1272,1274,1276,1278,1280],{"class":494,"line":1260},15,[492,1262,1263],{"class":637},"    client ",[492,1265,795],{"class":502},[492,1267,798],{"class":637},[492,1269,643],{"class":502},[492,1271,913],{"class":803},[492,1273,807],{"class":502},[492,1275,810],{"class":637},[492,1277,789],{"class":502},[492,1279,815],{"class":637},[492,1281,1184],{"class":502},[492,1283,1285,1288,1290,1292,1294],{"class":494,"line":1284},16,[492,1286,1287],{"class":498},"    defer",[492,1289,834],{"class":637},[492,1291,643],{"class":502},[492,1293,839],{"class":803},[492,1295,842],{"class":502},[492,1297,1299],{"class":494,"line":1298},17,[492,1300,848],{"emptyLinePlaceholder":847},[492,1302,1304,1307,1309,1312,1314,1317,1319,1321,1324,1326,1328,1331,1335,1337,1340,1343,1345],{"class":494,"line":1303},18,[492,1305,1306],{"class":637},"    task ",[492,1308,795],{"class":502},[492,1310,1311],{"class":637}," asynq",[492,1313,643],{"class":502},[492,1315,1316],{"class":803},"NewTask",[492,1318,807],{"class":502},[492,1320,890],{"class":502},[492,1322,1323],{"class":561},"email:welcome",[492,1325,890],{"class":502},[492,1327,789],{"class":502},[492,1329,1330],{"class":502}," []",[492,1332,1334],{"class":1333},"spNyl","byte",[492,1336,807],{"class":502},[492,1338,1339],{"class":502},"`",[492,1341,1342],{"class":561},"{\"user_id\":\"u_1\"}",[492,1344,1339],{"class":502},[492,1346,897],{"class":502},[492,1348,1350,1352,1354,1356,1358,1360,1362,1364,1366,1368,1370,1372,1374,1376,1378,1380,1382,1384,1386,1388,1390,1392,1394,1396,1398],{"class":494,"line":1349},19,[492,1351,1023],{"class":498},[492,1353,972],{"class":637},[492,1355,789],{"class":502},[492,1357,792],{"class":637},[492,1359,795],{"class":502},[492,1361,834],{"class":637},[492,1363,643],{"class":502},[492,1365,867],{"class":803},[492,1367,807],{"class":502},[492,1369,810],{"class":637},[492,1371,789],{"class":502},[492,1373,876],{"class":637},[492,1375,789],{"class":502},[492,1377,798],{"class":637},[492,1379,643],{"class":502},[492,1381,885],{"class":803},[492,1383,807],{"class":502},[492,1385,890],{"class":502},[492,1387,113],{"class":561},[492,1389,890],{"class":502},[492,1391,1008],{"class":502},[492,1393,792],{"class":637},[492,1395,1013],{"class":502},[492,1397,1016],{"class":502},[492,1399,632],{"class":502},[492,1401,1403,1406,1408,1411,1413,1415],{"class":494,"line":1402},20,[492,1404,1405],{"class":637},"        log",[492,1407,643],{"class":502},[492,1409,1410],{"class":803},"Fatal",[492,1412,807],{"class":502},[492,1414,1036],{"class":637},[492,1416,1184],{"class":502},[492,1418,1420],{"class":494,"line":1419},21,[492,1421,1064],{"class":502},[492,1423,1425],{"class":494,"line":1424},22,[492,1426,848],{"emptyLinePlaceholder":847},[492,1428,1430,1433,1435,1437,1439,1442,1444,1447,1449,1452,1455,1457,1459,1461,1463,1466,1468,1472],{"class":494,"line":1429},23,[492,1431,1432],{"class":637},"    srv ",[492,1434,795],{"class":502},[492,1436,1311],{"class":637},[492,1438,643],{"class":502},[492,1440,1441],{"class":803},"NewServer",[492,1443,807],{"class":502},[492,1445,1446],{"class":637},"cfg",[492,1448,643],{"class":502},[492,1450,1451],{"class":803},"ValkeyConnOpt",[492,1453,1454],{"class":502},"(),",[492,1456,1311],{"class":506},[492,1458,643],{"class":502},[492,1460,646],{"class":506},[492,1462,1238],{"class":502},[492,1464,1465],{"class":637},"Concurrency",[492,1467,1244],{"class":502},[492,1469,1471],{"class":1470},"sbssI"," 5",[492,1473,1474],{"class":502},"})\n",[492,1476,1478,1481,1483,1485,1487,1490],{"class":494,"line":1477},24,[492,1479,1480],{"class":637},"    mux ",[492,1482,795],{"class":502},[492,1484,1311],{"class":637},[492,1486,643],{"class":502},[492,1488,1489],{"class":803},"NewServeMux",[492,1491,842],{"class":502},[492,1493,1495,1498,1500,1503,1505,1507,1509,1511,1513,1516,1519,1521,1523,1526,1528,1531,1534,1536,1538,1541,1543,1546],{"class":494,"line":1494},25,[492,1496,1497],{"class":637},"    mux",[492,1499,643],{"class":502},[492,1501,1502],{"class":803},"HandleFunc",[492,1504,807],{"class":502},[492,1506,890],{"class":502},[492,1508,1323],{"class":561},[492,1510,890],{"class":502},[492,1512,789],{"class":502},[492,1514,1515],{"class":502}," func(",[492,1517,810],{"class":1518},"sHdIc",[492,1520,1214],{"class":506},[492,1522,643],{"class":502},[492,1524,1525],{"class":506},"Context",[492,1527,789],{"class":502},[492,1529,1530],{"class":1518}," t",[492,1532,1533],{"class":502}," *",[492,1535,477],{"class":506},[492,1537,643],{"class":502},[492,1539,1540],{"class":506},"Task",[492,1542,823],{"class":502},[492,1544,1545],{"class":1333}," error",[492,1547,632],{"class":502},[492,1549,1551,1553,1555,1558,1560,1562,1565,1569,1571,1573,1575,1577,1580],{"class":494,"line":1550},26,[492,1552,1405],{"class":637},[492,1554,643],{"class":502},[492,1556,1557],{"class":803},"Printf",[492,1559,807],{"class":502},[492,1561,890],{"class":502},[492,1563,1564],{"class":561},"sending welcome email: ",[492,1566,1568],{"class":1567},"swJcz","%s",[492,1570,890],{"class":502},[492,1572,789],{"class":502},[492,1574,1530],{"class":637},[492,1576,643],{"class":502},[492,1578,1579],{"class":803},"Payload",[492,1581,1582],{"class":502},"())\n",[492,1584,1586,1588],{"class":494,"line":1585},27,[492,1587,1054],{"class":498},[492,1589,1590],{"class":502}," nil\n",[492,1592,1594],{"class":494,"line":1593},28,[492,1595,1596],{"class":502},"    })\n",[492,1598,1600,1602,1604,1606,1609,1611,1614,1616,1619,1622,1624,1626,1628],{"class":494,"line":1599},29,[492,1601,1023],{"class":498},[492,1603,792],{"class":637},[492,1605,795],{"class":502},[492,1607,1608],{"class":637}," srv",[492,1610,643],{"class":502},[492,1612,1613],{"class":803},"Run",[492,1615,807],{"class":502},[492,1617,1618],{"class":637},"mux",[492,1620,1621],{"class":502},");",[492,1623,792],{"class":637},[492,1625,1013],{"class":502},[492,1627,1016],{"class":502},[492,1629,632],{"class":502},[492,1631,1633,1635,1637,1639,1641,1643],{"class":494,"line":1632},30,[492,1634,1405],{"class":637},[492,1636,643],{"class":502},[492,1638,1410],{"class":803},[492,1640,807],{"class":502},[492,1642,1036],{"class":637},[492,1644,1184],{"class":502},[492,1646,1648],{"class":494,"line":1647},31,[492,1649,1064],{"class":502},[492,1651,1653],{"class":494,"line":1652},32,[492,1654,661],{"class":502},[544,1656,1658],{"id":1657},"where-to-next","Where to next",[738,1660,1661],{},[741,1662,1663,1665,1666,1668,1669,1672,1673,1675,1676,1678],{},[458,1664,57],{"href":58},": the rest of ",[450,1667,867],{},"'s options, the ",[450,1670,1671],{},"Envelope"," wire format, OTel trace propagation, and the task-type naming conventions the ",[458,1674,61],{"href":68}," module and the kit's ",[458,1677,470],{"href":263}," build on.",[1680,1681,1682],"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 .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}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":488,"searchDepth":572,"depth":572,"links":1684},[1685,1686,1687,1688,1689],{"id":546,"depth":572,"text":547},{"id":607,"depth":572,"text":204},{"id":776,"depth":572,"text":777},{"id":1105,"depth":572,"text":1106},{"id":1657,"depth":572,"text":1658},"The asynq + Valkey foundation: connection config, client and task enqueueing, that the whole async category builds on.","md",null,{},{"icon":55},{"title":52,"description":1690},"EKDCGGGCN-w2pCxnfqwafV42iwrSIgBpMUrkLbXY_9Q",[1698,1700],{"title":40,"path":41,"stem":42,"description":1699,"icon":43,"children":-1},"A single worked example project, every code sample in the docs builds on it.",{"title":57,"path":58,"stem":59,"description":1701,"icon":47,"children":-1},"Enqueue options, the event envelope, OTel trace propagation across the queue, and task-type naming conventions.",1785445881044]