Att bygga ett arbetsflödessystem med HTMX och ASP.NET Core - Del 1: Introduktion
Inledning
Arbetsflödessystem finns överallt i moderna applikationer - från enkla godkännandeprocesser till komplexa flerstegsautomatiseringar.
Även om det finns utmärkta kommersiella lösningar som Temporal, Airflow, och n8n, ibland behöver du något skräddarsytt för dina specifika behov.
- I den här serien går jag igenom ett komplett arbetsflödessystem från grunden med hjälp av ASP.NET Core, HTMX, Alpine.js och Hangfire.
- I slutet av denna serie har du ett fullt fungerande arbetsflödessystem med:
- En visuell nodbaserad editor för att bygga arbetsflöden
- JSON-definierade arbetsflöden noder med ingångar, utgångar och villkor
- En egen exekveringsmotor för arbetsflöden
- Bakgrund jobbhantering med Hangfire för röstning fjärr API:er
Statlig förvaltning och ihållande verksamhet
En instrumentpanel för övervakning av arbetsflödets utförande
Varför bygga ditt eget arbetsflödessystem?
- Innan du dyker in, låt oss tala till elefanten i rummet: varför inte använda en befintlig lösning?
- När du ska bygga ditt eget:
- Du behöver djup integration med din befintliga applikation
- Du har specifik affärslogik som inte passar in i generiska arbetsflödesverktyg
- Du vill ha full kontroll över exekveringsmodell och skalning
Du måste minimera externa beroenden
- Du vill lära dig hur arbetsflödessystem fungerar under huven
- När du ska använda befintliga verktyg:
- Du behöver en beprövad, stridsprövad lösning omedelbart
Du behöver funktioner som distribuerad körning över många maskiner
Du har inte tid att bygga och underhålla anpassad infrastruktur
För denna serie väljer vi att bygga våra egna eftersom det ger oss fullständig flexibilitet och är en utmärkt inlärningsmöjlighet.
Vad vi bygger
Vårt arbetsflödessystem kommer att stödja flera nyckelkoncept:
- **1. Vad är det som händer?**Noder
- **Noder är byggstenarna i arbetsflöden.**Varje nod representerar en diskret åtgärd eller beslutspunkt.
- **Exempel:**HTTP- begärans nod
- : Ringer API-samtal till externa tjänsterVillkorsnod
- : Utvärderar uttryck och filialer verkställandeFörvandla nod
: Processdata (JSON-manipulering, filtrering osv.)
Försenad nod
: Väntar på en viss tid
Utlösande nod
- : Startar ett arbetsflöde baserat på händelser eller scheman
- Två.
- Arbetsflöden
- Ett arbetsflöde är en riktad graf av anslutna noder.
- Data flödar från en nod till en annan genom anslutningar, med varje nod bearbetning och omvandla data vid behov.
3. Vad är det som händer?
Körningsgränssnitt
- Den motor som tolkar arbetsflödesdefinitionen och utför noder i rätt ordning, hanterar:
- Sekventiellt genomförande
- Parallellt utförande (när noder inte beror på varandra)
- Villkorlig förgrening
- Felhantering och retries
Tillståndets varaktighet
Fyra.
- Visuell editorName
- Ett webbaserat användargränssnitt där användare kan:
- Dra och släpp noder på en duk
- Anslut noder genom att rita kanter mellan dem
Anpassa nodegenskaper
Testarbetsflöden
Visa körhistorik
- **För att uppnå detta mål har kommissionen beslutat att inleda ett förfarande enligt artikel 108.2 i fördraget om Europeiska unionens funktionssätt (nedan kallat EUF-fördraget).**Bakgrundsbehandling
- **Med hjälp av Hangfire, ska vi genomföra:**Schemalagd körning av arbetsflöden
- API-röstning för externa dataFörsök igen logik för misslyckade avrättningar
- Dashboard för övervakning av arbetstillfällenTeknologi Stack
- **Här är vad vi kommer att använda:**Bakgrundsprogram
ASP.NET Kärna 9,0
- : Vårt webbramverkEntitetsramar
- : För datavaraktighetPostgreSQL
- : Databas för lagring av arbetsflödesdefinitioner och utförandetillståndHangfire
- : Bakgrund jobbhanteringSystem.Text.Json
: För arbetsflöde JSON serialisering
- GränssnittHTMX 2,0
- : För dynamiska, serverdrivna uppdateringar av användargränssnittet utan att skriva JavaScriptAlpina.js
- : Lätt JavaScript-ramverk för interaktiva komponenterTailwindCSS + DaisyUI
: Styling och UI komponenter
Ledarlinjen
Mostlylucid.Workflow/
├── Mostlylucid.Workflow.Engine/ # Core workflow execution engine
│ ├── Models/ # Node, Workflow, Connection models
│ ├── Execution/ # Workflow executor and runtime
│ └── Nodes/ # Built-in node implementations
├── Mostlylucid.Workflow.Shared/ # Shared models and DTOs
├── Mostlylucid.Workflow.DbContext/ # Entity Framework context
└── Mostlylucid/ # Main web app (existing)
├── Controllers/WorkflowController.cs
├── Services/WorkflowService.cs
└── Views/Workflow/ # Workflow UI views
: För ritning anslutningar mellan noder (vi ska undersöka alternativ)
Infrastruktur Docka
{
"id": "node-1",
"type": "HttpRequest",
"name": "Fetch User Data",
"inputs": {
"url": "https://api.example.com/users/{{userId}}",
"method": "GET",
"headers": {
"Authorization": "Bearer {{apiToken}}"
}
},
"outputs": {
"response": "{{result.body}}",
"statusCode": "{{result.statusCode}}"
},
"conditions": {
"onSuccess": "next-node-id",
"onError": "error-handler-node-id"
}
}
: För containertillverkning Seq Ordförande
- : För strukturerad loggning
- Prometheus + Grafana
- : För övervakning
Översikt över arkitekturen Vårt system kommer att organiseras i flera projekt:
- Viktiga beslut om utformning
-
- Vad är det som händer?
- JSON-baserade noddefinitioner
- Noder kommer att definieras i JSON, vilket gör dem lätta att serialisera, version, och dela:
Två. Grafbaserat genomförande
- Arbetsflöden är riktade acykliska grafer (DAG).
- Exekveringsmotorn kommer att
- Utför topologisk sortering för att bestämma verkställande order
Kör noder parallellt om möjligt
Hantera villkorlig förgrening baserat på nodutgångar
-
- Vad är det som händer?
- Statens ihärdighet
- Varje arbetsflöde kommer att spåras:
- Arbetsflödestillstånd (Körning, Färdig, Misslyckades)
Nodutföranderesultat
- Trigger-tillstånd för schemalagda arbetsflöden
- Avrättningshistorik och logg
- Fyra.
- Omfattning
- Nodsystemet kommer att vara plugin-baserat:
Inbyggda noder för gemensamma insatser
- Anpassade nodtyper kan registreras
- Nodvalidering och genomförande av schema
- Vad som kommer i den här serien
- Del 2: Arkitektur och grundläggande arbetsflödesmotor
- Inrättande av projektstrukturen
Bygga de centrala arbetsflödesmodellerna (Node, Workflow, Connection)
- Genomförande av grafens exekveringsmotor
- Topologisk sortering och beroendelösning
- Del 3: Att bygga den visuella redaktören
- Skapa arbetsflödesduken med HTMX och Alpine.js
- Drag-och-släpp nod placering
Ritning av visuell anslutning
Inställningspanel för nod
- Serialisering av arbetsflöde
- Del 4: Integrering av hangfire och statlig förvaltning
- Ställa in Hangfire för bakgrundsbehandling
- Genomförande av API-röstning noder
- Utlösande statlig förvaltning
Försök igen logik och felhantering
Integrering av Dashboard
Del 5: Avancerade funktioner och spridning
Genomförande av egna noder
Version av arbetsflöde
Provningsstrategier
Prestandaoptimering