如何:启用 actor 提醒分区

为您的应用程序启用 actor 提醒分区

Actor 提醒在sidecar重启后会被持久化并继续触发。 注册许多 reminder 的应用程序可能会遇到以下问题:

  • Reminder 注册和注销的吞吐量低
  • 对注册的 reminder 总数的限制是基于状态存储上的单个记录大小的限制。

为了规避这些问题,应用程序可以在状态存储中分布数据的同时启用actor reminder 的分区。

  1. actors\|\|<actor type>\|\|metadata 中的元数据记录被用于存储给定 actor 类型的持久化配置。
  2. 同一 actor 类型的 reminder 子集被存储在多个记录中。
KeyValue
actors||<actor type>||metadata{ “id”: <actor metadata identifier>, “actorRemindersMetadata”: { “partitionCount”: <number of partitions for reminders> } }
actors||<actor type>||<actor metadata identifier>||reminders||1[ <reminder 1-1>, <reminder 1-2>, … , <reminder 1-n> ]
actors||<actor type>||<actor metadata identifier>||reminders||2[ <reminder 1-1>, <reminder 1-2>, … , <reminder 1-m> ]

如果需要更改分区的数量,Dapr 的 sidecar 将自动重新分发 reminder 的设置。

配置 actor 运行时以对 actor reminder 进行分区

与其他 actor 配置元素类似,actor 运行时通过 actor 的 endpoint 为 GET /dapr/config 提供适当的配置以分区 actor 提醒。 选择您偏好的语言来进行 actor 运行时配置示例。

  1. // In Startup.cs
  2. public void ConfigureServices(IServiceCollection services)
  3. {
  4. // Register actor runtime with DI
  5. services.AddActors(options =>
  6. {
  7. // Register actor types and configure actor settings
  8. options.Actors.RegisterActor<MyActor>();
  9. // Configure default settings
  10. options.ActorIdleTimeout = TimeSpan.FromMinutes(60);
  11. options.ActorScanInterval = TimeSpan.FromSeconds(30);
  12. options.RemindersStoragePartitions = 7;
  13. });
  14. // Register additional services for use with actors
  15. services.AddSingleton<BankService>();
  16. }

查看注册 Actors 的.NET SDK文档

  1. import { CommunicationProtocolEnum, DaprClient, DaprServer } from "@dapr/dapr";
  2. // Configure the actor runtime with the DaprClientOptions.
  3. const clientOptions = {
  4. actor: {
  5. remindersStoragePartitions: 0,
  6. },
  7. };
  8. const actor = builder.build(new ActorId("my-actor"));
  9. // Register a reminder, it has a default callback: `receiveReminder`
  10. await actor.registerActorReminder(
  11. "reminder-id", // Unique name of the reminder.
  12. Temporal.Duration.from({ seconds: 2 }), // DueTime
  13. Temporal.Duration.from({ seconds: 1 }), // Period
  14. Temporal.Duration.from({ seconds: 1 }), // TTL
  15. 100, // State to be sent to reminder callback.
  16. );
  17. // Delete the reminder
  18. await actor.unregisterActorReminder("reminder-id");

查看使用JavaScript SDK编写actors的文档

  1. from datetime import timedelta
  2. ActorRuntime.set_actor_config(
  3. ActorRuntimeConfig(
  4. actor_idle_timeout=timedelta(hours=1),
  5. actor_scan_interval=timedelta(seconds=30),
  6. remindersStoragePartitions=7
  7. )
  8. )

请参阅有关使用 Python SDK 运行 Actors 的文档

  1. // import io.dapr.actors.runtime.ActorRuntime;
  2. // import java.time.Duration;
  3. ActorRuntime.getInstance().getConfig().setActorIdleTimeout(Duration.ofMinutes(60));
  4. ActorRuntime.getInstance().getConfig().setActorScanInterval(Duration.ofSeconds(30));
  5. ActorRuntime.getInstance().getConfig().setRemindersStoragePartitions(7);

请参阅有关使用Java SDK编写Actor的文档.

  1. type daprConfig struct {
  2. Entities []string `json:"entities,omitempty"`
  3. ActorIdleTimeout string `json:"actorIdleTimeout,omitempty"`
  4. ActorScanInterval string `json:"actorScanInterval,omitempty"`
  5. DrainOngoingCallTimeout string `json:"drainOngoingCallTimeout,omitempty"`
  6. DrainRebalancedActors bool `json:"drainRebalancedActors,omitempty"`
  7. RemindersStoragePartitions int `json:"remindersStoragePartitions,omitempty"`
  8. }
  9. var daprConfigResponse = daprConfig{
  10. []string{defaultActorType},
  11. actorIdleTimeout,
  12. actorScanInterval,
  13. drainOngoingCallTimeout,
  14. drainRebalancedActors,
  15. 7,
  16. }
  17. func configHandler(w http.ResponseWriter, r *http.Request) {
  18. w.Header().Set("Content-Type", "application/json")
  19. w.WriteHeader(http.StatusOK)
  20. json.NewEncoder(w).Encode(daprConfigResponse)
  21. }

查看使用 Go SDK 与 actors 的示例

以下是 reminder 分区的有效配置示例:

  1. {
  2. "entities": [ "MyActorType", "AnotherActorType" ],
  3. "remindersStoragePartitions": 7
  4. }

处理配置更改

为了配置 actor 提醒分区,Dapr 将 actor 类型元数据保存在 actor 的状态存储中。 这允许全局应用配置更改,而不仅仅是在单个 sidecar 实例中。

此外,您只能增加分区的数量,不能减少。 这允许 Dapr 在滚动重启时自动重新分发数据,其中一个或多个分区配置可能处于活动状态。

例子

观看此视频用于Actor reminder分区的演示:

下一步

与 virtual actors 互动 >>

相关链接