[{"data":1,"prerenderedAt":734},["ShallowReactive",2],{"footer-compare-de":3,"dynamicForm-newsletter-de":24,"mdc--4uzlmi-key":55,"\u002Fde\u002Farchitecture\u002Fcore-engine-de":77},[4,8,12,16,20],{"path":5,"competitorName":6,"title":7},"\u002Fmake","Make","dataflows vs Make",{"path":9,"competitorName":10,"title":11},"\u002Fpipedream","Pipedream","dataflows vs Pipedream",{"path":13,"competitorName":14,"title":15},"\u002Fpower-automate","Power Automate","dataflows vs Power Automate",{"path":17,"competitorName":18,"title":19},"\u002Fzapier","Zapier","dataflows vs Zapier",{"path":21,"competitorName":22,"title":23},"\u002Fn8n","n8n","dataflows vs n8n",{"id":25,"title":26,"apiEndpoint":27,"body":28,"description":28,"extension":29,"fields":30,"mail":43,"meta":46,"navigation":35,"path":47,"seo":48,"stem":49,"submitButtonLabel":50,"successMsg":51,"__hash__":54},"forms_de\u002Fnewsletter.yml","Newsletter","\u002Fapi\u002FdynamicFormsInbox",null,"yml",[31,38],{"name":32,"type":32,"label":33,"placeholder":34,"required":35,"validationError":36,"width":37},"email","E-Mail","deine@email.de",true,"Bitte gib eine gültige E-Mail-Adresse an","full",{"name":39,"type":40,"label":41,"required":35,"validationError":42,"width":37},"privacy","checkbox","Ich stimme der [Datenschutzerklärung](\u002Fde\u002Fprivacy) zu","Bitte stimme der Datenschutzerklärung zu",{"to":44,"subject":45},"info@nbrx.com","Neues Newsletter-Abo",{},"\u002Fnewsletter",{"title":26},"newsletter","Abonnieren",{"title":52,"description":53},"Fast geschafft","Wir haben dir eine Bestätigungs-E-Mail geschickt – bitte schau kurz rein.","revae07UJt6EZkkQ6uf8RmCpu7w1TTPocdQKkKUB2LQ",{"data":56,"body":57},{},{"type":58,"children":59},"root",[60],{"type":61,"tag":62,"props":63,"children":64},"element","p",{},[65,68,75],{"type":66,"value":67},"text","Ich stimme der ",{"type":61,"tag":69,"props":70,"children":72},"a",{"href":71},"\u002Fde\u002Fprivacy",[73],{"type":66,"value":74},"Datenschutzerklärung",{"type":66,"value":76}," zu",{"id":78,"title":79,"body":80,"description":724,"extension":725,"icon":726,"meta":727,"navigation":35,"path":728,"seo":729,"stem":732,"__hash__":733},"architecture_de\u002Fcore-engine.md","Core-Engine-Architektur",{"type":81,"value":82,"toc":716},"minimark",[83,88,91,99,121,124,128,134,139,142,162,166,182,486,489,588,592,595,712],[84,85,87],"h2",{"id":86},"aus-erfahrung-gewachsen","Aus Erfahrung gewachsen",[62,89,90],{},"Diese Architektur ist keine akademische Übung. Sie ist das Ergebnis jahrelanger Arbeit an geschäftskritischen Automatisierungs-Systemen. Wir haben jeden denkbaren Failure-Mode gesehen: API-Rate-Limits, Datenbank-Timeouts, Worker-Crashes, Memory-Leaks.",[62,92,93,94,98],{},"Deshalb bauen wir auf bewährter ",[95,96,97],"strong",{},"Open-Source","-Technologie auf – statt eigene Black-Boxes zu erfinden.",[100,101,102,109,115],"ul",{},[103,104,105,108],"li",{},[95,106,107],{},"Runtime",": Node.js & Nitro für hochperformante asynchrone I\u002FO.",[103,110,111,114],{},[95,112,113],{},"Datenbank",": PostgreSQL für verlässliche, ACID-konforme State-Speicherung.",[103,116,117,120],{},[95,118,119],{},"Engine",": Durable-Execution-Engine für resumable Workflows.",[62,122,123],{},"Mit diesen kampferprobten Komponenten fokussieren wir unsere Innovation auf das, was zählt: die Workflow-Abstraktion selbst – nicht das Plumbing.",[84,125,127],{"id":126},"durable-execution","Durable Execution",[62,129,130,131,133],{},"dataflows ist auf dem Konzept der ",[95,132,127],{}," aufgebaut. Statt Queues, Wiederholungen und State manuell zu verwalten, schreibst du Standard-TypeScript-Code – die Engine macht ihn automatisch durable.",[135,136,138],"h3",{"id":137},"reliability-as-code","Reliability-as-Code",[62,140,141],{},"Weg von handgerollten Queues und Custom-Retries – hin zu durablem, resumable Code.",[100,143,144,150,156],{},[103,145,146,149],{},[95,147,148],{},"Keine Queues",": Du definierst keine Queues oder Worker. Du deklarierst einen Workflow und löst ihn aus.",[103,151,152,155],{},[95,153,154],{},"Keine Timeouts",": Workflows können Sekunden, Tage oder Monate laufen.",[103,157,158,161],{},[95,159,160],{},"Resumable",": Stürzt der Prozess ab, läuft er genau dort weiter, wo er aufgehört hat.",[135,163,165],{"id":164},"workflows-und-steps","Workflows und Steps",[62,167,168,169,173,174,177,178,181],{},"Ein Workflow wird mit ",[170,171,172],"code",{},"defineWorkflow"," definiert. Innerhalb seiner ",[170,175,176],{},"run","-Funktion ist jeder in ",[170,179,180],{},"step.run(...)"," gewrappte Aufruf ein atomarer, memoisierter Schritt. Die Engine persistiert das Ergebnis jedes Schritts in PostgreSQL – stürzt der Prozess ab und startet neu, werden bereits ausgeführte Schritte übersprungen und aus dem Cache repliziert.",[183,184,189],"pre",{"className":185,"code":186,"language":187,"meta":188,"style":188},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export const copyToClickUp = defineWorkflow({\n  id: 'copy-to-clickup',\n  trigger: azure.onWorkItemCreated(),\n\n  async run({ event, step }) {\n    \u002F\u002F Jeder Schritt läuft einmal. Beim Replay wird das Ergebnis\n    \u002F\u002F aus der DB geholt, statt die API erneut zu treffen.\n    const item = await step.run('fetch-item', () =>\n      azure.getWorkItem({ id: event.payload.id })\n    )\n\n    const task = await step.run('create-task', () =>\n      clickup.createTask(item)\n    )\n\n    return task\n  }\n})\n","typescript","",[170,190,191,222,245,267,273,301,308,314,352,391,397,402,435,453,458,463,472,478],{"__ignoreMap":188},[192,193,196,200,204,208,212,216,219],"span",{"class":194,"line":195},"line",1,[192,197,199],{"class":198},"s7zQu","export",[192,201,203],{"class":202},"spNyl"," const",[192,205,207],{"class":206},"sTEyZ"," copyToClickUp ",[192,209,211],{"class":210},"sMK4o","=",[192,213,215],{"class":214},"s2Zo4"," defineWorkflow",[192,217,218],{"class":206},"(",[192,220,221],{"class":210},"{\n",[192,223,225,229,232,235,239,242],{"class":194,"line":224},2,[192,226,228],{"class":227},"swJcz","  id",[192,230,231],{"class":210},":",[192,233,234],{"class":210}," '",[192,236,238],{"class":237},"sfazB","copy-to-clickup",[192,240,241],{"class":210},"'",[192,243,244],{"class":210},",\n",[192,246,248,251,253,256,259,262,265],{"class":194,"line":247},3,[192,249,250],{"class":227},"  trigger",[192,252,231],{"class":210},[192,254,255],{"class":206}," azure",[192,257,258],{"class":210},".",[192,260,261],{"class":214},"onWorkItemCreated",[192,263,264],{"class":206},"()",[192,266,244],{"class":210},[192,268,270],{"class":194,"line":269},4,[192,271,272],{"emptyLinePlaceholder":35},"\n",[192,274,276,279,282,285,289,292,295,298],{"class":194,"line":275},5,[192,277,278],{"class":202},"  async",[192,280,281],{"class":227}," run",[192,283,284],{"class":210},"({",[192,286,288],{"class":287},"sHdIc"," event",[192,290,291],{"class":210},",",[192,293,294],{"class":287}," step",[192,296,297],{"class":210}," })",[192,299,300],{"class":210}," {\n",[192,302,304],{"class":194,"line":303},6,[192,305,307],{"class":306},"sHwdD","    \u002F\u002F Jeder Schritt läuft einmal. Beim Replay wird das Ergebnis\n",[192,309,311],{"class":194,"line":310},7,[192,312,313],{"class":306},"    \u002F\u002F aus der DB geholt, statt die API erneut zu treffen.\n",[192,315,317,320,323,326,329,331,333,335,337,339,342,344,346,349],{"class":194,"line":316},8,[192,318,319],{"class":202},"    const",[192,321,322],{"class":206}," item",[192,324,325],{"class":210}," =",[192,327,328],{"class":198}," await",[192,330,294],{"class":206},[192,332,258],{"class":210},[192,334,176],{"class":214},[192,336,218],{"class":227},[192,338,241],{"class":210},[192,340,341],{"class":237},"fetch-item",[192,343,241],{"class":210},[192,345,291],{"class":210},[192,347,348],{"class":210}," ()",[192,350,351],{"class":202}," =>\n",[192,353,355,358,360,363,365,368,371,373,375,377,380,382,385,388],{"class":194,"line":354},9,[192,356,357],{"class":206},"      azure",[192,359,258],{"class":210},[192,361,362],{"class":214},"getWorkItem",[192,364,218],{"class":227},[192,366,367],{"class":210},"{",[192,369,370],{"class":227}," id",[192,372,231],{"class":210},[192,374,288],{"class":206},[192,376,258],{"class":210},[192,378,379],{"class":206},"payload",[192,381,258],{"class":210},[192,383,384],{"class":206},"id",[192,386,387],{"class":210}," }",[192,389,390],{"class":227},")\n",[192,392,394],{"class":194,"line":393},10,[192,395,396],{"class":227},"    )\n",[192,398,400],{"class":194,"line":399},11,[192,401,272],{"emptyLinePlaceholder":35},[192,403,405,407,410,412,414,416,418,420,422,424,427,429,431,433],{"class":194,"line":404},12,[192,406,319],{"class":202},[192,408,409],{"class":206}," task",[192,411,325],{"class":210},[192,413,328],{"class":198},[192,415,294],{"class":206},[192,417,258],{"class":210},[192,419,176],{"class":214},[192,421,218],{"class":227},[192,423,241],{"class":210},[192,425,426],{"class":237},"create-task",[192,428,241],{"class":210},[192,430,291],{"class":210},[192,432,348],{"class":210},[192,434,351],{"class":202},[192,436,438,441,443,446,448,451],{"class":194,"line":437},13,[192,439,440],{"class":206},"      clickup",[192,442,258],{"class":210},[192,444,445],{"class":214},"createTask",[192,447,218],{"class":227},[192,449,450],{"class":206},"item",[192,452,390],{"class":227},[192,454,456],{"class":194,"line":455},14,[192,457,396],{"class":227},[192,459,461],{"class":194,"line":460},15,[192,462,272],{"emptyLinePlaceholder":35},[192,464,466,469],{"class":194,"line":465},16,[192,467,468],{"class":198},"    return",[192,470,471],{"class":206}," task\n",[192,473,475],{"class":194,"line":474},17,[192,476,477],{"class":210},"  }\n",[192,479,481,484],{"class":194,"line":480},18,[192,482,483],{"class":210},"}",[192,485,390],{"class":206},[62,487,488],{},"Workflows können auch pausieren und auf externe Signale oder Zeit warten:",[183,490,492],{"className":185,"code":491,"language":187,"meta":188,"style":188},"\u002F\u002F Auf eine menschliche Freigabe warten und dann weitermachen – auch Tage später\nconst decision = await step.waitForEvent('approval', {\n  timeout: '7d'\n})\n\nawait step.sleep('cooldown', '24h')\n",[170,493,494,499,531,546,552,556],{"__ignoreMap":188},[192,495,496],{"class":194,"line":195},[192,497,498],{"class":306},"\u002F\u002F Auf eine menschliche Freigabe warten und dann weitermachen – auch Tage später\n",[192,500,501,504,507,509,511,513,515,518,520,522,525,527,529],{"class":194,"line":224},[192,502,503],{"class":202},"const",[192,505,506],{"class":206}," decision ",[192,508,211],{"class":210},[192,510,328],{"class":198},[192,512,294],{"class":206},[192,514,258],{"class":210},[192,516,517],{"class":214},"waitForEvent",[192,519,218],{"class":206},[192,521,241],{"class":210},[192,523,524],{"class":237},"approval",[192,526,241],{"class":210},[192,528,291],{"class":210},[192,530,300],{"class":210},[192,532,533,536,538,540,543],{"class":194,"line":247},[192,534,535],{"class":227},"  timeout",[192,537,231],{"class":210},[192,539,234],{"class":210},[192,541,542],{"class":237},"7d",[192,544,545],{"class":210},"'\n",[192,547,548,550],{"class":194,"line":269},[192,549,483],{"class":210},[192,551,390],{"class":206},[192,553,554],{"class":194,"line":275},[192,555,272],{"emptyLinePlaceholder":35},[192,557,558,561,563,565,568,570,572,575,577,579,581,584,586],{"class":194,"line":303},[192,559,560],{"class":198},"await",[192,562,294],{"class":206},[192,564,258],{"class":210},[192,566,567],{"class":214},"sleep",[192,569,218],{"class":206},[192,571,241],{"class":210},[192,573,574],{"class":237},"cooldown",[192,576,241],{"class":210},[192,578,291],{"class":210},[192,580,234],{"class":210},[192,582,583],{"class":237},"24h",[192,585,241],{"class":210},[192,587,390],{"class":206},[135,589,591],{"id":590},"execution-flow","Execution-Flow",[62,593,594],{},"Die Engine verwaltet den Execution-State in PostgreSQL. Schläft ein Workflow oder wartet er auf ein Event, gibt er seinen State ab und gibt Compute-Ressourcen frei.",[183,596,600],{"className":597,"code":598,"language":599,"meta":188,"style":188},"language-mermaid shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sequenceDiagram\n    participant Webhook\n    participant API\n    participant Engine\n    participant DB\n\n    Webhook->>API: POST \u002Fhooks\u002Fshopify\n    API->>Engine: Workflow starten\n    API-->>Webhook: 202 Accepted\n\n    Engine->>DB: Execution anlegen\n    Engine->>Engine: Step 1 ausführen\n    Engine->>DB: Ergebnis 1 speichern\n    Engine->>Engine: Step 2 ausführen\n    Engine->>DB: Ergebnis 2 speichern\n\n    Engine->>DB: Suspendieren (Sleep\u002FWait)\n    Note right of Engine: Ressourcen freigegeben\n\n    Engine->>DB: Resume (Timer\u002FEvent)\n    Engine->>Engine: Steps replayen (gecached)\n    Engine->>Engine: Step 3 ausführen\n","mermaid",[170,601,602,607,612,617,622,627,631,636,641,646,650,655,660,665,670,675,679,684,689,694,700,706],{"__ignoreMap":188},[192,603,604],{"class":194,"line":195},[192,605,606],{},"sequenceDiagram\n",[192,608,609],{"class":194,"line":224},[192,610,611],{},"    participant Webhook\n",[192,613,614],{"class":194,"line":247},[192,615,616],{},"    participant API\n",[192,618,619],{"class":194,"line":269},[192,620,621],{},"    participant Engine\n",[192,623,624],{"class":194,"line":275},[192,625,626],{},"    participant DB\n",[192,628,629],{"class":194,"line":303},[192,630,272],{"emptyLinePlaceholder":35},[192,632,633],{"class":194,"line":310},[192,634,635],{},"    Webhook->>API: POST \u002Fhooks\u002Fshopify\n",[192,637,638],{"class":194,"line":316},[192,639,640],{},"    API->>Engine: Workflow starten\n",[192,642,643],{"class":194,"line":354},[192,644,645],{},"    API-->>Webhook: 202 Accepted\n",[192,647,648],{"class":194,"line":393},[192,649,272],{"emptyLinePlaceholder":35},[192,651,652],{"class":194,"line":399},[192,653,654],{},"    Engine->>DB: Execution anlegen\n",[192,656,657],{"class":194,"line":404},[192,658,659],{},"    Engine->>Engine: Step 1 ausführen\n",[192,661,662],{"class":194,"line":437},[192,663,664],{},"    Engine->>DB: Ergebnis 1 speichern\n",[192,666,667],{"class":194,"line":455},[192,668,669],{},"    Engine->>Engine: Step 2 ausführen\n",[192,671,672],{"class":194,"line":460},[192,673,674],{},"    Engine->>DB: Ergebnis 2 speichern\n",[192,676,677],{"class":194,"line":465},[192,678,272],{"emptyLinePlaceholder":35},[192,680,681],{"class":194,"line":474},[192,682,683],{},"    Engine->>DB: Suspendieren (Sleep\u002FWait)\n",[192,685,686],{"class":194,"line":480},[192,687,688],{},"    Note right of Engine: Ressourcen freigegeben\n",[192,690,692],{"class":194,"line":691},19,[192,693,272],{"emptyLinePlaceholder":35},[192,695,697],{"class":194,"line":696},20,[192,698,699],{},"    Engine->>DB: Resume (Timer\u002FEvent)\n",[192,701,703],{"class":194,"line":702},21,[192,704,705],{},"    Engine->>Engine: Steps replayen (gecached)\n",[192,707,709],{"class":194,"line":708},22,[192,710,711],{},"    Engine->>Engine: Step 3 ausführen\n",[713,714,715],"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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .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":188,"searchDepth":224,"depth":224,"links":717},[718,719],{"id":86,"depth":224,"text":87},{"id":126,"depth":224,"text":127,"children":720},[721,722,723],{"id":137,"depth":247,"text":138},{"id":164,"depth":247,"text":165},{"id":590,"depth":247,"text":591},"Wie dataflows Workflows auch im großen Maßstab verlässlich ausführt.","md","i-lucide-cpu",{},"\u002Fcore-engine",{"title":730,"description":731},"dataflows-Engine-Architektur","Tiefer Blick in die event-getriebene Architektur von dataflows.","core-engine","fFT16c_2QmaPxsKT46eVyW3iXInfj2FwIcoDaQZIEs8",1776797949729]