[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"public-branding":3,"content-de-webhooks-vs-rest-websockets":8,"public-ads-config":618},{"siteName":4,"primaryColor":5,"accentColor":6,"faviconUrl":7,"logoUrl":7},"KiroCloud","#ffffff","#888888","",{"id":9,"title":10,"author":11,"body":12,"category":11,"description":603,"extension":604,"lastUpdated":11,"meta":605,"navigation":445,"order":606,"path":607,"readTime":11,"seo":608,"stem":616,"__hash__":617},"docs\u002Fdocs\u002Fde\u002Fwebhooks-vs-rest-websockets.md","[object Object]",null,{"type":13,"value":14,"toc":597},"minimark",[15,20,37,40,43,48,58,60,64,67,155,165,167,171,174,190,521,523,527,530,593],[16,17,19],"h1",{"id":18},"discord-webhooks-vs-rest-vs-websockets-latenz-durchsatz-architektur-guide","Discord Webhooks vs REST vs WebSockets: Latenz, Durchsatz & Architektur-Guide",[21,22,23,24,28,29,32,33,36],"p",{},"Entwickler, die Integrationen für Discord bauen, stehen regelmäßig vor der Entscheidung: Sollte eine Funktion über ",[25,26,27],"strong",{},"Webhooks",", die klassische ",[25,30,31],{},"REST-API"," oder das persistente ",[25,34,35],{},"WebSocket-Gateway"," umgesetzt werden? Jedes Protokoll besitzt völlig unterschiedliche Latenzprofile, CPU-Kosten und Rate-Limit-Restriktionen.",[21,38,39],{},"In diesem Architektur-Leitfaden analysieren wir die Messwerte aus unseren Benchmarks und stellen eine praxiserprobte Entscheidungsmatrix vor.",[41,42],"hr",{},[44,45,47],"h2",{"id":46},"_1-das-protokoll-spektrum-im-überblick","1. Das Protokoll-Spektrum im Überblick",[49,50,55],"pre",{"className":51,"code":53,"language":54},[52],"language-text","┌────────────────────────────────────────────────────────────────────────┐\n│                        Discord API Protokolle                          │\n├───────────────────┬────────────────────────────┬───────────────────────┤\n│ Webhooks (HTTP)   │ REST API (HTTP)            │ WebSockets (Gateway)  │\n│ - Unidirektional  │ - Bidirektional (Req\u002FResp) │ - Vollduplex (Events) │\n│ - Token-spezifisch│ - Bot-Token autorisiert    │ - Persistente TCP-Verbindung\n│ - Schneller Post  │ - Vollständiges Datenmodell│ - Sub-Millisekunden Eventing\n└───────────────────┴────────────────────────────┴───────────────────────┘\n","text",[56,57,53],"code",{"__ignoreMap":7},[41,59],{},[44,61,63],{"id":62},"_2-benchmark-round-trip-latenzen-payload-overheads","2. Benchmark: Round-Trip-Latenzen & Payload-Overheads",[21,65,66],{},"Im KiroCloud-Labor haben wir 10.000 Operationen über die drei Protokolle gemessen (Verbindung von unserer deutschen Server-Infrastruktur nach Discord US-East):",[68,69,70,92],"table",{},[71,72,73],"thead",{},[74,75,76,80,83,86,89],"tr",{},[77,78,79],"th",{},"Protokoll",[77,81,82],{},"Mittlere Latenz (RTT)",[77,84,85],{},"TLS Handshake Overhead",[77,87,88],{},"Payload Overhead",[77,90,91],{},"Eignung",[93,94,95,115,134],"tbody",{},[74,96,97,103,106,109,112],{},[98,99,100],"td",{},[25,101,102],{},"Webhooks (HTTP POST)",[98,104,105],{},"~85 ms",[98,107,108],{},"Pro Verbindung (sofern kein Keep-Alive)",[98,110,111],{},"Gering (reines JSON)",[98,113,114],{},"Benachrichtigungen, CI\u002FCD, Logs",[74,116,117,122,125,128,131],{},[98,118,119],{},[25,120,121],{},"REST API (HTTP)",[98,123,124],{},"~92 ms",[98,126,127],{},"Pro Verbindung \u002F Connection Pool",[98,129,130],{},"Mittel (inkl. Auth-Header)",[98,132,133],{},"CRUD-Operationen, Rollen, Kanäle",[74,135,136,141,146,149,152],{},[98,137,138],{},[25,139,140],{},"WebSocket Gateway",[98,142,143],{},[25,144,145],{},"\u003C 15 ms",[98,147,148],{},"Einmalig beim Start (TCP Session)",[98,150,151],{},"Extrem gering (Zlib-Stream)",[98,153,154],{},"Interaktionen, Slash Commands, Chat",[156,157,158],"blockquote",{},[21,159,160,164],{},[161,162,163],"span",{},"!NOTE","\nDas WebSocket-Gateway benötigt nach dem initialen Handshake keinen wiederholten TLS-Aufbau. Ereignisse werden sofort als binäre Frames über die bestehende TCP-Verbindung gestreamt.",[41,166],{},[44,168,170],{"id":169},"_3-webhooks-der-performante-weg-für-einweg-nachrichten","3. Webhooks: Der performante Weg für Einweg-Nachrichten",[21,172,173],{},"Wenn du lediglich Logs (z. B. Server-Starts, Ticket-Benachrichtigungen oder Bann-Meldungen) posten möchtest, ist ein Webhook einem vollständigen Bot-Client haushoch überlegen:",[175,176,177,184],"ul",{},[178,179,180,183],"li",{},[25,181,182],{},"Kein Bot-Login erforderlich:"," Spart ca. 80–120 MB Node.js Heap-Speicher.",[178,185,186,189],{},[25,187,188],{},"Eigene Rate-Limits:"," Webhooks haben separate Rate-Limit-Buckets (typischerweise 5 Requests alle 2 Sekunden pro Webhook), die das globale Bot-Limit nicht belasten.",[49,191,195],{"className":192,"code":193,"language":194,"meta":7,"style":7},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export async function sendWebhookLog(webhookUrl: string, content: string, embedData: any) {\n  const response = await fetch(webhookUrl, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application\u002Fjson' },\n    body: JSON.stringify({\n      username: 'KiroCloud Alert Dispatcher',\n      avatar_url: 'https:\u002F\u002Fkirocloud.de\u002Ffavicon.svg',\n      content,\n      embeds: [embedData],\n    }),\n  });\n\n  if (!response.ok) {\n    throw new Error(`Webhook dispatch failed with HTTP ${response.status}`);\n  }\n}\n","typescript",[56,196,197,257,285,306,336,358,375,392,400,419,429,440,447,472,509,515],{"__ignoreMap":7},[161,198,201,205,209,212,216,220,224,227,231,234,237,239,241,243,246,248,251,254],{"class":199,"line":200},"line",1,[161,202,204],{"class":203},"s7zQu","export",[161,206,208],{"class":207},"spNyl"," async",[161,210,211],{"class":207}," function",[161,213,215],{"class":214},"s2Zo4"," sendWebhookLog",[161,217,219],{"class":218},"sMK4o","(",[161,221,223],{"class":222},"sHdIc","webhookUrl",[161,225,226],{"class":218},":",[161,228,230],{"class":229},"sBMFI"," string",[161,232,233],{"class":218},",",[161,235,236],{"class":222}," content",[161,238,226],{"class":218},[161,240,230],{"class":229},[161,242,233],{"class":218},[161,244,245],{"class":222}," embedData",[161,247,226],{"class":218},[161,249,250],{"class":229}," any",[161,252,253],{"class":218},")",[161,255,256],{"class":218}," {\n",[161,258,260,263,267,270,273,276,279,281,283],{"class":199,"line":259},2,[161,261,262],{"class":207},"  const",[161,264,266],{"class":265},"sTEyZ"," response",[161,268,269],{"class":218}," =",[161,271,272],{"class":203}," await",[161,274,275],{"class":214}," fetch",[161,277,219],{"class":278},"swJcz",[161,280,223],{"class":265},[161,282,233],{"class":218},[161,284,256],{"class":218},[161,286,288,291,293,296,300,303],{"class":199,"line":287},3,[161,289,290],{"class":278},"    method",[161,292,226],{"class":218},[161,294,295],{"class":218}," '",[161,297,299],{"class":298},"sfazB","POST",[161,301,302],{"class":218},"'",[161,304,305],{"class":218},",\n",[161,307,309,312,314,317,319,322,324,326,328,331,333],{"class":199,"line":308},4,[161,310,311],{"class":278},"    headers",[161,313,226],{"class":218},[161,315,316],{"class":218}," {",[161,318,295],{"class":218},[161,320,321],{"class":278},"Content-Type",[161,323,302],{"class":218},[161,325,226],{"class":218},[161,327,295],{"class":218},[161,329,330],{"class":298},"application\u002Fjson",[161,332,302],{"class":218},[161,334,335],{"class":218}," },\n",[161,337,339,342,344,347,350,353,355],{"class":199,"line":338},5,[161,340,341],{"class":278},"    body",[161,343,226],{"class":218},[161,345,346],{"class":265}," JSON",[161,348,349],{"class":218},".",[161,351,352],{"class":214},"stringify",[161,354,219],{"class":278},[161,356,357],{"class":218},"{\n",[161,359,361,364,366,368,371,373],{"class":199,"line":360},6,[161,362,363],{"class":278},"      username",[161,365,226],{"class":218},[161,367,295],{"class":218},[161,369,370],{"class":298},"KiroCloud Alert Dispatcher",[161,372,302],{"class":218},[161,374,305],{"class":218},[161,376,378,381,383,385,388,390],{"class":199,"line":377},7,[161,379,380],{"class":278},"      avatar_url",[161,382,226],{"class":218},[161,384,295],{"class":218},[161,386,387],{"class":298},"https:\u002F\u002Fkirocloud.de\u002Ffavicon.svg",[161,389,302],{"class":218},[161,391,305],{"class":218},[161,393,395,398],{"class":199,"line":394},8,[161,396,397],{"class":265},"      content",[161,399,305],{"class":218},[161,401,403,406,408,411,414,417],{"class":199,"line":402},9,[161,404,405],{"class":278},"      embeds",[161,407,226],{"class":218},[161,409,410],{"class":278}," [",[161,412,413],{"class":265},"embedData",[161,415,416],{"class":278},"]",[161,418,305],{"class":218},[161,420,422,425,427],{"class":199,"line":421},10,[161,423,424],{"class":218},"    }",[161,426,253],{"class":278},[161,428,305],{"class":218},[161,430,432,435,437],{"class":199,"line":431},11,[161,433,434],{"class":218},"  }",[161,436,253],{"class":278},[161,438,439],{"class":218},";\n",[161,441,443],{"class":199,"line":442},12,[161,444,446],{"emptyLinePlaceholder":445},true,"\n",[161,448,450,453,456,459,462,464,467,470],{"class":199,"line":449},13,[161,451,452],{"class":203},"  if",[161,454,455],{"class":278}," (",[161,457,458],{"class":218},"!",[161,460,461],{"class":265},"response",[161,463,349],{"class":218},[161,465,466],{"class":265},"ok",[161,468,469],{"class":278},") ",[161,471,357],{"class":218},[161,473,475,478,481,484,486,489,492,495,497,499,502,505,507],{"class":199,"line":474},14,[161,476,477],{"class":203},"    throw",[161,479,480],{"class":218}," new",[161,482,483],{"class":214}," Error",[161,485,219],{"class":278},[161,487,488],{"class":218},"`",[161,490,491],{"class":298},"Webhook dispatch failed with HTTP ",[161,493,494],{"class":218},"${",[161,496,461],{"class":265},[161,498,349],{"class":218},[161,500,501],{"class":265},"status",[161,503,504],{"class":218},"}`",[161,506,253],{"class":278},[161,508,439],{"class":218},[161,510,512],{"class":199,"line":511},15,[161,513,514],{"class":218},"  }\n",[161,516,518],{"class":199,"line":517},16,[161,519,520],{"class":218},"}\n",[41,522],{},[44,524,526],{"id":525},"_4-entscheidungsmatrix-für-cloud-entwickler","4. Entscheidungsmatrix für Cloud-Entwickler",[21,528,529],{},"Nutze folgende Richtlinie für deine KiroCloud-Applikationen:",[531,532,533,550,566],"ol",{},[178,534,535,538,539],{},[25,536,537],{},"Wähle Webhooks",", wenn du:",[175,540,541,544,547],{},[178,542,543],{},"Git-Commits, GitHub Actions oder CI\u002FCD-Pipelines nach Discord meldest.",[178,545,546],{},"Server-Logs und Crash-Berichte von Minecraft- oder FiveM-Servern streamst.",[178,548,549],{},"Keine Antworten auf Nachrichten oder Button-Klicks benötigst.",[178,551,552,538,555],{},[25,553,554],{},"Wähle die REST-API",[175,556,557,560,563],{},[178,558,559],{},"Server-Strukturen anlegst (Kanalerstellung, Rollenverwaltung).",[178,561,562],{},"Vergangene Chatverläufe nachlädst oder Ticket-Transkripte exportierst.",[178,564,565],{},"Interaktive Web-Dashboards baust, die Einstellungen abfragen.",[178,567,568,538,571],{},[25,569,570],{},"Wähle WebSockets (Bot Gateway)",[175,572,573,587,590],{},[178,574,575,576,579,580,579,583,586],{},"Slash Commands (",[56,577,578],{},"\u002Fhelp",", ",[56,581,582],{},"\u002Fban",[56,584,585],{},"\u002Fverify",") in Echtzeit verarbeitest.",[178,588,589],{},"Benutzer-Interaktionen (Buttons, Dropdown-Menüs, Modals) empfängst.",[178,591,592],{},"Voice-Kanäle verbindest und Audio streamst.",[594,595,596],"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 .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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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);}",{"title":7,"searchDepth":259,"depth":259,"links":598},[599,600,601,602],{"id":46,"depth":259,"text":47},{"id":62,"depth":259,"text":63},{"id":169,"depth":259,"text":170},{"id":525,"depth":259,"text":526},"Entwickler, die Integrationen für Discord bauen, stehen regelmäßig vor der Entscheidung: Sollte eine Funktion über Webhooks, die klassische REST-API oder das persistente WebSocket-Gateway umgesetzt werden? Jedes Protokoll besitzt völlig unterschiedliche Latenzprofile, CPU-Kosten und Rate-Limit-Restriktionen.","md",{},0,"\u002Fdocs\u002Fde\u002Fwebhooks-vs-rest-websockets",{"title":609,"description":603},{"Discord Webhooks vs REST vs WebSockets":610,"description":611,"category":612,"order":200,"author":613,"readTime":614,"lastUpdated":615},"Latenz, Durchsatz & Architektur-Guide","Technischer Vergleich der Discord-Kommunikationsprotokolle. Round-Trip-Latenzen, Payload-Overheads, Rate-Limits und Architektur-Entscheidungsmatrix.","architecture","Luca Lichtenwald","12 min","2026-10-09","docs\u002Fde\u002Fwebhooks-vs-rest-websockets","4chu8F8OwKvCoxTF-Wgz8VBRywQc8AP4cnnPJ9M5_xQ",{"enabled":445,"clientPubId":619,"docsSlotId":7,"newsSlotId":7,"guidesSlotId":7,"dashboardSlotId":7,"docsEnabled":445,"newsEnabled":445,"guidesEnabled":445,"dashboardEnabled":445},"ca-pub-9454065621077312"]