[{"data":1,"prerenderedAt":2425},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fconfiguration\u002Fkafka-client-config":314,"\u002Fdocs\u002Fconfiguration\u002Fkafka-client-config-surround":2420},[4,38,86,149,176,219,257,273],{"title":5,"path":6,"stem":7,"children":8,"icon":37},"Getting Started","\u002Fdocs\u002Fgetting-started","1.docs\u002F1.getting-started\u002F1.index",[9,12,17,22,27,32],{"title":10,"path":6,"stem":7,"icon":11},"Getting started","i-lucide-flag",{"title":13,"path":14,"stem":15,"icon":16},"Modules overview","\u002Fdocs\u002Fgetting-started\u002Fmodules-overview","1.docs\u002F1.getting-started\u002F2.modules-overview","i-lucide-boxes",{"title":18,"path":19,"stem":20,"icon":21},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","1.docs\u002F1.getting-started\u002F3.installation","i-lucide-download",{"title":23,"path":24,"stem":25,"icon":26},"License configuration","\u002Fdocs\u002Fgetting-started\u002Flicense-configuration","1.docs\u002F1.getting-started\u002F4.license-configuration","i-lucide-key-round",{"title":28,"path":29,"stem":30,"icon":31},"Your first app","\u002Fdocs\u002Fgetting-started\u002Ffirst-app","1.docs\u002F1.getting-started\u002F5.first-app","i-lucide-square-play",{"title":33,"path":34,"stem":35,"icon":36},"Project setup","\u002Fdocs\u002Fgetting-started\u002Fproject-setup","1.docs\u002F1.getting-started\u002F6.project-setup","i-lucide-package",false,{"title":39,"path":40,"stem":41,"children":42,"icon":45},"Core Concepts","\u002Fdocs\u002Fconcepts","1.docs\u002F2.concepts\u002F1.index",[43,46,51,56,61,66,71,76,81],{"title":44,"path":40,"stem":41,"icon":45},"Core concepts","i-lucide-book-open",{"title":47,"path":48,"stem":49,"icon":50},"Architecture","\u002Fdocs\u002Fconcepts\u002Farchitecture","1.docs\u002F2.concepts\u002F2.architecture","i-lucide-layers",{"title":52,"path":53,"stem":54,"icon":55},"Exactly-once semantics","\u002Fdocs\u002Fconcepts\u002Fexactly-once","1.docs\u002F2.concepts\u002F3.exactly-once","i-lucide-shield-check",{"title":57,"path":58,"stem":59,"icon":60},"Lanes and parallelism","\u002Fdocs\u002Fconcepts\u002Flanes-and-parallelism","1.docs\u002F2.concepts\u002F4.lanes-and-parallelism","i-lucide-split",{"title":62,"path":63,"stem":64,"icon":65},"State and thread-safety","\u002Fdocs\u002Fconcepts\u002Fstate-and-thread-safety","1.docs\u002F2.concepts\u002F5.state-and-thread-safety","i-lucide-lock",{"title":67,"path":68,"stem":69,"icon":70},"Event time and watermarks","\u002Fdocs\u002Fconcepts\u002Fevent-time-and-watermarks","1.docs\u002F2.concepts\u002F6.event-time-and-watermarks","i-lucide-clock",{"title":72,"path":73,"stem":74,"icon":75},"The configuration model","\u002Fdocs\u002Fconcepts\u002Fconfiguration-model","1.docs\u002F2.concepts\u002F7.configuration-model","i-lucide-sliders-horizontal",{"title":77,"path":78,"stem":79,"icon":80},"The error-handling model","\u002Fdocs\u002Fconcepts\u002Ferror-handling-model","1.docs\u002F2.concepts\u002F8.error-handling-model","i-lucide-triangle-alert",{"title":82,"path":83,"stem":84,"icon":85},"How StoatFlow differs from Kafka Streams","\u002Fdocs\u002Fconcepts\u002Fhow-stoatflow-differs-from-ks","1.docs\u002F2.concepts\u002F9.how-stoatflow-differs-from-ks","i-lucide-arrow-left-right",{"title":87,"path":88,"stem":89,"children":90,"icon":93},"Building Topologies","\u002Fdocs\u002Fbuilding","1.docs\u002F3.building\u002F1.index",[91,94,99,104,109,114,119,124,129,134,139,144],{"title":92,"path":88,"stem":89,"icon":93},"Building topologies","i-lucide-blocks",{"title":95,"path":96,"stem":97,"icon":98},"Error handling and DLQ","\u002Fdocs\u002Fbuilding\u002Ferror-handling-dlq","1.docs\u002F3.building\u002F10.error-handling-dlq","i-lucide-circle-x",{"title":100,"path":101,"stem":102,"icon":103},"State stores","\u002Fdocs\u002Fbuilding\u002Fstate-stores","1.docs\u002F3.building\u002F11.state-stores","i-lucide-database",{"title":105,"path":106,"stem":107,"icon":108},"Testing topologies","\u002Fdocs\u002Fbuilding\u002Ftesting","1.docs\u002F3.building\u002F12.testing","i-lucide-flask-conical",{"title":110,"path":111,"stem":112,"icon":113},"Sources and sinks","\u002Fdocs\u002Fbuilding\u002Fstreams-builder","1.docs\u002F3.building\u002F2.streams-builder","i-lucide-import",{"title":115,"path":116,"stem":117,"icon":118},"KStream and KTable operations","\u002Fdocs\u002Fbuilding\u002Fkstream-ktable","1.docs\u002F3.building\u002F3.kstream-ktable","i-lucide-waypoints",{"title":120,"path":121,"stem":122,"icon":123},"Aggregations","\u002Fdocs\u002Fbuilding\u002Faggregations","1.docs\u002F3.building\u002F4.aggregations","i-lucide-sigma",{"title":125,"path":126,"stem":127,"icon":128},"Windowing","\u002Fdocs\u002Fbuilding\u002Fwindowing","1.docs\u002F3.building\u002F5.windowing","i-lucide-calendar-clock",{"title":130,"path":131,"stem":132,"icon":133},"Joins","\u002Fdocs\u002Fbuilding\u002Fjoins","1.docs\u002F3.building\u002F6.joins","i-lucide-git-merge",{"title":135,"path":136,"stem":137,"icon":138},"The Processor API","\u002Fdocs\u002Fbuilding\u002Fprocessor-api","1.docs\u002F3.building\u002F7.processor-api","i-lucide-cpu",{"title":140,"path":141,"stem":142,"icon":143},"Scheduled sources","\u002Fdocs\u002Fbuilding\u002Fscheduled-sources","1.docs\u002F3.building\u002F8.scheduled-sources","i-lucide-timer",{"title":145,"path":146,"stem":147,"icon":148},"Serdes and Avro","\u002Fdocs\u002Fbuilding\u002Fserdes","1.docs\u002F3.building\u002F9.serdes","i-lucide-binary",{"title":150,"path":151,"stem":152,"children":153,"icon":75},"Configuration","\u002Fdocs\u002Fconfiguration","1.docs\u002F4.configuration\u002F1.index",[154,156,161,166,171],{"title":155,"path":151,"stem":152,"icon":75},"How configuration works",{"title":157,"path":158,"stem":159,"icon":160},"Engine configuration (:core)","\u002Fdocs\u002Fconfiguration\u002Fcore-config","1.docs\u002F4.configuration\u002F2.core-config","i-lucide-settings-2",{"title":162,"path":163,"stem":164,"icon":165},"Runtime configuration (:runtime)","\u002Fdocs\u002Fconfiguration\u002Fruntime-config","1.docs\u002F4.configuration\u002F3.runtime-config","i-lucide-server-cog",{"title":167,"path":168,"stem":169,"icon":170},"Defaults, adaptivity, and presets","\u002Fdocs\u002Fconfiguration\u002Fdefaults-and-presets","1.docs\u002F4.configuration\u002F4.defaults-and-presets","i-lucide-gauge",{"title":172,"path":173,"stem":174,"icon":175},"Kafka client configuration","\u002Fdocs\u002Fconfiguration\u002Fkafka-client-config","1.docs\u002F4.configuration\u002F5.kafka-client-config","i-lucide-plug",{"title":177,"path":178,"stem":179,"children":180,"icon":183},"Running in Production","\u002Fdocs\u002Fruntime","1.docs\u002F5.runtime\u002F1.index",[181,184,189,194,199,204,209,214],{"title":182,"path":178,"stem":179,"icon":183},"The runtime","i-lucide-server",{"title":185,"path":186,"stem":187,"icon":188},"The REST API","\u002Fdocs\u002Fruntime\u002Frest-api","1.docs\u002F5.runtime\u002F2.rest-api","i-lucide-globe",{"title":190,"path":191,"stem":192,"icon":193},"Health checks","\u002Fdocs\u002Fruntime\u002Fhealth-checks","1.docs\u002F5.runtime\u002F3.health-checks","i-lucide-heart-pulse",{"title":195,"path":196,"stem":197,"icon":198},"Metrics","\u002Fdocs\u002Fruntime\u002Fmetrics","1.docs\u002F5.runtime\u002F4.metrics","i-lucide-activity",{"title":200,"path":201,"stem":202,"icon":203},"Pause and resume","\u002Fdocs\u002Fruntime\u002Fpause-unpause","1.docs\u002F5.runtime\u002F5.pause-unpause","i-lucide-pause",{"title":205,"path":206,"stem":207,"icon":208},"Plugins and lifecycle hooks","\u002Fdocs\u002Fruntime\u002Fplugins","1.docs\u002F5.runtime\u002F6.plugins","i-lucide-puzzle",{"title":210,"path":211,"stem":212,"icon":213},"Docker images","\u002Fdocs\u002Fruntime\u002Fdocker","1.docs\u002F5.runtime\u002F7.docker","i-lucide-container",{"title":215,"path":216,"stem":217,"icon":218},"GraalVM native image","\u002Fdocs\u002Fruntime\u002Fnative-image","1.docs\u002F5.runtime\u002F8.native-image","i-lucide-zap",{"title":220,"path":221,"stem":222,"children":223,"icon":226},"Deploying & Operating","\u002Fdocs\u002Foperating","1.docs\u002F6.operating\u002F1.index",[224,227,232,237,242,247,252],{"title":225,"path":221,"stem":222,"icon":226},"Deploying and operating","i-lucide-life-buoy",{"title":228,"path":229,"stem":230,"icon":231},"Running on Kubernetes","\u002Fdocs\u002Foperating\u002Fkubernetes","1.docs\u002F6.operating\u002F2.kubernetes","i-lucide-ship",{"title":233,"path":234,"stem":235,"icon":236},"High availability","\u002Fdocs\u002Foperating\u002Fhigh-availability","1.docs\u002F6.operating\u002F3.high-availability","i-lucide-copy",{"title":238,"path":239,"stem":240,"icon":241},"Liveness and readiness probes","\u002Fdocs\u002Foperating\u002Fprobes","1.docs\u002F6.operating\u002F4.probes","i-lucide-stethoscope",{"title":243,"path":244,"stem":245,"icon":246},"Observability","\u002Fdocs\u002Foperating\u002Fobservability","1.docs\u002F6.operating\u002F5.observability","i-lucide-telescope",{"title":248,"path":249,"stem":250,"icon":251},"Tuning under load","\u002Fdocs\u002Foperating\u002Ftuning","1.docs\u002F6.operating\u002F6.tuning","i-lucide-sliders",{"title":253,"path":254,"stem":255,"icon":256},"Production checklist","\u002Fdocs\u002Foperating\u002Fproduction-checklist","1.docs\u002F6.operating\u002F7.production-checklist","i-lucide-clipboard-check",{"title":258,"path":259,"stem":260,"children":261,"icon":85},"Migrating from Kafka Streams","\u002Fdocs\u002Fmigration","1.docs\u002F7.migration\u002F1.index",[262,263,268],{"title":258,"path":259,"stem":260,"icon":85},{"title":264,"path":265,"stem":266,"icon":267},"Migration without carrying state","\u002Fdocs\u002Fmigration\u002Fwithout-data-migration","1.docs\u002F7.migration\u002F2.without-data-migration","i-lucide-sparkles",{"title":269,"path":270,"stem":271,"icon":272},"Migration carrying state","\u002Fdocs\u002Fmigration\u002Fwith-data-migration","1.docs\u002F7.migration\u002F3.with-data-migration","i-lucide-database-backup",{"title":274,"path":275,"stem":276,"children":277,"icon":279},"Reference","\u002Fdocs\u002Freference","1.docs\u002F8.reference\u002F1.index",[278,280,285,290,295,300,305,309],{"title":274,"path":275,"stem":276,"icon":279},"i-lucide-list",{"title":281,"path":282,"stem":283,"icon":284},"Configuration reference","\u002Fdocs\u002Freference\u002Fconfiguration-reference","1.docs\u002F8.reference\u002F2.configuration-reference","i-lucide-table",{"title":286,"path":287,"stem":288,"icon":289},"REST API reference","\u002Fdocs\u002Freference\u002Frest-api-reference","1.docs\u002F8.reference\u002F3.rest-api-reference","i-lucide-network",{"title":291,"path":292,"stem":293,"icon":294},"Gradle plugin reference","\u002Fdocs\u002Freference\u002Fgradle-plugin-reference","1.docs\u002F8.reference\u002F4.gradle-plugin-reference","i-lucide-box",{"title":296,"path":297,"stem":298,"icon":299},"Maven reference","\u002Fdocs\u002Freference\u002Fmaven-reference","1.docs\u002F8.reference\u002F5.maven-reference","i-simple-icons-apachemaven",{"title":301,"path":302,"stem":303,"icon":304},"Kafka Streams compatibility matrix","\u002Fdocs\u002Freference\u002Fks-compatibility-matrix","1.docs\u002F8.reference\u002F6.ks-compatibility-matrix","i-lucide-table-2",{"title":306,"path":307,"stem":308,"icon":170},"Metrics reference","\u002Fdocs\u002Freference\u002Fmetrics-reference","1.docs\u002F8.reference\u002F7.metrics-reference",{"title":310,"path":311,"stem":312,"icon":313},"Glossary","\u002Fdocs\u002Freference\u002Fglossary","1.docs\u002F8.reference\u002F8.glossary","i-lucide-book-a",{"id":315,"title":172,"body":316,"description":2413,"extension":2414,"meta":2415,"navigation":2416,"pageType":2417,"path":173,"seo":2418,"stem":174,"__hash__":2419},"docs\u002F1.docs\u002F4.configuration\u002F5.kafka-client-config.md",{"type":317,"value":318,"toc":2387},"minimark",[319,332,391,396,405,535,538,560,571,575,578,646,650,742,745,751,820,842,860,864,867,915,918,1058,1080,1083,1153,1162,1167,1177,1259,1293,1297,1310,1371,1374,1377,1434,1437,1523,1526,1572,1576,1580,1583,1682,1686,1689,1766,1770,1773,1852,1856,1859,1944,1948,1951,1994,1998,2001,2053,2057,2064,2160,2173,2177,2180,2312,2335,2338,2348,2354,2383],[320,321,322,323,327,328,331],"p",{},"StoatFlow constructs its own Kafka consumer, producer, and restoration consumers. You configure those clients by passing standard Kafka client properties through your ",[324,325,326],"code",{},"application.yaml"," under ",[324,329,330],{},"stoatflow.kafka.*",". This page covers the passthrough form, the opinionated defaults StoatFlow layers on top, and the small set of properties it forces for exactly-once correctness.",[333,334,335],"tldr-panel",{},[336,337,338,358,364],"ul",{},[339,340,341,345,346,349,350,353,354,357],"li",{},[342,343,344],"strong",{},"Passthrough:"," put any Kafka consumer \u002F producer property under ",[324,347,348],{},"stoatflow.kafka.consumer"," \u002F ",[324,351,352],{},"stoatflow.kafka.producer",". Restoration consumers tune separately under ",[324,355,356],{},"stoatflow.kafka.restoration-consumer",".",[339,359,360,363],{},[342,361,362],{},"Defaults:"," StoatFlow applies single-instance, high-throughput defaults (bigger fetches, bigger batches) over the Kafka defaults — all overridable.",[339,365,366,369,370,373,374,373,377,380,381,373,384,373,387,390],{},[342,367,368],{},"Forced:"," a few keys (",[324,371,372],{},"bootstrap.servers",", ",[324,375,376],{},"group.id",[324,378,379],{},"enable.auto.commit",", and the EOS producer keys like ",[324,382,383],{},"transactional.id",[324,385,386],{},"enable.idempotence",[324,388,389],{},"acks",") are set by the framework and cannot be overridden.",[392,393,395],"h2",{"id":394},"passthrough-form","Passthrough form",[320,397,398,399,401,402,404],{},"Every property you set under ",[324,400,348],{}," or ",[324,403,352],{}," is passed straight to the corresponding Kafka client, using the exact Kafka property names (dotted keys):",[406,407,412],"pre",{"className":408,"code":409,"language":410,"meta":411,"style":411},"language-yaml shiki shiki-themes vitesse-light","stoatflow:\n  bootstrap-servers: localhost:9092\n  kafka:\n    consumer:\n      max.poll.records: 1000\n      auto.offset.reset: latest   # StoatFlow defaults this to earliest; override to latest here\n      fetch.min.bytes: 65536\n    producer:\n      batch.size: 524288\n      linger.ms: 50\n      compression.type: lz4\n","yaml","",[324,413,414,427,440,448,456,468,483,494,502,513,524],{"__ignoreMap":411},[415,416,419,423],"span",{"class":417,"line":418},"line",1,[415,420,422],{"class":421},"su6XF","stoatflow",[415,424,426],{"class":425},"sYZai",":\n",[415,428,430,433,436],{"class":417,"line":429},2,[415,431,432],{"class":421},"  bootstrap-servers",[415,434,435],{"class":425},":",[415,437,439],{"class":438},"spphp"," localhost:9092\n",[415,441,443,446],{"class":417,"line":442},3,[415,444,445],{"class":421},"  kafka",[415,447,426],{"class":425},[415,449,451,454],{"class":417,"line":450},4,[415,452,453],{"class":421},"    consumer",[415,455,426],{"class":425},[415,457,459,462,464],{"class":417,"line":458},5,[415,460,461],{"class":421},"      max.poll.records",[415,463,435],{"class":425},[415,465,467],{"class":466},"s-TwI"," 1000\n",[415,469,471,474,476,479],{"class":417,"line":470},6,[415,472,473],{"class":421},"      auto.offset.reset",[415,475,435],{"class":425},[415,477,478],{"class":438}," latest",[415,480,482],{"class":481},"s8zF2","   # StoatFlow defaults this to earliest; override to latest here\n",[415,484,486,489,491],{"class":417,"line":485},7,[415,487,488],{"class":421},"      fetch.min.bytes",[415,490,435],{"class":425},[415,492,493],{"class":466}," 65536\n",[415,495,497,500],{"class":417,"line":496},8,[415,498,499],{"class":421},"    producer",[415,501,426],{"class":425},[415,503,505,508,510],{"class":417,"line":504},9,[415,506,507],{"class":421},"      batch.size",[415,509,435],{"class":425},[415,511,512],{"class":466}," 524288\n",[415,514,516,519,521],{"class":417,"line":515},10,[415,517,518],{"class":421},"      linger.ms",[415,520,435],{"class":425},[415,522,523],{"class":466}," 50\n",[415,525,527,530,532],{"class":417,"line":526},11,[415,528,529],{"class":421},"      compression.type",[415,531,435],{"class":425},[415,533,534],{"class":438}," lz4\n",[320,536,537],{},"You don't need to list every property — only the ones you want to change. Anything you omit falls back to StoatFlow's framework default, and anything StoatFlow doesn't set falls back to the Kafka client default.",[539,540,543],"callout",{"color":541,"icon":542},"info","i-lucide-info",[320,544,545,546,553,554,559],{},"These are standard Kafka client properties. Use the names from the ",[547,548,552],"a",{"href":549,"rel":550},"https:\u002F\u002Fkafka.apache.org\u002Fdocumentation\u002F#consumerconfigs",[551],"nofollow","Apache Kafka consumer"," and ",[547,555,558],{"href":556,"rel":557},"https:\u002F\u002Fkafka.apache.org\u002Fdocumentation\u002F#producerconfigs",[551],"producer"," configuration reference verbatim. StoatFlow does not rename or alias them.",[320,561,562,563,566,567,570],{},"For where these keys sit in the wider configuration tree (and how YAML, environment variables, and system properties compose), see the ",[547,564,565],{"href":73},"configuration model"," and the ",[547,568,569],{"href":158},"core configuration"," reference.",[392,572,574],{"id":573},"how-consumer-properties-resolve","How consumer properties resolve",[320,576,577],{},"Consumer properties are resolved by merging layers, each overwriting the previous:",[579,580,581,597],"table",{},[582,583,584],"thead",{},[585,586,587,591,594],"tr",{},[588,589,590],"th",{},"Layer",[588,592,593],{},"Source",[588,595,596],{},"Purpose",[598,599,600,612,623,635],"tbody",{},[585,601,602,606,609],{},[603,604,605],"td",{},"1",[603,607,608],{},"Kafka client defaults",[603,610,611],{},"Implicit defaults from the Kafka client library",[585,613,614,617,620],{},[603,615,616],{},"2",[603,618,619],{},"Framework defaults",[603,621,622],{},"StoatFlow's opinionated defaults (see below)",[585,624,625,628,632],{},[603,626,627],{},"3",[603,629,630],{},[324,631,348],{},[603,633,634],{},"Your overrides",[585,636,637,640,643],{},[603,638,639],{},"4",[603,641,642],{},"Forced overrides",[603,644,645],{},"Set by the framework, cannot be overridden",[647,648,619],"h3",{"id":649},"framework-defaults",[579,651,652,668],{},[582,653,654],{},[585,655,656,659,662,665],{},[588,657,658],{},"Property",[588,660,661],{},"StoatFlow default",[588,663,664],{},"Kafka default",[588,666,667],{},"Rationale",[598,669,670,685,699,715],{},[585,671,672,677,680,682],{},[603,673,674],{},[324,675,676],{},"max.poll.records",[603,678,679],{},"500",[603,681,679],{},[603,683,684],{},"Matches the Kafka default",[585,686,687,692,695,697],{},[603,688,689],{},[324,690,691],{},"fetch.max.bytes",[603,693,694],{},"50 MiB",[603,696,694],{},[603,698,684],{},[585,700,701,706,709,712],{},[603,702,703],{},[324,704,705],{},"max.partition.fetch.bytes",[603,707,708],{},"10 MiB",[603,710,711],{},"1 MiB",[603,713,714],{},"A single instance consumes all partitions; larger per-partition fetches reduce network round trips",[585,716,717,722,727,732],{},[603,718,719],{},[324,720,721],{},"auto.offset.reset",[603,723,724],{},[324,725,726],{},"earliest",[603,728,729],{},[324,730,731],{},"latest",[603,733,734,735,737,738,741],{},"Matches Kafka Streams (which also defaults its main consumer to ",[324,736,726],{},") — a fresh ",[324,739,740],{},"application.id"," processes the topic from the beginning. Overridable.",[647,743,642],{"id":744},"forced-overrides",[320,746,747,748,750],{},"These are always set by the framework. Setting them under ",[324,749,348],{}," has no effect.",[579,752,753,765],{},[582,754,755],{},[585,756,757,759,762],{},[588,758,658],{},[588,760,761],{},"Value",[588,763,764],{},"Reason",[598,766,767,782,794,806],{},[585,768,769,773,779],{},[603,770,771],{},[324,772,372],{},[603,774,775,776],{},"from ",[324,777,778],{},"stoatflow.bootstrap-servers",[603,780,781],{},"Must match the cluster",[585,783,784,788,791],{},[603,785,786],{},[324,787,376],{},[603,789,790],{},"the application ID",[603,792,793],{},"Static group membership for the single instance",[585,795,796,801,803],{},[603,797,798],{},[324,799,800],{},"group.instance.id",[603,802,790],{},[603,804,805],{},"Static membership (KIP-345) for instant partition re-assignment on restart",[585,807,808,812,817],{},[603,809,810],{},[324,811,379],{},[603,813,814],{},[324,815,816],{},"false",[603,818,819],{},"Offsets are committed by StoatFlow's commit protocol, not by the Kafka client",[320,821,822,824,825,827,828,830,831,834,835,837,838,841],{},[324,823,721],{}," defaults to ",[324,826,726],{}," (matching Kafka Streams) rather than the raw Kafka client's ",[324,829,731],{},". It is ",[342,832,833],{},"not"," forced — override it globally under ",[324,836,348],{},", or per source topic with ",[324,839,840],{},"Consumed.withOffsetResetPolicy(...)",", which seeks explicitly and takes precedence for that topic.",[320,843,844,845,848,849,851,852,855,856,859],{},"One exception: with ",[547,846,847],{"href":234},"hot-standby HA"," enabled, ",[324,850,800],{}," is ",[342,853,854],{},"omitted"," (and any user-set value removed) — HA pods use ",[324,857,858],{},"assign()"," with no consumer-group membership, so static membership does not apply.",[392,861,863],{"id":862},"how-producer-properties-resolve","How producer properties resolve",[320,865,866],{},"Producer properties resolve through the same layered merge:",[579,868,869,879],{},[582,870,871],{},[585,872,873,875,877],{},[588,874,590],{},[588,876,593],{},[588,878,596],{},[598,880,881,889,897,907],{},[585,882,883,885,887],{},[603,884,605],{},[603,886,608],{},[603,888,611],{},[585,890,891,893,895],{},[603,892,616],{},[603,894,619],{},[603,896,622],{},[585,898,899,901,905],{},[603,900,627],{},[603,902,903],{},[324,904,352],{},[603,906,634],{},[585,908,909,911,913],{},[603,910,639],{},[603,912,642],{},[603,914,645],{},[647,916,619],{"id":917},"framework-defaults-1",[579,919,920,932],{},[582,921,922],{},[585,923,924,926,928,930],{},[588,925,658],{},[588,927,661],{},[588,929,664],{},[588,931,667],{},[598,933,934,950,968,988,1004,1022,1040],{},[585,935,936,941,944,947],{},[603,937,938],{},[324,939,940],{},"batch.size",[603,942,943],{},"256 KiB",[603,945,946],{},"16 KiB",[603,948,949],{},"StoatFlow produces output across many keys at once; larger batches improve throughput",[585,951,952,957,960,963],{},[603,953,954],{},[324,955,956],{},"linger.ms",[603,958,959],{},"20",[603,961,962],{},"0",[603,964,965,966],{},"Wait up to 20 ms to fill batches — paired with the larger ",[324,967,940],{},[585,969,970,975,978,981],{},[603,971,972],{},[324,973,974],{},"retry.backoff.ms",[603,976,977],{},"50",[603,979,980],{},"100",[603,982,983,984,987],{},"Halves the per-retry wait on the transaction coordinator's transient ",[324,985,986],{},"CONCURRENT_TRANSACTIONS"," response, shrinking the commit-latency tail at frequent commit cadences",[585,989,990,995,998,1001],{},[603,991,992],{},[324,993,994],{},"buffer.memory",[603,996,997],{},"256 MiB",[603,999,1000],{},"32 MiB",[603,1002,1003],{},"Headroom for the larger batches without producer-side backpressure",[585,1005,1006,1010,1015,1019],{},[603,1007,1008],{},[324,1009,386],{},[603,1011,1012],{},[324,1013,1014],{},"true",[603,1016,1017],{},[324,1018,1014],{},[603,1020,1021],{},"Explicit baseline locked to the StoatFlow version, insulating you from upstream default changes. Also forced in EOS mode (below).",[585,1023,1024,1028,1033,1037],{},[603,1025,1026],{},[324,1027,389],{},[603,1029,1030],{},[324,1031,1032],{},"all",[603,1034,1035],{},[324,1036,1032],{},[603,1038,1039],{},"Explicit baseline locked to the StoatFlow version. Also forced in EOS mode.",[585,1041,1042,1047,1052,1056],{},[603,1043,1044],{},[324,1045,1046],{},"max.in.flight.requests.per.connection",[603,1048,1049],{},[324,1050,1051],{},"5",[603,1053,1054],{},[324,1055,1051],{},[603,1057,1039],{},[539,1059,1060],{"color":541,"icon":542},[320,1061,1062,1065,1066,1068,1069,1071,1072,1076,1077,357],{},[342,1063,1064],{},"Memory note."," ",[324,1067,994],{}," (256 MiB) is producer-side buffering and is separate from RocksDB and state-store memory. On small-heap deployments (under ~2 GiB) with both heavy state writes and heavy sink output, consider reducing ",[324,1070,994],{}," — see the ",[547,1073,1075],{"href":1074},"#memory-constrained-environments","memory-constrained"," scenario below and the ",[547,1078,1079],{"href":249},"tuning guide",[647,1081,642],{"id":1082},"forced-overrides-1",[579,1084,1085,1095],{},[582,1086,1087],{},[585,1088,1089,1091,1093],{},[588,1090,658],{},[588,1092,761],{},[588,1094,764],{},[598,1096,1097,1109,1124,1141],{},[585,1098,1099,1103,1107],{},[603,1100,1101],{},[324,1102,372],{},[603,1104,775,1105],{},[324,1106,778],{},[603,1108,781],{},[585,1110,1111,1116,1121],{},[603,1112,1113],{},[324,1114,1115],{},"retries",[603,1117,1118],{},[324,1119,1120],{},"Integer.MAX_VALUE",[603,1122,1123],{},"Unlimited retries are required for idempotent \u002F transactional producer correctness",[585,1125,1126,1131,1134],{},[603,1127,1128],{},[324,1129,1130],{},"max.block.ms",[603,1132,1133],{},"the configured barrier timeout",[603,1135,1136,1137,1140],{},"Bounds how long a ",[324,1138,1139],{},"send()"," can block on a slow broker, so a broker slowdown surfaces as a timeout rather than a silent stall",[585,1142,1143,1148,1150],{},[603,1144,1145],{},[324,1146,1147],{},"delivery.timeout.ms",[603,1149,1133],{},[603,1151,1152],{},"Bounds the end-to-end delivery path on the same budget",[320,1154,1155,1156,1159,1160,570],{},"The barrier timeout is the ",[324,1157,1158],{},"stoatflow.commit-barrier.timeout-ms"," knob — see the ",[547,1161,569],{"href":158},[1163,1164,1166],"h4",{"id":1165},"exactly-once-mode-only","Exactly-once mode only",[320,1168,1169,1170,851,1173,1176],{},"When the ",[547,1171,1172],{"href":53},"processing guarantee",[324,1174,1175],{},"EXACTLY_ONCE",", StoatFlow additionally forces the transactional producer properties:",[579,1178,1179,1189],{},[582,1180,1181],{},[585,1182,1183,1185,1187],{},[588,1184,658],{},[588,1186,761],{},[588,1188,764],{},[598,1190,1191,1205,1217,1230,1246],{},[585,1192,1193,1197,1202],{},[603,1194,1195],{},[324,1196,383],{},[603,1198,1199],{},[324,1200,1201],{},"{applicationId}-producer",[603,1203,1204],{},"Transaction-coordination identity",[585,1206,1207,1212,1214],{},[603,1208,1209],{},[324,1210,1211],{},"transaction.timeout.ms",[603,1213,1133],{},[603,1215,1216],{},"Must align with the commit budget",[585,1218,1219,1223,1227],{},[603,1220,1221],{},[324,1222,386],{},[603,1224,1225],{},[324,1226,1014],{},[603,1228,1229],{},"Required for the transactional producer — disabling it breaks exactly-once",[585,1231,1232,1236,1240],{},[603,1233,1234],{},[324,1235,389],{},[603,1237,1238],{},[324,1239,1032],{},[603,1241,1242,1245],{},[324,1243,1244],{},"acks \u003C all"," weakens durability under broker failures, which is incompatible with the exactly-once guarantee",[585,1247,1248,1252,1256],{},[603,1249,1250],{},[324,1251,1046],{},[603,1253,1254],{},[324,1255,1051],{},[603,1257,1258],{},"The maximum that still preserves the idempotent producer's ordering guarantee",[320,1260,1261,1262,1265,1266,1269,1270,373,1272,1274,1275,1277,1278,1280,1281,1284,1285,1287,1288,1292],{},"In ",[342,1263,1264],{},"at-least-once"," mode (",[324,1267,1268],{},"AT_LEAST_ONCE","), ",[324,1271,386],{},[324,1273,389],{},", and ",[324,1276,1046],{}," stay at the framework-default layer and remain overridable via ",[324,1279,352],{},", so you can trade throughput against durability. In ",[342,1282,1283],{},"exactly-once"," mode they are forced: any value you set under ",[324,1286,352],{}," is overwritten by the framework's forced override, so the client never sees a configuration that would break exactly-once. To see what the producer actually receives, check the resolved configuration (see ",[547,1289,1291],{"href":1290},"#inspecting-the-resolved-configuration","Inspecting the resolved configuration"," below).",[392,1294,1296],{"id":1295},"restoration-consumer","Restoration consumer",[320,1298,1299,1300,1303,1304,1306,1307,1309],{},"State stores recover from changelog topics on startup using dedicated ",[342,1301,1302],{},"restoration consumers",", which are configured independently of the processing consumer under ",[324,1305,356],{},". They inherit the processing ",[324,1308,348],{}," as a shared baseline, then layer restoration-specific defaults and overrides on top:",[579,1311,1312,1322],{},[582,1313,1314],{},[585,1315,1316,1318,1320],{},[588,1317,590],{},[588,1319,593],{},[588,1321,596],{},[598,1323,1324,1332,1343,1352,1363],{},[585,1325,1326,1328,1330],{},[603,1327,605],{},[603,1329,608],{},[603,1331,611],{},[585,1333,1334,1336,1340],{},[603,1335,616],{},[603,1337,1338],{},[324,1339,348],{},[603,1341,1342],{},"Processing-consumer config — shared baseline inherited by restoration",[585,1344,1345,1347,1349],{},[603,1346,627],{},[603,1348,619],{},[603,1350,1351],{},"Restoration-specific defaults (see below)",[585,1353,1354,1356,1360],{},[603,1355,639],{},[603,1357,1358],{},[324,1359,356],{},[603,1361,1362],{},"Your restoration overrides",[585,1364,1365,1367,1369],{},[603,1366,1051],{},[603,1368,642],{},[603,1370,645],{},[647,1372,619],{"id":1373},"framework-defaults-2",[320,1375,1376],{},"Tuned for bulk changelog reads during recovery:",[579,1378,1379,1392],{},[582,1380,1381],{},[585,1382,1383,1385,1388,1390],{},[588,1384,658],{},[588,1386,1387],{},"Default",[588,1389,664],{},[588,1391,667],{},[598,1393,1394,1408,1421],{},[585,1395,1396,1400,1403,1405],{},[603,1397,1398],{},[324,1399,676],{},[603,1401,1402],{},"1,000",[603,1404,679],{},[603,1406,1407],{},"Larger batches reduce poll overhead during bulk reads",[585,1409,1410,1414,1416,1418],{},[603,1411,1412],{},[324,1413,691],{},[603,1415,694],{},[603,1417,694],{},[603,1419,1420],{},"Matches the Kafka default (already large)",[585,1422,1423,1427,1429,1431],{},[603,1424,1425],{},[324,1426,705],{},[603,1428,708],{},[603,1430,711],{},[603,1432,1433],{},"Faster per-partition fetches during restoration",[647,1435,642],{"id":1436},"forced-overrides-2",[579,1438,1439,1449],{},[582,1440,1441],{},[585,1442,1443,1445,1447],{},[588,1444,658],{},[588,1446,761],{},[588,1448,764],{},[598,1450,1451,1463,1477,1490,1503],{},[585,1452,1453,1457,1461],{},[603,1454,1455],{},[324,1456,372],{},[603,1458,775,1459],{},[324,1460,778],{},[603,1462,781],{},[585,1464,1465,1469,1474],{},[603,1466,1467],{},[324,1468,376],{},[603,1470,1471],{},[324,1472,1473],{},"{applicationId}-restoration-{timestamp}",[603,1475,1476],{},"Unique per restoration run",[585,1478,1479,1483,1487],{},[603,1480,1481],{},[324,1482,379],{},[603,1484,1485],{},[324,1486,816],{},[603,1488,1489],{},"Restoration offsets are tracked alongside the state, not by the Kafka client",[585,1491,1492,1496,1500],{},[603,1493,1494],{},[324,1495,721],{},[603,1497,1498],{},[324,1499,726],{},[603,1501,1502],{},"Restoration must read the changelog from the beginning",[585,1504,1505,1510,1520],{},[603,1506,1507],{},[324,1508,1509],{},"isolation.level",[603,1511,1512,1515,1516,1519],{},[324,1513,1514],{},"read_committed"," (EOS) \u002F ",[324,1517,1518],{},"read_uncommitted"," (ALO)",[603,1521,1522],{},"Must match the processing guarantee",[320,1524,1525],{},"Restoration tuning:",[406,1527,1529],{"className":408,"code":1528,"language":410,"meta":411,"style":411},"stoatflow:\n  kafka:\n    restoration-consumer:\n      max.poll.records: 5000\n      fetch.max.bytes: 104857600   # 100 MiB\n",[324,1530,1531,1537,1543,1550,1559],{"__ignoreMap":411},[415,1532,1533,1535],{"class":417,"line":418},[415,1534,422],{"class":421},[415,1536,426],{"class":425},[415,1538,1539,1541],{"class":417,"line":429},[415,1540,445],{"class":421},[415,1542,426],{"class":425},[415,1544,1545,1548],{"class":417,"line":442},[415,1546,1547],{"class":421},"    restoration-consumer",[415,1549,426],{"class":425},[415,1551,1552,1554,1556],{"class":417,"line":450},[415,1553,461],{"class":421},[415,1555,435],{"class":425},[415,1557,1558],{"class":466}," 5000\n",[415,1560,1561,1564,1566,1569],{"class":417,"line":458},[415,1562,1563],{"class":421},"      fetch.max.bytes",[415,1565,435],{"class":425},[415,1567,1568],{"class":466}," 104857600",[415,1570,1571],{"class":481},"   # 100 MiB\n",[392,1573,1575],{"id":1574},"common-tuning-scenarios","Common tuning scenarios",[647,1577,1579],{"id":1578},"high-throughput","High throughput",[320,1581,1582],{},"For maximum throughput with high event rates:",[406,1584,1586],{"className":408,"code":1585,"language":410,"meta":411,"style":411},"stoatflow:\n  kafka:\n    consumer:\n      max.poll.records: 2000\n      fetch.min.bytes: 65536        # 64 KiB — wait for larger fetches\n      fetch.max.wait.ms: 200        # max wait for fetch.min.bytes\n    producer:\n      batch.size: 524288            # 512 KiB\n      linger.ms: 50                 # allow more time to fill batches\n      compression.type: lz4         # reduce network bandwidth\n",[324,1587,1588,1594,1600,1606,1615,1627,1640,1646,1658,1670],{"__ignoreMap":411},[415,1589,1590,1592],{"class":417,"line":418},[415,1591,422],{"class":421},[415,1593,426],{"class":425},[415,1595,1596,1598],{"class":417,"line":429},[415,1597,445],{"class":421},[415,1599,426],{"class":425},[415,1601,1602,1604],{"class":417,"line":442},[415,1603,453],{"class":421},[415,1605,426],{"class":425},[415,1607,1608,1610,1612],{"class":417,"line":450},[415,1609,461],{"class":421},[415,1611,435],{"class":425},[415,1613,1614],{"class":466}," 2000\n",[415,1616,1617,1619,1621,1624],{"class":417,"line":458},[415,1618,488],{"class":421},[415,1620,435],{"class":425},[415,1622,1623],{"class":466}," 65536",[415,1625,1626],{"class":481},"        # 64 KiB — wait for larger fetches\n",[415,1628,1629,1632,1634,1637],{"class":417,"line":470},[415,1630,1631],{"class":421},"      fetch.max.wait.ms",[415,1633,435],{"class":425},[415,1635,1636],{"class":466}," 200",[415,1638,1639],{"class":481},"        # max wait for fetch.min.bytes\n",[415,1641,1642,1644],{"class":417,"line":485},[415,1643,499],{"class":421},[415,1645,426],{"class":425},[415,1647,1648,1650,1652,1655],{"class":417,"line":496},[415,1649,507],{"class":421},[415,1651,435],{"class":425},[415,1653,1654],{"class":466}," 524288",[415,1656,1657],{"class":481},"            # 512 KiB\n",[415,1659,1660,1662,1664,1667],{"class":417,"line":504},[415,1661,518],{"class":421},[415,1663,435],{"class":425},[415,1665,1666],{"class":466}," 50",[415,1668,1669],{"class":481},"                 # allow more time to fill batches\n",[415,1671,1672,1674,1676,1679],{"class":417,"line":515},[415,1673,529],{"class":421},[415,1675,435],{"class":425},[415,1677,1678],{"class":438}," lz4",[415,1680,1681],{"class":481},"         # reduce network bandwidth\n",[647,1683,1685],{"id":1684},"low-latency","Low latency",[320,1687,1688],{},"For latency-sensitive workloads:",[406,1690,1692],{"className":408,"code":1691,"language":410,"meta":411,"style":411},"stoatflow:\n  kafka:\n    consumer:\n      fetch.min.bytes: 1            # return immediately (Kafka default)\n      max.poll.records: 100         # smaller batches for lower processing latency\n    producer:\n      linger.ms: 0                  # send immediately\n      batch.size: 16384             # Kafka default (16 KiB)\n",[324,1693,1694,1700,1706,1712,1724,1736,1742,1754],{"__ignoreMap":411},[415,1695,1696,1698],{"class":417,"line":418},[415,1697,422],{"class":421},[415,1699,426],{"class":425},[415,1701,1702,1704],{"class":417,"line":429},[415,1703,445],{"class":421},[415,1705,426],{"class":425},[415,1707,1708,1710],{"class":417,"line":442},[415,1709,453],{"class":421},[415,1711,426],{"class":425},[415,1713,1714,1716,1718,1721],{"class":417,"line":450},[415,1715,488],{"class":421},[415,1717,435],{"class":425},[415,1719,1720],{"class":466}," 1",[415,1722,1723],{"class":481},"            # return immediately (Kafka default)\n",[415,1725,1726,1728,1730,1733],{"class":417,"line":458},[415,1727,461],{"class":421},[415,1729,435],{"class":425},[415,1731,1732],{"class":466}," 100",[415,1734,1735],{"class":481},"         # smaller batches for lower processing latency\n",[415,1737,1738,1740],{"class":417,"line":470},[415,1739,499],{"class":421},[415,1741,426],{"class":425},[415,1743,1744,1746,1748,1751],{"class":417,"line":485},[415,1745,518],{"class":421},[415,1747,435],{"class":425},[415,1749,1750],{"class":466}," 0",[415,1752,1753],{"class":481},"                  # send immediately\n",[415,1755,1756,1758,1760,1763],{"class":417,"line":496},[415,1757,507],{"class":421},[415,1759,435],{"class":425},[415,1761,1762],{"class":466}," 16384",[415,1764,1765],{"class":481},"             # Kafka default (16 KiB)\n",[647,1767,1769],{"id":1768},"large-records","Large records",[320,1771,1772],{},"When individual records are large (e.g. complex Avro > 10 KB):",[406,1774,1776],{"className":408,"code":1775,"language":410,"meta":411,"style":411},"stoatflow:\n  kafka:\n    consumer:\n      max.partition.fetch.bytes: 20971520   # 20 MiB\n      fetch.max.bytes: 104857600            # 100 MiB\n    producer:\n      max.request.size: 10485760            # 10 MiB\n      buffer.memory: 536870912              # 512 MiB\n",[324,1777,1778,1784,1790,1796,1809,1820,1826,1839],{"__ignoreMap":411},[415,1779,1780,1782],{"class":417,"line":418},[415,1781,422],{"class":421},[415,1783,426],{"class":425},[415,1785,1786,1788],{"class":417,"line":429},[415,1787,445],{"class":421},[415,1789,426],{"class":425},[415,1791,1792,1794],{"class":417,"line":442},[415,1793,453],{"class":421},[415,1795,426],{"class":425},[415,1797,1798,1801,1803,1806],{"class":417,"line":450},[415,1799,1800],{"class":421},"      max.partition.fetch.bytes",[415,1802,435],{"class":425},[415,1804,1805],{"class":466}," 20971520",[415,1807,1808],{"class":481},"   # 20 MiB\n",[415,1810,1811,1813,1815,1817],{"class":417,"line":458},[415,1812,1563],{"class":421},[415,1814,435],{"class":425},[415,1816,1568],{"class":466},[415,1818,1819],{"class":481},"            # 100 MiB\n",[415,1821,1822,1824],{"class":417,"line":470},[415,1823,499],{"class":421},[415,1825,426],{"class":425},[415,1827,1828,1831,1833,1836],{"class":417,"line":485},[415,1829,1830],{"class":421},"      max.request.size",[415,1832,435],{"class":425},[415,1834,1835],{"class":466}," 10485760",[415,1837,1838],{"class":481},"            # 10 MiB\n",[415,1840,1841,1844,1846,1849],{"class":417,"line":496},[415,1842,1843],{"class":421},"      buffer.memory",[415,1845,435],{"class":425},[415,1847,1848],{"class":466}," 536870912",[415,1850,1851],{"class":481},"              # 512 MiB\n",[647,1853,1855],{"id":1854},"memory-constrained-environments","Memory-constrained environments",[320,1857,1858],{},"When heap is limited:",[406,1860,1862],{"className":408,"code":1861,"language":410,"meta":411,"style":411},"stoatflow:\n  kafka:\n    consumer:\n      max.poll.records: 100\n      max.partition.fetch.bytes: 1048576    # 1 MiB (Kafka default)\n      fetch.max.bytes: 10485760             # 10 MiB\n    producer:\n      batch.size: 32768                     # 32 KiB\n      buffer.memory: 33554432               # 32 MiB (Kafka default)\n",[324,1863,1864,1870,1876,1882,1891,1903,1914,1920,1932],{"__ignoreMap":411},[415,1865,1866,1868],{"class":417,"line":418},[415,1867,422],{"class":421},[415,1869,426],{"class":425},[415,1871,1872,1874],{"class":417,"line":429},[415,1873,445],{"class":421},[415,1875,426],{"class":425},[415,1877,1878,1880],{"class":417,"line":442},[415,1879,453],{"class":421},[415,1881,426],{"class":425},[415,1883,1884,1886,1888],{"class":417,"line":450},[415,1885,461],{"class":421},[415,1887,435],{"class":425},[415,1889,1890],{"class":466}," 100\n",[415,1892,1893,1895,1897,1900],{"class":417,"line":458},[415,1894,1800],{"class":421},[415,1896,435],{"class":425},[415,1898,1899],{"class":466}," 1048576",[415,1901,1902],{"class":481},"    # 1 MiB (Kafka default)\n",[415,1904,1905,1907,1909,1911],{"class":417,"line":470},[415,1906,1563],{"class":421},[415,1908,435],{"class":425},[415,1910,1835],{"class":466},[415,1912,1913],{"class":481},"             # 10 MiB\n",[415,1915,1916,1918],{"class":417,"line":485},[415,1917,499],{"class":421},[415,1919,426],{"class":425},[415,1921,1922,1924,1926,1929],{"class":417,"line":496},[415,1923,507],{"class":421},[415,1925,435],{"class":425},[415,1927,1928],{"class":466}," 32768",[415,1930,1931],{"class":481},"                     # 32 KiB\n",[415,1933,1934,1936,1938,1941],{"class":417,"line":504},[415,1935,1843],{"class":421},[415,1937,435],{"class":425},[415,1939,1940],{"class":466}," 33554432",[415,1942,1943],{"class":481},"               # 32 MiB (Kafka default)\n",[647,1945,1947],{"id":1946},"fast-restoration","Fast restoration",[320,1949,1950],{},"For large state stores where recovery time matters:",[406,1952,1954],{"className":408,"code":1953,"language":410,"meta":411,"style":411},"stoatflow:\n  kafka:\n    restoration-consumer:\n      max.poll.records: 5000\n      receive.buffer.bytes: 1048576         # 1 MiB socket buffer\n",[324,1955,1956,1962,1968,1974,1982],{"__ignoreMap":411},[415,1957,1958,1960],{"class":417,"line":418},[415,1959,422],{"class":421},[415,1961,426],{"class":425},[415,1963,1964,1966],{"class":417,"line":429},[415,1965,445],{"class":421},[415,1967,426],{"class":425},[415,1969,1970,1972],{"class":417,"line":442},[415,1971,1547],{"class":421},[415,1973,426],{"class":425},[415,1975,1976,1978,1980],{"class":417,"line":450},[415,1977,461],{"class":421},[415,1979,435],{"class":425},[415,1981,1558],{"class":466},[415,1983,1984,1987,1989,1991],{"class":417,"line":458},[415,1985,1986],{"class":421},"      receive.buffer.bytes",[415,1988,435],{"class":425},[415,1990,1899],{"class":466},[415,1992,1993],{"class":481},"         # 1 MiB socket buffer\n",[647,1995,1997],{"id":1996},"low-memory-restoration","Low-memory restoration",[320,1999,2000],{},"When restoration causes GC pressure on a constrained heap:",[406,2002,2004],{"className":408,"code":2003,"language":410,"meta":411,"style":411},"stoatflow:\n  kafka:\n    restoration-consumer:\n      max.poll.records: 200\n      max.partition.fetch.bytes: 1048576    # 1 MiB (Kafka default)\n      fetch.max.bytes: 10485760             # 10 MiB\n",[324,2005,2006,2012,2018,2024,2033,2043],{"__ignoreMap":411},[415,2007,2008,2010],{"class":417,"line":418},[415,2009,422],{"class":421},[415,2011,426],{"class":425},[415,2013,2014,2016],{"class":417,"line":429},[415,2015,445],{"class":421},[415,2017,426],{"class":425},[415,2019,2020,2022],{"class":417,"line":442},[415,2021,1547],{"class":421},[415,2023,426],{"class":425},[415,2025,2026,2028,2030],{"class":417,"line":450},[415,2027,461],{"class":421},[415,2029,435],{"class":425},[415,2031,2032],{"class":466}," 200\n",[415,2034,2035,2037,2039,2041],{"class":417,"line":458},[415,2036,1800],{"class":421},[415,2038,435],{"class":425},[415,2040,1899],{"class":466},[415,2042,1902],{"class":481},[415,2044,2045,2047,2049,2051],{"class":417,"line":470},[415,2046,1563],{"class":421},[415,2048,435],{"class":425},[415,2050,1835],{"class":466},[415,2052,1913],{"class":481},[392,2054,2056],{"id":2055},"setting-properties-via-environment-variables","Setting properties via environment variables",[320,2058,2059,2060,2063],{},"Kafka client properties can also be set via environment variables, which take precedence over YAML. The format is ",[324,2061,2062],{},"STOATFLOW__KAFKA__{CONSUMER|PRODUCER|RESTORATION_CONSUMER}__{PROPERTY}",", where the property name uses underscores instead of dots and is uppercased:",[406,2065,2069],{"className":2066,"code":2067,"language":2068,"meta":411,"style":411},"language-bash shiki shiki-themes vitesse-light","# Consumer properties\nexport STOATFLOW__KAFKA__CONSUMER__MAX_POLL_RECORDS=1000\nexport STOATFLOW__KAFKA__CONSUMER__FETCH_MAX_BYTES=104857600\n\n# Producer properties\nexport STOATFLOW__KAFKA__PRODUCER__BATCH_SIZE=524288\nexport STOATFLOW__KAFKA__PRODUCER__LINGER_MS=50\n\n# Restoration consumer properties\nexport STOATFLOW__KAFKA__RESTORATION_CONSUMER__MAX_POLL_RECORDS=5000\n","bash",[324,2070,2071,2076,2092,2104,2110,2115,2127,2139,2143,2148],{"__ignoreMap":411},[415,2072,2073],{"class":417,"line":418},[415,2074,2075],{"class":481},"# Consumer properties\n",[415,2077,2078,2082,2086,2089],{"class":417,"line":429},[415,2079,2081],{"class":2080},"si04Y","export",[415,2083,2085],{"class":2084},"svycV"," STOATFLOW__KAFKA__CONSUMER__MAX_POLL_RECORDS",[415,2087,2088],{"class":425},"=",[415,2090,2091],{"class":466},"1000\n",[415,2093,2094,2096,2099,2101],{"class":417,"line":442},[415,2095,2081],{"class":2080},[415,2097,2098],{"class":2084}," STOATFLOW__KAFKA__CONSUMER__FETCH_MAX_BYTES",[415,2100,2088],{"class":425},[415,2102,2103],{"class":466},"104857600\n",[415,2105,2106],{"class":417,"line":450},[415,2107,2109],{"emptyLinePlaceholder":2108},true,"\n",[415,2111,2112],{"class":417,"line":458},[415,2113,2114],{"class":481},"# Producer properties\n",[415,2116,2117,2119,2122,2124],{"class":417,"line":470},[415,2118,2081],{"class":2080},[415,2120,2121],{"class":2084}," STOATFLOW__KAFKA__PRODUCER__BATCH_SIZE",[415,2123,2088],{"class":425},[415,2125,2126],{"class":466},"524288\n",[415,2128,2129,2131,2134,2136],{"class":417,"line":485},[415,2130,2081],{"class":2080},[415,2132,2133],{"class":2084}," STOATFLOW__KAFKA__PRODUCER__LINGER_MS",[415,2135,2088],{"class":425},[415,2137,2138],{"class":466},"50\n",[415,2140,2141],{"class":417,"line":496},[415,2142,2109],{"emptyLinePlaceholder":2108},[415,2144,2145],{"class":417,"line":504},[415,2146,2147],{"class":481},"# Restoration consumer properties\n",[415,2149,2150,2152,2155,2157],{"class":417,"line":515},[415,2151,2081],{"class":2080},[415,2153,2154],{"class":2084}," STOATFLOW__KAFKA__RESTORATION_CONSUMER__MAX_POLL_RECORDS",[415,2156,2088],{"class":425},[415,2158,2159],{"class":466},"5000\n",[320,2161,2162,2163,2165,2166,2169,2170,2172],{},"So ",[324,2164,676],{}," becomes ",[324,2167,2168],{},"STOATFLOW__KAFKA__CONSUMER__MAX_POLL_RECORDS",". See the ",[547,2171,565],{"href":73}," for the full precedence rules.",[392,2174,2176],{"id":2175},"sasl-and-ssl","SASL and SSL",[320,2178,2179],{},"Authentication and encryption are plain Kafka client properties — pass them through like any other:",[406,2181,2183],{"className":408,"code":2182,"language":410,"meta":411,"style":411},"stoatflow:\n  bootstrap-servers: broker-1:9093,broker-2:9093\n  kafka:\n    consumer:\n      security.protocol: SASL_SSL\n      sasl.mechanism: PLAIN\n      sasl.jaas.config: ${KAFKA_SASL_JAAS_CONFIG}\n      ssl.truststore.location: \u002Fetc\u002Fkafka\u002Ftruststore.jks\n      ssl.truststore.password: ${KAFKA_TRUSTSTORE_PASSWORD}\n    producer:\n      security.protocol: SASL_SSL\n      sasl.mechanism: PLAIN\n      sasl.jaas.config: ${KAFKA_SASL_JAAS_CONFIG}\n      ssl.truststore.location: \u002Fetc\u002Fkafka\u002Ftruststore.jks\n      ssl.truststore.password: ${KAFKA_TRUSTSTORE_PASSWORD}\n",[324,2184,2185,2191,2200,2206,2212,2222,2232,2242,2252,2262,2268,2276,2285,2294,2303],{"__ignoreMap":411},[415,2186,2187,2189],{"class":417,"line":418},[415,2188,422],{"class":421},[415,2190,426],{"class":425},[415,2192,2193,2195,2197],{"class":417,"line":429},[415,2194,432],{"class":421},[415,2196,435],{"class":425},[415,2198,2199],{"class":438}," broker-1:9093,broker-2:9093\n",[415,2201,2202,2204],{"class":417,"line":442},[415,2203,445],{"class":421},[415,2205,426],{"class":425},[415,2207,2208,2210],{"class":417,"line":450},[415,2209,453],{"class":421},[415,2211,426],{"class":425},[415,2213,2214,2217,2219],{"class":417,"line":458},[415,2215,2216],{"class":421},"      security.protocol",[415,2218,435],{"class":425},[415,2220,2221],{"class":438}," SASL_SSL\n",[415,2223,2224,2227,2229],{"class":417,"line":470},[415,2225,2226],{"class":421},"      sasl.mechanism",[415,2228,435],{"class":425},[415,2230,2231],{"class":438}," PLAIN\n",[415,2233,2234,2237,2239],{"class":417,"line":485},[415,2235,2236],{"class":421},"      sasl.jaas.config",[415,2238,435],{"class":425},[415,2240,2241],{"class":438}," ${KAFKA_SASL_JAAS_CONFIG}\n",[415,2243,2244,2247,2249],{"class":417,"line":496},[415,2245,2246],{"class":421},"      ssl.truststore.location",[415,2248,435],{"class":425},[415,2250,2251],{"class":438}," \u002Fetc\u002Fkafka\u002Ftruststore.jks\n",[415,2253,2254,2257,2259],{"class":417,"line":504},[415,2255,2256],{"class":421},"      ssl.truststore.password",[415,2258,435],{"class":425},[415,2260,2261],{"class":438}," ${KAFKA_TRUSTSTORE_PASSWORD}\n",[415,2263,2264,2266],{"class":417,"line":515},[415,2265,499],{"class":421},[415,2267,426],{"class":425},[415,2269,2270,2272,2274],{"class":417,"line":526},[415,2271,2216],{"class":421},[415,2273,435],{"class":425},[415,2275,2221],{"class":438},[415,2277,2279,2281,2283],{"class":417,"line":2278},12,[415,2280,2226],{"class":421},[415,2282,435],{"class":425},[415,2284,2231],{"class":438},[415,2286,2288,2290,2292],{"class":417,"line":2287},13,[415,2289,2236],{"class":421},[415,2291,435],{"class":425},[415,2293,2241],{"class":438},[415,2295,2297,2299,2301],{"class":417,"line":2296},14,[415,2298,2246],{"class":421},[415,2300,435],{"class":425},[415,2302,2251],{"class":438},[415,2304,2306,2308,2310],{"class":417,"line":2305},15,[415,2307,2256],{"class":421},[415,2309,435],{"class":425},[415,2311,2261],{"class":438},[320,2313,2314,2315,2318,2319,2321,2322,2324,2325,349,2328,349,2331,2334],{},"Keep secrets out of committed files — reference them with environment-variable placeholders (",[324,2316,2317],{},"${...}",") as shown. Set the same properties on ",[324,2320,1295],{}," if your changelog topics live on the same secured cluster (they normally do, so inheritance from ",[324,2323,348],{}," covers it automatically). The consumer's ",[324,2326,2327],{},"security.*",[324,2329,2330],{},"ssl.*",[324,2332,2333],{},"sasl.*"," settings are also propagated to StoatFlow's internal admin clients (changelog topic management, broker health check), so a secured cluster needs no separate admin configuration.",[392,2336,1291],{"id":2337},"inspecting-the-resolved-configuration",[320,2339,2340,2341,2344,2345,570],{},"The merged application configuration is available at runtime from the ",[324,2342,2343],{},"\u002Fconfig"," HTTP endpoint, with sensitive values (passwords, secrets, tokens) masked. It serves JSON or YAML by content negotiation. See the ",[547,2346,2347],{"href":186},"REST API",[320,2349,2350,2351,435],{},"The resolved configuration is also logged at startup when the engine logger is at ",[324,2352,2353],{},"DEBUG",[406,2355,2357],{"className":408,"code":2356,"language":410,"meta":411,"style":411},"logging:\n  level:\n    io.stoatflow.core.runtime.StreamProcessingEngine: DEBUG\n",[324,2358,2359,2366,2373],{"__ignoreMap":411},[415,2360,2361,2364],{"class":417,"line":418},[415,2362,2363],{"class":421},"logging",[415,2365,426],{"class":425},[415,2367,2368,2371],{"class":417,"line":429},[415,2369,2370],{"class":421},"  level",[415,2372,426],{"class":425},[415,2374,2375,2378,2380],{"class":417,"line":442},[415,2376,2377],{"class":421},"    io.stoatflow.core.runtime.StreamProcessingEngine",[415,2379,435],{"class":425},[415,2381,2382],{"class":438}," DEBUG\n",[2384,2385,2386],"style",{},"html pre.shiki code .su6XF, html code.shiki .su6XF{--shiki-default:#998418}html pre.shiki code .sYZai, html code.shiki .sYZai{--shiki-default:#999999}html pre.shiki code .spphp, html code.shiki .spphp{--shiki-default:#B56959}html pre.shiki code .s-TwI, html code.shiki .s-TwI{--shiki-default:#2F798A}html pre.shiki code .s8zF2, html code.shiki .s8zF2{--shiki-default:#A0ADA0}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 pre.shiki code .si04Y, html code.shiki .si04Y{--shiki-default:#AB5959}html pre.shiki code .svycV, html code.shiki .svycV{--shiki-default:#B07D48}",{"title":411,"searchDepth":429,"depth":429,"links":2388},[2389,2390,2394,2398,2402,2410,2411,2412],{"id":394,"depth":429,"text":395},{"id":573,"depth":429,"text":574,"children":2391},[2392,2393],{"id":649,"depth":442,"text":619},{"id":744,"depth":442,"text":642},{"id":862,"depth":429,"text":863,"children":2395},[2396,2397],{"id":917,"depth":442,"text":619},{"id":1082,"depth":442,"text":642},{"id":1295,"depth":429,"text":1296,"children":2399},[2400,2401],{"id":1373,"depth":442,"text":619},{"id":1436,"depth":442,"text":642},{"id":1574,"depth":429,"text":1575,"children":2403},[2404,2405,2406,2407,2408,2409],{"id":1578,"depth":442,"text":1579},{"id":1684,"depth":442,"text":1685},{"id":1768,"depth":442,"text":1769},{"id":1854,"depth":442,"text":1855},{"id":1946,"depth":442,"text":1947},{"id":1996,"depth":442,"text":1997},{"id":2055,"depth":429,"text":2056},{"id":2175,"depth":429,"text":2176},{"id":2337,"depth":429,"text":1291},"Pass arbitrary consumer, producer, and restoration-consumer properties through to the Kafka clients, and understand which properties StoatFlow forces for correctness.","md",{},{"icon":175},"how-to",{"title":172,"description":2413},"-c1fj4_-NwZq-TtZmS9C6Y6p4nrzilhBVHjxqrAFPeM",[2421,2423],{"title":167,"path":168,"stem":169,"description":2422,"icon":170,"children":-1},"Why a minimal StoatFlow config runs well — the opinionated defaults, the parts that self-tune within bounds you set, and the RocksDB presets and tuning knobs you can change.",{"title":182,"path":178,"stem":179,"description":2424,"icon":183,"children":-1},"The batteries-included :runtime module — StoatFlowRuntime.fromConfig, the lifecycle (start \u002F awaitTermination \u002F stop), and what it adds over the bare :core engine.",1783713360953]