Skip to content

Commit 856a1ea

Browse files
authored
Merge branch 'v1.16' into issue-4879
2 parents af09da6 + 4867d9d commit 856a1ea

File tree

4 files changed

+86
-28
lines changed

4 files changed

+86
-28
lines changed

daprdocs/content/en/developing-applications/building-blocks/state-management/howto-outbox.md

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,72 @@ For example, you can use the outbox pattern to:
1616

1717
With Dapr's outbox support, you can notify subscribers when an application's state is created or updated when calling Dapr's [transactions API]({{% ref "state_api.md#state-transactions" %}}).
1818

19-
The diagram below is an overview of how the outbox feature works:
19+
The diagram below is an overview of how the outbox feature works at a high level:
2020

2121
1) Service A saves/updates state to the state store using a transaction.
2222
2) A message is written to the broker under the same transaction. When the message is successfully delivered to the message broker, the transaction completes, ensuring the state and message are transacted together.
2323
3) The message broker delivers the message topic to any subscribers - in this case, Service B.
2424

25-
<img src="/images/state-management-outbox.png" width=800 alt="Diagram showing the steps of the outbox pattern">
25+
<img src="/images/state-management-outbox.png" width=800 alt="Diagram showing the overview of outbox pattern">
2626

27+
## How outbox works under the hood
28+
29+
Dapr outbox processes requests in two flows: the user request flow and the background message flow. Together, they guarantee that state and events stay consistent.
30+
31+
<img src="/images/state-management-outbox-steps.png" width=800 alt="Diagram showing the steps of the outbox pattern">
32+
33+
This is the sequence of interactions:
34+
35+
1. An application calls the Dapr State Management API to write state transactionally using the transactional methods.
36+
This is the entry point where business data, such as an order or profile update, is submitted for persistence.
37+
38+
2. Dapr publishes an intent message with a unique transaction ID to an internal outbox topic.
39+
This durable record ensures the event intent exists before any database commit happens.
40+
41+
3. The state and a transaction marker are written atomically in the same state store.
42+
Both the business data and the marker are committed in the same transaction, preventing partial writes.
43+
44+
4. The application receives a success response after the transaction commits.
45+
At this point, the application can continue, knowing state is saved and the event intent is guaranteed.
46+
47+
5. A background subscriber reads the intent message.
48+
When outbox is enabled, Dapr starts consumers that process the internal outbox topic.
49+
50+
6. The subscriber verifies the transaction marker in the state store.
51+
This check confirms that the database commit was successful before publishing externally.
52+
53+
7. Verified business event is published to the external pub/sub topic.
54+
The event is sent to the configured broker (Kafka, RabbitMQ, etc.) where other services can consume it.
55+
56+
8. The marker is cleaned up (deleted) from the state store.
57+
This prevents unbounded growth in the database once the event has been successfully delivered.
58+
59+
9. Message is acknowledged and removed from internal topic
60+
If publishing or cleanup fails, Dapr retries, ensuring reliable at-least-once delivery.
61+
2762
## Requirements
2863

29-
The outbox feature can be used with using any [transactional state store]({{% ref supported-state-stores %}}) supported by Dapr. All [pub/sub brokers]({{% ref supported-pubsub %}}) are supported with the outbox feature.
64+
1. The outbox feature requires a [transactional state store]({{% ref supported-state-stores %}}) supported by Dapr.
65+
[Learn more about the transactional methods you can use.]({{% ref "howto-get-save-state.md#perform-state-transactions" %}})
3066

31-
[Learn more about the transactional methods you can use.]({{% ref "howto-get-save-state.md#perform-state-transactions" %}})
67+
2. Any [pub/sub broker]({{% ref supported-pubsub %}}) supported by Dapr can be used with the outbox feature.
3268

33-
{{% alert title="Note" color="primary" %}}
34-
Message brokers that work with the competing consumer pattern (for example, [Apache Kafka]({{% ref setup-apache-kafka%}})) are encouraged to reduce the chances of duplicate events.
35-
{{% /alert %}}
69+
{{% alert title="Note" color="primary" %}}
70+
Message brokers that support the competing consumer pattern (for example, [Apache Kafka]({{% ref setup-apache-kafka%}})) are recommended to reduce the chance of duplicate events.
71+
{{% /alert %}}
72+
73+
3. Internal outbox topic
74+
When outbox is enabled, Dapr creates an internal topic using the following naming convention: `{namespace}{appID}{topic}outbox`, where:
75+
76+
- `namespace`: the Dapr application namespace (if configured)
77+
- `appID`: the Dapr application identifier
78+
- `topic`: the value specified in the `outboxPublishTopic` metadata
79+
80+
This way each outbox topic is uniquely identified per application and external topic, preventing routing conflicts in multi-tenant environments.
81+
82+
{{% alert title="Note" color="primary" %}}
83+
Ensure that the topic is created in advance, or Dapr has sufficient permissions to create the topic at startup time.
84+
{{% /alert %}}
3685

3786
## Enable the outbox pattern
3887

@@ -682,3 +731,7 @@ The `data` CloudEvent field is reserved for Dapr's use only, and is non-customiz
682731
Watch [this video for an overview of the outbox pattern](https://youtu.be/rTovKpG0rhY?t=1338):
683732

684733
{{< youtube id=rTovKpG0rhY start=1338 >}}
734+
735+
## Next Steps
736+
737+
[How Dapr Outbox Eliminates Dual Writes in Distributed Applications](https://www.diagrid.io/blog/how-dapr-outbox-eliminates-dual-writes-in-distributed-applications)

daprdocs/content/en/operations/configuration/increase-request-size.md

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,29 @@
11
---
22
type: docs
3-
title: "How-To: Handle large http body requests"
4-
linkTitle: "HTTP request body size"
3+
title: "How-To: Handle larger body requests"
4+
linkTitle: "Request body size"
55
weight: 6000
66
description: "Configure http requests that are bigger than 4 MB"
77
---
88

9-
By default, Dapr has a limit for the request body size, set to 4MB. You can change this by defining:
10-
- The `dapr.io/http-max-request-size` annotation, or
11-
- The `--dapr-http-max-request-size` flag.
9+
{{% alert title="Note" color="primary" %}}
10+
The existing flag/annotation`dapr-http-max-request-size` has been deprecated and updated to `max-body-size`.
11+
{{% /alert %}}
12+
13+
By default, Dapr has a limit for the request body size, set to 4MB. You can change this for both HTTP and gRPC requests by defining:
14+
- The `dapr.io/max-body-size` annotation, or
15+
- The `--max-body-size` flag.
1216

1317
{{< tabpane text=true >}}
1418

1519
<!--self hosted-->
1620
{{% tab "Self-hosted" %}}
1721

18-
When running in self-hosted mode, use the `--dapr-http-max-request-size` flag to configure Dapr to use non-default request body size:
22+
When running in self-hosted mode, use the `--max-body-size` flag to configure Dapr to use non-default request body size:
1923

2024
```bash
21-
dapr run --dapr-http-max-request-size 16 node app.js
25+
dapr run --max-body-size 16 node app.js
2226
```
23-
This tells Dapr to set maximum request body size to `16` MB.
24-
2527
{{% /tab %}}
2628

2729
<!--kubernetes-->
@@ -50,14 +52,16 @@ spec:
5052
dapr.io/enabled: "true"
5153
dapr.io/app-id: "myapp"
5254
dapr.io/app-port: "8000"
53-
dapr.io/http-max-request-size: "16"
55+
dapr.io/max-body-size: "16"
5456
#...
5557
```
5658

5759
{{% /tab %}}
5860

5961
{{< /tabpane >}}
6062

63+
This tells Dapr to set the maximum request body size to `16` MB for both HTTP and gRPC requests.
64+
6165
## Related links
6266

6367
[Dapr Kubernetes pod annotations spec]({{% ref arguments-annotations-overview.md %}})

daprdocs/content/en/operations/support/breaking-changes-and-deprecations.md

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -58,17 +58,18 @@ After announcing a future breaking change, the change will happen in 2 releases
5858

5959
## Announced deprecations
6060

61-
| Feature | Deprecation announcement | Removal |
62-
|-----------------------|-----------------------|------------------------- |
63-
| GET /v1.0/shutdown API (Users should use [POST API]({{% ref kubernetes-job.md %}}) instead) | 1.2.0 | 1.4.0 |
64-
| Java domain builder classes deprecated (Users should use [setters](https://github.com/dapr/java-sdk/issues/587) instead) | Java SDK 1.3.0 | Java SDK 1.5.0 |
65-
| Service invocation will no longer provide a default content type header of `application/json` when no content-type is specified. You must explicitly [set a content-type header]({{% ref "service_invocation_api.md#request-contents" %}}) for service invocation if your invoked apps rely on this header. | 1.7.0 | 1.9.0 |
66-
| gRPC service invocation using `invoke` method is deprecated. Use proxy mode service invocation instead. See [How-To: Invoke services using gRPC ]({{% ref howto-invoke-services-grpc.md %}}) to use the proxy mode.| 1.9.0 | 1.10.0 |
67-
| The CLI flag `--app-ssl` (in both the Dapr CLI and daprd) has been deprecated in favor of using `--app-protocol` with values `https` or `grpcs`. [daprd:6158](https://github.com/dapr/dapr/issues/6158) [cli:1267](https://github.com/dapr/cli/issues/1267)| 1.11.0 | 1.13.0 |
68-
| Hazelcast PubSub Component | 1.9.0 | 1.11.0 |
69-
| Twitter Binding Component | 1.10.0 | 1.11.0 |
70-
| NATS Streaming PubSub Component | 1.11.0 | 1.13.0 |
71-
| Workflows API Alpha1 `/v1.0-alpha1/workflows` being deprecated in favor of Workflow Client | 1.15.0 | 1.17.0 |
61+
| Feature | Deprecation announcement | Removal |
62+
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------|----------------|
63+
| GET /v1.0/shutdown API (Users should use [POST API]({{% ref kubernetes-job.md %}}) instead) | 1.2.0 | 1.4.0 |
64+
| Java domain builder classes deprecated (Users should use [setters](https://github.com/dapr/java-sdk/issues/587) instead) | Java SDK 1.3.0 | Java SDK 1.5.0 |
65+
| Service invocation will no longer provide a default content type header of `application/json` when no content-type is specified. You must explicitly [set a content-type header]({{% ref "service_invocation_api.md#request-contents" %}}) for service invocation if your invoked apps rely on this header. | 1.7.0 | 1.9.0 |
66+
| gRPC service invocation using `invoke` method is deprecated. Use proxy mode service invocation instead. See [How-To: Invoke services using gRPC ]({{% ref howto-invoke-services-grpc.md %}}) to use the proxy mode. | 1.9.0 | 1.10.0 |
67+
| The CLI flag `--app-ssl` (in both the Dapr CLI and daprd) has been deprecated in favor of using `--app-protocol` with values `https` or `grpcs`. [daprd:6158](https://github.com/dapr/dapr/issues/6158) [cli:1267](https://github.com/dapr/cli/issues/1267) | 1.11.0 | 1.13.0 |
68+
| Hazelcast PubSub Component | 1.9.0 | 1.11.0 |
69+
| Twitter Binding Component | 1.10.0 | 1.11.0 |
70+
| NATS Streaming PubSub Component | 1.11.0 | 1.13.0 |
71+
| Workflows API Alpha1 `/v1.0-alpha1/workflows` being deprecated in favor of Workflow Client | 1.15.0 | 1.17.0 |
72+
| Migration of `http-max-request-size` flags/annotations to `max-body-size`. See [How-To: Handle larger body requests]({{% ref increase-request-size.md %}}) | 1.14.0 | 1.17.0 |
7273

7374
## Related links
7475

136 KB
Loading

0 commit comments

Comments
 (0)