[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"public-branding":3,"content-de-discord-sharding-ratelimits":8,"public-ads-config":1600},{"siteName":4,"primaryColor":5,"accentColor":6,"faviconUrl":7,"logoUrl":7},"KiroCloud","#ffffff","#888888","",{"id":9,"title":10,"author":11,"body":12,"category":11,"description":1585,"extension":1586,"lastUpdated":11,"meta":1587,"navigation":147,"order":1588,"path":1589,"readTime":11,"seo":1590,"stem":1598,"__hash__":1599},"docs\u002Fdocs\u002Fde\u002Fdiscord-sharding-ratelimits.md","[object Object]",null,{"type":13,"value":14,"toc":1576},"minimark",[15,20,29,32,35,40,43,46,49,59,61,65,72,706,726,728,732,738,1137,1139,1143,1146,1174,1179,1182,1541,1543,1547,1572],[16,17,19],"h1",{"id":18},"discord-gateway-v10-sharding-rate-limiting-architektur-ab-2500-servern","Discord Gateway v10 Sharding & Rate Limiting: Architektur ab 2.500 Servern",[21,22,23,24,28],"p",{},"Sobald ein Discord-Bot auf mehr als 2.500 Servern (Guilds) aktiv ist, erzwingt Discord zwingend das sogenannte ",[25,26,27],"strong",{},"Gateway Sharding",". Ohne Sharding verweigert das Discord Gateway Verbindungsanfragen. Doch auch unterhalb dieser Grenze ist Sharding die wichtigste Architekturmaßnahme zur Vermeidung von CPU-Bottlenecks, Gateway-Disconnects und globalen Rate-Limits.",[21,30,31],{},"In diesem Leitfaden betrachten wir die mathematischen Grundlagen des Shardings, die Funktionsweise von Discord v10 Rate-Limit-Buckets und den Aufbau eines stabilen Sharding-Managers.",[33,34],"hr",{},[36,37,39],"h2",{"id":38},"_1-wie-discord-gateway-sharding-funktioniert","1. Wie Discord Gateway Sharding funktioniert",[21,41,42],{},"Ein Shard ist eine eigenständige WebSocket-Verbindung zum Discord Gateway. Discord weist jeden Server anhand einer deterministischen mathematischen Formel einem spezifischen Shard zu:",[21,44,45],{},"$$\\text{shard_id} = (\\text{guild_id} \\gg 22) \\pmod{\\text{total_shards}}$$",[21,47,48],{},"Dadurch ist garantiert, dass Events für einen bestimmten Server immer auf genau demselben Shard empfangen werden.",[50,51,56],"pre",{"className":52,"code":54,"language":55},[53],"language-text","                    ┌─────────────────────────┐\n                    │  Discord Gateway (v10)  │\n                    └────────────┬────────────┘\n         ┌───────────────────────┼───────────────────────┐\n         ▼                       ▼                       ▼\n   ┌───────────┐           ┌───────────┐           ┌───────────┐\n   │  Shard 0  │           │  Shard 1  │           │  Shard 2  │\n   │ Guilds %3 │           │ Guilds %3 │           │ Guilds %3 │\n   └─────┬─────┘           └─────┬─────┘           └─────┬─────┘\n         │                       │                       │\n         └───────────────────────┼───────────────────────┘\n                                 ▼\n                    ┌─────────────────────────┐\n                    │  KiroCloud Worker Pool  │\n                    └─────────────────────────┘\n","text",[57,58,54],"code",{"__ignoreMap":7},[33,60],{},[36,62,64],{"id":63},"_2-implementierung-mit-dem-shardingmanager","2. Implementierung mit dem ShardingManager",[21,66,67,68,71],{},"In Node.js starten wir Shards über den ",[57,69,70],{},"ShardingManager",", der jeden Shard in einem separaten Node.js-Prozess oder Worker-Thread ausführt:",[50,73,77],{"className":74,"code":75,"language":76,"meta":7,"style":7},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F bot-cluster.ts\nimport { ShardingManager } from 'discord.js';\nimport path from 'node:path';\n\nconst manager = new ShardingManager(path.join(__dirname, 'bot-worker.ts'), {\n  token: process.env.DISCORD_BOT_TOKEN,\n  totalShards: 'auto', \u002F\u002F Discord empfiehlt automatisch die ideale Anzahl\n  respawn: true,        \u002F\u002F Automatischer Neustart bei Prozessabsturz\n  mode: 'worker',       \u002F\u002F 'worker' (Threads) oder 'process' (Child Processes)\n});\n\nmanager.on('shardCreate', (shard) => {\n  console.log(`[Cluster] Shard #${shard.id} initialisiert und gestartet.`);\n\n  shard.on('disconnect', () => {\n    console.warn(`[Cluster] Shard #${shard.id} Verbindung verloren.`);\n  });\n\n  shard.on('reconnecting', () => {\n    console.log(`[Cluster] Shard #${shard.id} verbindet erneut...`);\n  });\n});\n\nmanager.spawn({\n  amount: 'auto',\n  delay: 5500, \u002F\u002F WICHTIG: Mindestens 5,5 Sekunden Pause zwischen Shard-Spawns (Discord Rate-Limit)\n  timeout: 30000,\n}).then(() => {\n  console.log('[Cluster] Alle Shards erfolgreich mit Discord Gateway verbunden.');\n}).catch((err) => {\n  console.error('[Cluster] Kritischer Fehler beim Spawnen der Shards:', err);\n});\n","typescript",[57,78,79,88,122,142,149,198,224,244,261,281,291,296,333,373,378,406,442,452,457,483,517,526,535,540,555,571,588,601,622,644,669,697],{"__ignoreMap":7},[80,81,84],"span",{"class":82,"line":83},"line",1,[80,85,87],{"class":86},"sHwdD","\u002F\u002F bot-cluster.ts\n",[80,89,91,95,99,103,106,109,112,116,119],{"class":82,"line":90},2,[80,92,94],{"class":93},"s7zQu","import",[80,96,98],{"class":97},"sMK4o"," {",[80,100,102],{"class":101},"sTEyZ"," ShardingManager",[80,104,105],{"class":97}," }",[80,107,108],{"class":93}," from",[80,110,111],{"class":97}," '",[80,113,115],{"class":114},"sfazB","discord.js",[80,117,118],{"class":97},"'",[80,120,121],{"class":97},";\n",[80,123,125,127,130,133,135,138,140],{"class":82,"line":124},3,[80,126,94],{"class":93},[80,128,129],{"class":101}," path ",[80,131,132],{"class":93},"from",[80,134,111],{"class":97},[80,136,137],{"class":114},"node:path",[80,139,118],{"class":97},[80,141,121],{"class":97},[80,143,145],{"class":82,"line":144},4,[80,146,148],{"emptyLinePlaceholder":147},true,"\n",[80,150,152,156,159,162,165,168,171,174,177,180,183,185,188,190,193,195],{"class":82,"line":151},5,[80,153,155],{"class":154},"spNyl","const",[80,157,158],{"class":101}," manager ",[80,160,161],{"class":97},"=",[80,163,164],{"class":97}," new",[80,166,102],{"class":167},"s2Zo4",[80,169,170],{"class":101},"(path",[80,172,173],{"class":97},".",[80,175,176],{"class":167},"join",[80,178,179],{"class":101},"(__dirname",[80,181,182],{"class":97},",",[80,184,111],{"class":97},[80,186,187],{"class":114},"bot-worker.ts",[80,189,118],{"class":97},[80,191,192],{"class":101},")",[80,194,182],{"class":97},[80,196,197],{"class":97}," {\n",[80,199,201,205,208,211,213,216,218,221],{"class":82,"line":200},6,[80,202,204],{"class":203},"swJcz","  token",[80,206,207],{"class":97},":",[80,209,210],{"class":101}," process",[80,212,173],{"class":97},[80,214,215],{"class":101},"env",[80,217,173],{"class":97},[80,219,220],{"class":101},"DISCORD_BOT_TOKEN",[80,222,223],{"class":97},",\n",[80,225,227,230,232,234,237,239,241],{"class":82,"line":226},7,[80,228,229],{"class":203},"  totalShards",[80,231,207],{"class":97},[80,233,111],{"class":97},[80,235,236],{"class":114},"auto",[80,238,118],{"class":97},[80,240,182],{"class":97},[80,242,243],{"class":86}," \u002F\u002F Discord empfiehlt automatisch die ideale Anzahl\n",[80,245,247,250,252,256,258],{"class":82,"line":246},8,[80,248,249],{"class":203},"  respawn",[80,251,207],{"class":97},[80,253,255],{"class":254},"sfNiH"," true",[80,257,182],{"class":97},[80,259,260],{"class":86},"        \u002F\u002F Automatischer Neustart bei Prozessabsturz\n",[80,262,264,267,269,271,274,276,278],{"class":82,"line":263},9,[80,265,266],{"class":203},"  mode",[80,268,207],{"class":97},[80,270,111],{"class":97},[80,272,273],{"class":114},"worker",[80,275,118],{"class":97},[80,277,182],{"class":97},[80,279,280],{"class":86},"       \u002F\u002F 'worker' (Threads) oder 'process' (Child Processes)\n",[80,282,284,287,289],{"class":82,"line":283},10,[80,285,286],{"class":97},"}",[80,288,192],{"class":101},[80,290,121],{"class":97},[80,292,294],{"class":82,"line":293},11,[80,295,148],{"emptyLinePlaceholder":147},[80,297,299,302,304,307,310,312,315,317,319,322,326,328,331],{"class":82,"line":298},12,[80,300,301],{"class":101},"manager",[80,303,173],{"class":97},[80,305,306],{"class":167},"on",[80,308,309],{"class":101},"(",[80,311,118],{"class":97},[80,313,314],{"class":114},"shardCreate",[80,316,118],{"class":97},[80,318,182],{"class":97},[80,320,321],{"class":97}," (",[80,323,325],{"class":324},"sHdIc","shard",[80,327,192],{"class":97},[80,329,330],{"class":154}," =>",[80,332,197],{"class":97},[80,334,336,339,341,344,346,349,352,355,357,359,362,364,367,369,371],{"class":82,"line":335},13,[80,337,338],{"class":101},"  console",[80,340,173],{"class":97},[80,342,343],{"class":167},"log",[80,345,309],{"class":203},[80,347,348],{"class":97},"`",[80,350,351],{"class":114},"[Cluster] Shard #",[80,353,354],{"class":97},"${",[80,356,325],{"class":101},[80,358,173],{"class":97},[80,360,361],{"class":101},"id",[80,363,286],{"class":97},[80,365,366],{"class":114}," initialisiert und gestartet.",[80,368,348],{"class":97},[80,370,192],{"class":203},[80,372,121],{"class":97},[80,374,376],{"class":82,"line":375},14,[80,377,148],{"emptyLinePlaceholder":147},[80,379,381,384,386,388,390,392,395,397,399,402,404],{"class":82,"line":380},15,[80,382,383],{"class":101},"  shard",[80,385,173],{"class":97},[80,387,306],{"class":167},[80,389,309],{"class":203},[80,391,118],{"class":97},[80,393,394],{"class":114},"disconnect",[80,396,118],{"class":97},[80,398,182],{"class":97},[80,400,401],{"class":97}," ()",[80,403,330],{"class":154},[80,405,197],{"class":97},[80,407,409,412,414,417,419,421,423,425,427,429,431,433,436,438,440],{"class":82,"line":408},16,[80,410,411],{"class":101},"    console",[80,413,173],{"class":97},[80,415,416],{"class":167},"warn",[80,418,309],{"class":203},[80,420,348],{"class":97},[80,422,351],{"class":114},[80,424,354],{"class":97},[80,426,325],{"class":101},[80,428,173],{"class":97},[80,430,361],{"class":101},[80,432,286],{"class":97},[80,434,435],{"class":114}," Verbindung verloren.",[80,437,348],{"class":97},[80,439,192],{"class":203},[80,441,121],{"class":97},[80,443,445,448,450],{"class":82,"line":444},17,[80,446,447],{"class":97},"  }",[80,449,192],{"class":203},[80,451,121],{"class":97},[80,453,455],{"class":82,"line":454},18,[80,456,148],{"emptyLinePlaceholder":147},[80,458,460,462,464,466,468,470,473,475,477,479,481],{"class":82,"line":459},19,[80,461,383],{"class":101},[80,463,173],{"class":97},[80,465,306],{"class":167},[80,467,309],{"class":203},[80,469,118],{"class":97},[80,471,472],{"class":114},"reconnecting",[80,474,118],{"class":97},[80,476,182],{"class":97},[80,478,401],{"class":97},[80,480,330],{"class":154},[80,482,197],{"class":97},[80,484,486,488,490,492,494,496,498,500,502,504,506,508,511,513,515],{"class":82,"line":485},20,[80,487,411],{"class":101},[80,489,173],{"class":97},[80,491,343],{"class":167},[80,493,309],{"class":203},[80,495,348],{"class":97},[80,497,351],{"class":114},[80,499,354],{"class":97},[80,501,325],{"class":101},[80,503,173],{"class":97},[80,505,361],{"class":101},[80,507,286],{"class":97},[80,509,510],{"class":114}," verbindet erneut...",[80,512,348],{"class":97},[80,514,192],{"class":203},[80,516,121],{"class":97},[80,518,520,522,524],{"class":82,"line":519},21,[80,521,447],{"class":97},[80,523,192],{"class":203},[80,525,121],{"class":97},[80,527,529,531,533],{"class":82,"line":528},22,[80,530,286],{"class":97},[80,532,192],{"class":101},[80,534,121],{"class":97},[80,536,538],{"class":82,"line":537},23,[80,539,148],{"emptyLinePlaceholder":147},[80,541,543,545,547,550,552],{"class":82,"line":542},24,[80,544,301],{"class":101},[80,546,173],{"class":97},[80,548,549],{"class":167},"spawn",[80,551,309],{"class":101},[80,553,554],{"class":97},"{\n",[80,556,558,561,563,565,567,569],{"class":82,"line":557},25,[80,559,560],{"class":203},"  amount",[80,562,207],{"class":97},[80,564,111],{"class":97},[80,566,236],{"class":114},[80,568,118],{"class":97},[80,570,223],{"class":97},[80,572,574,577,579,583,585],{"class":82,"line":573},26,[80,575,576],{"class":203},"  delay",[80,578,207],{"class":97},[80,580,582],{"class":581},"sbssI"," 5500",[80,584,182],{"class":97},[80,586,587],{"class":86}," \u002F\u002F WICHTIG: Mindestens 5,5 Sekunden Pause zwischen Shard-Spawns (Discord Rate-Limit)\n",[80,589,591,594,596,599],{"class":82,"line":590},27,[80,592,593],{"class":203},"  timeout",[80,595,207],{"class":97},[80,597,598],{"class":581}," 30000",[80,600,223],{"class":97},[80,602,604,606,608,610,613,615,618,620],{"class":82,"line":603},28,[80,605,286],{"class":97},[80,607,192],{"class":101},[80,609,173],{"class":97},[80,611,612],{"class":167},"then",[80,614,309],{"class":101},[80,616,617],{"class":97},"()",[80,619,330],{"class":154},[80,621,197],{"class":97},[80,623,625,627,629,631,633,635,638,640,642],{"class":82,"line":624},29,[80,626,338],{"class":101},[80,628,173],{"class":97},[80,630,343],{"class":167},[80,632,309],{"class":203},[80,634,118],{"class":97},[80,636,637],{"class":114},"[Cluster] Alle Shards erfolgreich mit Discord Gateway verbunden.",[80,639,118],{"class":97},[80,641,192],{"class":203},[80,643,121],{"class":97},[80,645,647,649,651,653,656,658,660,663,665,667],{"class":82,"line":646},30,[80,648,286],{"class":97},[80,650,192],{"class":101},[80,652,173],{"class":97},[80,654,655],{"class":167},"catch",[80,657,309],{"class":101},[80,659,309],{"class":97},[80,661,662],{"class":324},"err",[80,664,192],{"class":97},[80,666,330],{"class":154},[80,668,197],{"class":97},[80,670,672,674,676,679,681,683,686,688,690,693,695],{"class":82,"line":671},31,[80,673,338],{"class":101},[80,675,173],{"class":97},[80,677,678],{"class":167},"error",[80,680,309],{"class":203},[80,682,118],{"class":97},[80,684,685],{"class":114},"[Cluster] Kritischer Fehler beim Spawnen der Shards:",[80,687,118],{"class":97},[80,689,182],{"class":97},[80,691,692],{"class":101}," err",[80,694,192],{"class":203},[80,696,121],{"class":97},[80,698,700,702,704],{"class":82,"line":699},32,[80,701,286],{"class":97},[80,703,192],{"class":101},[80,705,121],{"class":97},[707,708,709],"blockquote",{},[21,710,711,714,717,718,721,722,725],{},[80,712,713],{},"!IMPORTANT",[25,715,716],{},"Das Identify-Rate-Limit:"," Discord erlaubt nur 1 Gateway-Identify alle 5 Sekunden pro Shard-Block (",[57,719,720],{},"max_concurrency","). Ein zu schneller Spawn führt zum temporären IP-Ban (HTTP 429). Setze den ",[57,723,724],{},"delay","-Parameter daher immer auf mindestens 5.500 ms.",[33,727],{},[36,729,731],{"id":730},"_3-shard-übergreifende-kommunikation-cross-shard-messaging","3. Shard-übergreifende Kommunikation (Cross-Shard Messaging)",[21,733,734,735,207],{},"Da jeder Shard in einem isolierten Thread läuft, haben sie keinen gemeinsamen Speicher. Wenn du globale Statistiken (wie die Gesamtanzahl aller Server oder Nutzer) abfragen möchtest, nutzt du ",[57,736,737],{},"broadcastEval",[50,739,741],{"className":74,"code":740,"language":76,"meta":7,"style":7},"\u002F\u002F Ermittlung der plattformweiten Server- und Nutzerzahlen\nexport async function getPlatformMetrics(manager: ShardingManager) {\n  const results = await manager.broadcastEval((client) => {\n    return {\n      guildCount: client.guilds.cache.size,\n      memberCount: client.guilds.cache.reduce((acc, g) => acc + g.memberCount, 0),\n      ping: client.ws.ping,\n    };\n  });\n\n  const totalGuilds = results.reduce((acc, cur) => acc + cur.guildCount, 0);\n  const totalMembers = results.reduce((acc, cur) => acc + cur.memberCount, 0);\n  const avgPing = Math.round(results.reduce((acc, cur) => acc + cur.ping, 0) \u002F results.length);\n\n  return { totalGuilds, totalMembers, avgPing };\n}\n",[57,742,743,748,775,809,816,843,903,924,929,937,941,990,1037,1108,1112,1132],{"__ignoreMap":7},[80,744,745],{"class":82,"line":83},[80,746,747],{"class":86},"\u002F\u002F Ermittlung der plattformweiten Server- und Nutzerzahlen\n",[80,749,750,753,756,759,762,764,766,768,771,773],{"class":82,"line":90},[80,751,752],{"class":93},"export",[80,754,755],{"class":154}," async",[80,757,758],{"class":154}," function",[80,760,761],{"class":167}," getPlatformMetrics",[80,763,309],{"class":97},[80,765,301],{"class":324},[80,767,207],{"class":97},[80,769,102],{"class":770},"sBMFI",[80,772,192],{"class":97},[80,774,197],{"class":97},[80,776,777,780,783,786,789,792,794,796,798,800,803,805,807],{"class":82,"line":124},[80,778,779],{"class":154},"  const",[80,781,782],{"class":101}," results",[80,784,785],{"class":97}," =",[80,787,788],{"class":93}," await",[80,790,791],{"class":101}," manager",[80,793,173],{"class":97},[80,795,737],{"class":167},[80,797,309],{"class":203},[80,799,309],{"class":97},[80,801,802],{"class":324},"client",[80,804,192],{"class":97},[80,806,330],{"class":154},[80,808,197],{"class":97},[80,810,811,814],{"class":82,"line":144},[80,812,813],{"class":93},"    return",[80,815,197],{"class":97},[80,817,818,821,823,826,828,831,833,836,838,841],{"class":82,"line":151},[80,819,820],{"class":203},"      guildCount",[80,822,207],{"class":97},[80,824,825],{"class":101}," client",[80,827,173],{"class":97},[80,829,830],{"class":101},"guilds",[80,832,173],{"class":97},[80,834,835],{"class":101},"cache",[80,837,173],{"class":97},[80,839,840],{"class":101},"size",[80,842,223],{"class":97},[80,844,845,848,850,852,854,856,858,860,862,865,867,869,872,874,877,879,881,884,887,889,891,894,896,899,901],{"class":82,"line":200},[80,846,847],{"class":203},"      memberCount",[80,849,207],{"class":97},[80,851,825],{"class":101},[80,853,173],{"class":97},[80,855,830],{"class":101},[80,857,173],{"class":97},[80,859,835],{"class":101},[80,861,173],{"class":97},[80,863,864],{"class":167},"reduce",[80,866,309],{"class":203},[80,868,309],{"class":97},[80,870,871],{"class":324},"acc",[80,873,182],{"class":97},[80,875,876],{"class":324}," g",[80,878,192],{"class":97},[80,880,330],{"class":154},[80,882,883],{"class":101}," acc",[80,885,886],{"class":97}," +",[80,888,876],{"class":101},[80,890,173],{"class":97},[80,892,893],{"class":101},"memberCount",[80,895,182],{"class":97},[80,897,898],{"class":581}," 0",[80,900,192],{"class":203},[80,902,223],{"class":97},[80,904,905,908,910,912,914,917,919,922],{"class":82,"line":226},[80,906,907],{"class":203},"      ping",[80,909,207],{"class":97},[80,911,825],{"class":101},[80,913,173],{"class":97},[80,915,916],{"class":101},"ws",[80,918,173],{"class":97},[80,920,921],{"class":101},"ping",[80,923,223],{"class":97},[80,925,926],{"class":82,"line":246},[80,927,928],{"class":97},"    };\n",[80,930,931,933,935],{"class":82,"line":263},[80,932,447],{"class":97},[80,934,192],{"class":203},[80,936,121],{"class":97},[80,938,939],{"class":82,"line":283},[80,940,148],{"emptyLinePlaceholder":147},[80,942,943,945,948,950,952,954,956,958,960,962,964,967,969,971,973,975,977,979,982,984,986,988],{"class":82,"line":293},[80,944,779],{"class":154},[80,946,947],{"class":101}," totalGuilds",[80,949,785],{"class":97},[80,951,782],{"class":101},[80,953,173],{"class":97},[80,955,864],{"class":167},[80,957,309],{"class":203},[80,959,309],{"class":97},[80,961,871],{"class":324},[80,963,182],{"class":97},[80,965,966],{"class":324}," cur",[80,968,192],{"class":97},[80,970,330],{"class":154},[80,972,883],{"class":101},[80,974,886],{"class":97},[80,976,966],{"class":101},[80,978,173],{"class":97},[80,980,981],{"class":101},"guildCount",[80,983,182],{"class":97},[80,985,898],{"class":581},[80,987,192],{"class":203},[80,989,121],{"class":97},[80,991,992,994,997,999,1001,1003,1005,1007,1009,1011,1013,1015,1017,1019,1021,1023,1025,1027,1029,1031,1033,1035],{"class":82,"line":298},[80,993,779],{"class":154},[80,995,996],{"class":101}," totalMembers",[80,998,785],{"class":97},[80,1000,782],{"class":101},[80,1002,173],{"class":97},[80,1004,864],{"class":167},[80,1006,309],{"class":203},[80,1008,309],{"class":97},[80,1010,871],{"class":324},[80,1012,182],{"class":97},[80,1014,966],{"class":324},[80,1016,192],{"class":97},[80,1018,330],{"class":154},[80,1020,883],{"class":101},[80,1022,886],{"class":97},[80,1024,966],{"class":101},[80,1026,173],{"class":97},[80,1028,893],{"class":101},[80,1030,182],{"class":97},[80,1032,898],{"class":581},[80,1034,192],{"class":203},[80,1036,121],{"class":97},[80,1038,1039,1041,1044,1046,1049,1051,1054,1056,1059,1061,1063,1065,1067,1069,1071,1073,1075,1077,1079,1081,1083,1085,1087,1089,1091,1094,1097,1099,1101,1104,1106],{"class":82,"line":335},[80,1040,779],{"class":154},[80,1042,1043],{"class":101}," avgPing",[80,1045,785],{"class":97},[80,1047,1048],{"class":101}," Math",[80,1050,173],{"class":97},[80,1052,1053],{"class":167},"round",[80,1055,309],{"class":203},[80,1057,1058],{"class":101},"results",[80,1060,173],{"class":97},[80,1062,864],{"class":167},[80,1064,309],{"class":203},[80,1066,309],{"class":97},[80,1068,871],{"class":324},[80,1070,182],{"class":97},[80,1072,966],{"class":324},[80,1074,192],{"class":97},[80,1076,330],{"class":154},[80,1078,883],{"class":101},[80,1080,886],{"class":97},[80,1082,966],{"class":101},[80,1084,173],{"class":97},[80,1086,921],{"class":101},[80,1088,182],{"class":97},[80,1090,898],{"class":581},[80,1092,1093],{"class":203},") ",[80,1095,1096],{"class":97},"\u002F",[80,1098,782],{"class":101},[80,1100,173],{"class":97},[80,1102,1103],{"class":101},"length",[80,1105,192],{"class":203},[80,1107,121],{"class":97},[80,1109,1110],{"class":82,"line":375},[80,1111,148],{"emptyLinePlaceholder":147},[80,1113,1114,1117,1119,1121,1123,1125,1127,1129],{"class":82,"line":380},[80,1115,1116],{"class":93},"  return",[80,1118,98],{"class":97},[80,1120,947],{"class":101},[80,1122,182],{"class":97},[80,1124,996],{"class":101},[80,1126,182],{"class":97},[80,1128,1043],{"class":101},[80,1130,1131],{"class":97}," };\n",[80,1133,1134],{"class":82,"line":408},[80,1135,1136],{"class":97},"}\n",[33,1138],{},[36,1140,1142],{"id":1141},"_4-discord-rest-rate-limit-buckets-meistern","4. Discord REST Rate-Limit Buckets meistern",[21,1144,1145],{},"Discord unterscheidet strikt zwischen Gateway-Limits (WebSockets) und REST-API-Limits (HTTP). Die REST-API nutzt ein Bucket-System, das über HTTP-Response-Header gesteuert wird:",[1147,1148,1149,1156,1162,1168],"ul",{},[1150,1151,1152,1155],"li",{},[57,1153,1154],{},"X-RateLimit-Limit",": Maximale Anzahl an Anfragen im aktuellen Zeitfenster.",[1150,1157,1158,1161],{},[57,1159,1160],{},"X-RateLimit-Remaining",": Verbleibende Anfragen.",[1150,1163,1164,1167],{},[57,1165,1166],{},"X-RateLimit-Reset-After",": Sekunden bis zum Reset des Buckets.",[1150,1169,1170,1173],{},[57,1171,1172],{},"X-RateLimit-Bucket",": Eindeutiger Hash des betroffenen Endpunkts.",[1175,1176,1178],"h3",{"id":1177},"best-practice-für-rest-queues","Best Practice für REST-Queues:",[21,1180,1181],{},"Wenn dein Bot Massen-Operationen ausführt (z. B. Rollen-Zuweisung an 500 Nutzer), nutze eine sequentielle Queue mit dynamischem Backoff:",[50,1183,1185],{"className":74,"code":1184,"language":76,"meta":7,"style":7},"export async function executeWithRateLimitRetry\u003CT>(fn: () => Promise\u003CT>, maxRetries = 3): Promise\u003CT> {\n  let attempt = 0;\n  while (attempt \u003C maxRetries) {\n    try {\n      return await fn();\n    } catch (error: any) {\n      if (error?.status === 429) {\n        const retryAfter = (error.rawError?.retry_after ?? 1) * 1000;\n        console.warn(`[RateLimit 429] Warte ${retryAfter}ms vor erneutem Versuch...`);\n        await new Promise((resolve) => setTimeout(resolve, retryAfter + 100));\n        attempt++;\n      } else {\n        throw error;\n      }\n    }\n  }\n  throw new Error(`Max retries (${maxRetries}) erreicht.`);\n}\n",[57,1186,1187,1248,1262,1281,1288,1302,1323,1348,1388,1420,1461,1469,1479,1489,1494,1499,1504,1537],{"__ignoreMap":7},[80,1188,1189,1191,1193,1195,1198,1201,1204,1207,1210,1212,1214,1216,1219,1221,1223,1226,1229,1231,1234,1237,1239,1241,1243,1246],{"class":82,"line":83},[80,1190,752],{"class":93},[80,1192,755],{"class":154},[80,1194,758],{"class":154},[80,1196,1197],{"class":167}," executeWithRateLimitRetry",[80,1199,1200],{"class":97},"\u003C",[80,1202,1203],{"class":770},"T",[80,1205,1206],{"class":97},">(",[80,1208,1209],{"class":167},"fn",[80,1211,207],{"class":97},[80,1213,401],{"class":97},[80,1215,330],{"class":154},[80,1217,1218],{"class":770}," Promise",[80,1220,1200],{"class":97},[80,1222,1203],{"class":770},[80,1224,1225],{"class":97},">,",[80,1227,1228],{"class":324}," maxRetries",[80,1230,785],{"class":97},[80,1232,1233],{"class":581}," 3",[80,1235,1236],{"class":97},"):",[80,1238,1218],{"class":770},[80,1240,1200],{"class":97},[80,1242,1203],{"class":770},[80,1244,1245],{"class":97},">",[80,1247,197],{"class":97},[80,1249,1250,1253,1256,1258,1260],{"class":82,"line":90},[80,1251,1252],{"class":154},"  let",[80,1254,1255],{"class":101}," attempt",[80,1257,785],{"class":97},[80,1259,898],{"class":581},[80,1261,121],{"class":97},[80,1263,1264,1267,1269,1272,1275,1277,1279],{"class":82,"line":124},[80,1265,1266],{"class":93},"  while",[80,1268,321],{"class":203},[80,1270,1271],{"class":101},"attempt",[80,1273,1274],{"class":97}," \u003C",[80,1276,1228],{"class":101},[80,1278,1093],{"class":203},[80,1280,554],{"class":97},[80,1282,1283,1286],{"class":82,"line":144},[80,1284,1285],{"class":93},"    try",[80,1287,197],{"class":97},[80,1289,1290,1293,1295,1298,1300],{"class":82,"line":151},[80,1291,1292],{"class":93},"      return",[80,1294,788],{"class":93},[80,1296,1297],{"class":167}," fn",[80,1299,617],{"class":203},[80,1301,121],{"class":97},[80,1303,1304,1307,1310,1312,1314,1316,1319,1321],{"class":82,"line":200},[80,1305,1306],{"class":97},"    }",[80,1308,1309],{"class":93}," catch",[80,1311,321],{"class":97},[80,1313,678],{"class":324},[80,1315,207],{"class":97},[80,1317,1318],{"class":770}," any",[80,1320,192],{"class":97},[80,1322,197],{"class":97},[80,1324,1325,1328,1330,1332,1335,1338,1341,1344,1346],{"class":82,"line":226},[80,1326,1327],{"class":93},"      if",[80,1329,321],{"class":203},[80,1331,678],{"class":101},[80,1333,1334],{"class":97},"?.",[80,1336,1337],{"class":101},"status",[80,1339,1340],{"class":97}," ===",[80,1342,1343],{"class":581}," 429",[80,1345,1093],{"class":203},[80,1347,554],{"class":97},[80,1349,1350,1353,1356,1358,1360,1362,1364,1367,1369,1372,1375,1378,1380,1383,1386],{"class":82,"line":246},[80,1351,1352],{"class":154},"        const",[80,1354,1355],{"class":101}," retryAfter",[80,1357,785],{"class":97},[80,1359,321],{"class":203},[80,1361,678],{"class":101},[80,1363,173],{"class":97},[80,1365,1366],{"class":101},"rawError",[80,1368,1334],{"class":97},[80,1370,1371],{"class":101},"retry_after",[80,1373,1374],{"class":97}," ??",[80,1376,1377],{"class":581}," 1",[80,1379,1093],{"class":203},[80,1381,1382],{"class":97},"*",[80,1384,1385],{"class":581}," 1000",[80,1387,121],{"class":97},[80,1389,1390,1393,1395,1397,1399,1401,1404,1406,1409,1411,1414,1416,1418],{"class":82,"line":263},[80,1391,1392],{"class":101},"        console",[80,1394,173],{"class":97},[80,1396,416],{"class":167},[80,1398,309],{"class":203},[80,1400,348],{"class":97},[80,1402,1403],{"class":114},"[RateLimit 429] Warte ",[80,1405,354],{"class":97},[80,1407,1408],{"class":101},"retryAfter",[80,1410,286],{"class":97},[80,1412,1413],{"class":114},"ms vor erneutem Versuch...",[80,1415,348],{"class":97},[80,1417,192],{"class":203},[80,1419,121],{"class":97},[80,1421,1422,1425,1427,1429,1431,1433,1436,1438,1440,1443,1445,1447,1449,1451,1453,1456,1459],{"class":82,"line":283},[80,1423,1424],{"class":93},"        await",[80,1426,164],{"class":97},[80,1428,1218],{"class":770},[80,1430,309],{"class":203},[80,1432,309],{"class":97},[80,1434,1435],{"class":324},"resolve",[80,1437,192],{"class":97},[80,1439,330],{"class":154},[80,1441,1442],{"class":167}," setTimeout",[80,1444,309],{"class":203},[80,1446,1435],{"class":101},[80,1448,182],{"class":97},[80,1450,1355],{"class":101},[80,1452,886],{"class":97},[80,1454,1455],{"class":581}," 100",[80,1457,1458],{"class":203},"))",[80,1460,121],{"class":97},[80,1462,1463,1466],{"class":82,"line":293},[80,1464,1465],{"class":101},"        attempt",[80,1467,1468],{"class":97},"++;\n",[80,1470,1471,1474,1477],{"class":82,"line":298},[80,1472,1473],{"class":97},"      }",[80,1475,1476],{"class":93}," else",[80,1478,197],{"class":97},[80,1480,1481,1484,1487],{"class":82,"line":335},[80,1482,1483],{"class":93},"        throw",[80,1485,1486],{"class":101}," error",[80,1488,121],{"class":97},[80,1490,1491],{"class":82,"line":375},[80,1492,1493],{"class":97},"      }\n",[80,1495,1496],{"class":82,"line":380},[80,1497,1498],{"class":97},"    }\n",[80,1500,1501],{"class":82,"line":408},[80,1502,1503],{"class":97},"  }\n",[80,1505,1506,1509,1511,1514,1516,1518,1521,1523,1526,1528,1531,1533,1535],{"class":82,"line":444},[80,1507,1508],{"class":93},"  throw",[80,1510,164],{"class":97},[80,1512,1513],{"class":167}," Error",[80,1515,309],{"class":203},[80,1517,348],{"class":97},[80,1519,1520],{"class":114},"Max retries (",[80,1522,354],{"class":97},[80,1524,1525],{"class":101},"maxRetries",[80,1527,286],{"class":97},[80,1529,1530],{"class":114},") erreicht.",[80,1532,348],{"class":97},[80,1534,192],{"class":203},[80,1536,121],{"class":97},[80,1538,1539],{"class":82,"line":454},[80,1540,1136],{"class":97},[33,1542],{},[36,1544,1546],{"id":1545},"_5-faustregeln-für-die-cluster-dimensionierung","5. Faustregeln für die Cluster-Dimensionierung",[1548,1549,1550,1556,1562],"ol",{},[1150,1551,1552,1555],{},[25,1553,1554],{},"Faustregel für Shard-Anzahl:"," Plane ca. 1.000 Server pro Shard ein (obwohl Discord bis zu 2.500 erlaubt). Ein Bot mit 4.000 Servern läuft mit 4–5 Shards deutlich stabiler als mit der Minimalanzahl von 2.",[1150,1557,1558,1561],{},[25,1559,1560],{},"CPU-Thread-Allokation:"," Teile Worker-Threads so auf, dass nicht mehr als 2 Shards auf demselben physischen CPU-Kern um Event-Loop-Zyklen konkurrieren.",[1150,1563,1564,1567,1568,1571],{},[25,1565,1566],{},"Automatisierte Überwachung:"," Auf KiroCloud wird die Gateway-Latenz (",[57,1569,1570],{},"ws.ping",") im Sekundentakt gemessen. Bei Latenzsprüngen über 250 ms sollte ein automatisierter Reconnect eingeleitet werden.",[1573,1574,1575],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":7,"searchDepth":90,"depth":90,"links":1577},[1578,1579,1580,1581,1584],{"id":38,"depth":90,"text":39},{"id":63,"depth":90,"text":64},{"id":730,"depth":90,"text":731},{"id":1141,"depth":90,"text":1142,"children":1582},[1583],{"id":1177,"depth":124,"text":1178},{"id":1545,"depth":90,"text":1546},"Sobald ein Discord-Bot auf mehr als 2.500 Servern (Guilds) aktiv ist, erzwingt Discord zwingend das sogenannte Gateway Sharding. Ohne Sharding verweigert das Discord Gateway Verbindungsanfragen. Doch auch unterhalb dieser Grenze ist Sharding die wichtigste Architekturmaßnahme zur Vermeidung von CPU-Bottlenecks, Gateway-Disconnects und globalen Rate-Limits.","md",{},0,"\u002Fdocs\u002Fde\u002Fdiscord-sharding-ratelimits",{"title":1591,"description":1585},{"Discord Gateway v10 Sharding & Rate Limiting":1592,"description":1593,"category":1594,"order":90,"author":1595,"readTime":1596,"lastUpdated":1597},"Architektur ab 2.500 Servern","Technischer Leitfaden zur Skalierung von Discord-Bots über 2.500 Server. Gateway Sharding, Bucket Rate Limits und verteilte Worker-Architektur.","engineering","Luca Lichtenwald","14 min","2026-10-09","docs\u002Fde\u002Fdiscord-sharding-ratelimits","n4NhAHgmlxn5UOIyaHYrLEMIwG7WnnvrLKdYT9KToFY",{"enabled":147,"clientPubId":1601,"docsSlotId":7,"newsSlotId":7,"guidesSlotId":7,"dashboardSlotId":7,"docsEnabled":147,"newsEnabled":147,"guidesEnabled":147,"dashboardEnabled":147},"ca-pub-9454065621077312"]