State management

Dapr 提供了一个很好的模块化方法来管理您的应用程序中的状态。 新手入门可以参考 如何帮助

元数据

许多状态组件允许您将元数据传递给组件,以控制组件的特定行为。 PHP SDK 允许您通过以下方式传递该元数据:

  1. <?php
  2. // using the state manager
  3. $app->run(
  4. fn(\Dapr\State\StateManager $stateManager) =>
  5. $stateManager->save_state('statestore', new \Dapr\State\StateItem('key', 'value', metadata: ['port' => '112'])));
  6. // using the DaprClient
  7. $app->run(fn(\Dapr\Client\DaprClient $daprClient) => $daprClient->saveState(storeName: 'statestore', key: 'key', value: 'value', metadata: ['port' => '112']))

这是如何将端口元数据传递给Cassandra的示例。

每个状态操作都允许传递元数据。

一致性/并发性

在 PHP SDK 中,Dapr 中有四种不同类型的一致性和并发性:

  1. <?php
  2. [
  3. \Dapr\consistency\StrongLastWrite::class,
  4. \Dapr\consistency\StrongFirstWrite::class,
  5. \Dapr\consistency\EventualLastWrite::class,
  6. \Dapr\consistency\EventualFirstWrite::class,
  7. ]

将其中之一传递给StateManager方法或使用StateStore()属性允许您定义状态存储应该如何处理冲突。

并行

进行批量读取或开始事务时,可以指定并行的数量。 如果 Dapr 不得不一次只读取一个键,它将”最多”能同时从底层存储中读取这么多键。 这有助于控制状态存储上的负载,但会牺牲性能。 默认为 10

前缀

硬编码的键名很有用,但是为什么不让状态对象可复用性更高呢? 当提交事务或保存对象为状态时,您可以传递一个应用于对象中每个键的前缀。

  1. <?php
  2. class TransactionObject extends \Dapr\State\TransactionalState {
  3. public string $key;
  4. }
  5. $app->run(function (TransactionObject $object ) {
  6. $object->begin(prefix: 'my-prefix-');
  7. $object->key = 'value';
  8. // commit to key `my-prefix-key`
  9. $object->commit();
  10. });
  1. <?php
  2. class StateObject {
  3. public string $key;
  4. }
  5. $app->run(function(\Dapr\State\StateManager $stateManager) {
  6. $stateManager->load_object($obj = new StateObject(), prefix: 'my-prefix-');
  7. // original value is from `my-prefix-key`
  8. $obj->key = 'value';
  9. // save to `my-prefix-key`
  10. $stateManager->save_object($obj, prefix: 'my-prefix-');
  11. });