You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
> The templates currently use **MassTransit**, but this will be removed in a future update and replaced by my own library **Conveyo**: https://github.com/ftechmax/conveyo. Conveyo will also support workers written in Go.
12
-
> MassTransit's licensing model changed, and I want the messaging stack to remain fully open and free.
13
-
14
10
> [!NOTE]
15
11
> If you previously installed the now-retired `MSA.Templates` NuGet package, you can remove the stale local install with `dotnet new uninstall MSA.Templates`. The new flow does not use `dotnet new`.
16
12
@@ -37,7 +33,7 @@ These templates are the accumulation of those lessons, packaged as a starting po
37
33
- A clear split between the **HTTP edge** in the API and **asynchronous domain work** in the worker
38
34
- A default stack for **messaging, persistence, caching, and telemetry** picked from what I reach for on every project
39
35
-**Kubernetes** manifests included for local, self-hosted, and cloud clusters
40
-
- Opinionated defaults you can rip out: every choice (MassTransit, PostgreSQL, Valkey, SignalR) is isolated behind its own wiring so you can swap one without touching the rest
36
+
- Opinionated defaults you can rip out: every choice (Conveyo, PostgreSQL, Valkey, SignalR) is isolated behind its own wiring so you can swap one without touching the rest
41
37
42
38
This is not meant to be the only way to do things. It's the default I've shipped to production more than once.
43
39
@@ -54,7 +50,7 @@ These templates are intended to be used together as a "vertical slice" of a mess
54
50
55
51
The templates come wired up for:
56
52
57
-
-**Messaging** via MassTransit (Conveyo coming soon!) on top of RabbitMQ
53
+
-**Messaging** via Conveyo on top of RabbitMQ
58
54
-**Persistence** via the Npgsql package, storing documents as PostgreSQL JSONB (an in-cluster Postgres StatefulSet in the generated Kubernetes setup)
59
55
-**Caching** via Valkey using the StackExchange.Redis package
Copy file name to clipboardExpand all lines: docs/api.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -8,7 +8,7 @@ The API should not contain domain logic. Its main jobs are:
8
8
9
9
-**Own the HTTP contract**: controllers, DTOs, a versioning strategy when you need one, and input validation.
10
10
-**Validate early**: reject bad requests before they become messages that bounce around the system.
11
-
-**Send commands** to the worker via the bus using MassTransit. The API should not need direct DB access to do writes.
11
+
-**Send commands** to the worker via the bus using Conveyo. The API should not need direct DB access to do writes.
12
12
-**Serve reads efficiently**: the template uses projections and caches them in Valkey/Redis so read paths stay fast without coupling reads to the write model.
13
13
14
14
The API also bridges worker events back to connected clients. It consumes published events from the worker and uses them to:
Copy file name to clipboardExpand all lines: docs/worker.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# Worker project
2
2
3
-
The worker service is responsible for consuming commands and external events, applying business logic, persisting state, and publishing events that represent domain outcomes. It runs as a background service and does not expose HTTP endpoints. The template wires up MassTransit on RabbitMQ for messaging, Npgsql for persistence (PostgreSQL JSONB, an in-cluster Postgres StatefulSet in the default Kubernetes setup), and OpenTelemetry for traces, metrics, and logs.
3
+
The worker service is responsible for consuming commands and external events, applying business logic, persisting state, and publishing events that represent domain outcomes. It runs as a background service and does not expose HTTP endpoints. The template wires up Conveyo on RabbitMQ for messaging, Npgsql for persistence (PostgreSQL JSONB, an in-cluster Postgres StatefulSet in the default Kubernetes setup), and OpenTelemetry for traces, metrics, and logs.
4
4
5
5
## Responsibilities
6
6
@@ -16,7 +16,7 @@ In this stack, the worker owns the domain work:
16
16
17
17
- Handlers must be **idempotent** because RabbitMQ can redeliver the same message after a worker restart or ack timeout.
18
18
- OpenTelemetry exports traces, metrics, and logs, so you can answer "what happened to message X?" from a single trace ID.
19
-
- Transient failures go through MassTransit's retry pipeline, and unrecoverable ones land in `_error`queues. The template ships defaults; you set the retry counts and backoff per consumer.
19
+
- Transient failures go through Conveyo's retry pipeline (exponential backoff), and unrecoverable ones are published as a `Fault` and moved to a `{queue}_error`queue. The template ships defaults; you set the retry counts and backoff per consumer.
20
20
- Background jobs belong here too. The template shows a hosted service for cache invalidation.
0 commit comments