状态生存时间(TTL)

使用 TTL 管理状态。

Dapr 允许对每个状态设置请求的生存时间(TTL)。 这意味着应用程序可以为每个存储的状态设置生存时间,并且在过期后无法检索这些状态。

对于支持的状态存储,只需在发布消息时设置 ttlInSeconds 元数据。 其他的状态存储将忽略这个值。 对于一些状态存储,您可以在每个表/容器的基础上指定一个默认的到期时间。

原生状态 TTL 支持

当状态 TTL 在状态存储组件中具有本机支持时,Dapr 会转发 TTL 配置,而不会添加任何额外逻辑,保持可预测的行为。 当组件对过期状态的处理方式不同时,这很有帮助。

当没有指定TTL时,将保留状态存储的默认行为。

绕过全局定义的 TTL 进行显式持久化

持久状态适用于允许您指定用于所有数据的默认 TTL 的所有状态存储,或者:

  • 通过 Dapr 组件设置全局 TTL 值,或
  • 在 Dapr 之外创建状态存储并设置全局 TTL 值时。

当未指定特定的 TTL 时,数据将在全局 TTL 时间段之后过期。 Dapr 没有促进这一点。

此外,所有状态存储还支持选择_显式_持久化数据。 这意味着您可以忽略默认的数据库策略(可能是在 Dapr 外部设置的,或通过 Dapr 组件设置的),以无限期地保留给定的数据库记录。 您可以通过将ttlInSeconds设置为-1来实现此目的。 此值表示忽略任何设置的TTL值。

受支持的组件

请参阅 TTL 列 状态存储组件指南.

如何使用Dapr扩展来开发和运行Dapr应用程序

您可以在状态存储设置请求的元数据中设置状态TTL:

  1. #dependencies
  2. from dapr.clients import DaprClient
  3. #code
  4. DAPR_STORE_NAME = "statestore"
  5. with DaprClient() as client:
  6. client.save_state(DAPR_STORE_NAME, "order_1", str(orderId), state_metadata={
  7. 'ttlInSeconds': '120'
  8. })

要启动 Dapr sidecar 并运行上述示例应用程序,然后运行类似以下命令:

  1. dapr run --app-id orderprocessing --app-port 6001 --dapr-http-port 3601 --dapr-grpc-port 60001 -- python3 OrderProcessingService.py
  1. // dependencies
  2. using Dapr.Client;
  3. // code
  4. await client.SaveStateAsync(storeName, stateKeyName, state, metadata: new Dictionary<string, string>() {
  5. {
  6. "ttlInSeconds", "120"
  7. }
  8. });

要启动 Dapr sidecar 并运行上述示例应用程序,然后运行类似以下命令:

  1. dapr run --app-id orderprocessing --app-port 6001 --dapr-http-port 3601 --dapr-grpc-port 60001 dotnet run
  1. // dependencies
  2. import (
  3. dapr "github.com/dapr/go-sdk/client"
  4. )
  5. // code
  6. md := map[string]string{"ttlInSeconds": "120"}
  7. if err := client.SaveState(ctx, store, "key1", []byte("hello world"), md); err != nil {
  8. panic(err)
  9. }

要启动 Dapr sidecar 并运行上述示例应用程序,然后运行类似以下命令:

  1. dapr run --app-id orderprocessing --app-port 6001 --dapr-http-port 3601 --dapr-grpc-port 60001 go run .
  1. curl -X POST -H "Content-Type: application/json" -d '[{ "key": "order_1", "value": "250", "metadata": { "ttlInSeconds": "120" } }]' http://localhost:3601/v1.0/state/statestore
  1. Invoke-RestMethod -Method Post -ContentType 'application/json' -Body '[{"key": "order_1", "value": "250", "metadata": {"ttlInSeconds": "120"}}]' -Uri 'http://localhost:3601/v1.0/state/statestore'

相关链接