The documentation you are viewing is for Dapr v1.5 which is an older version of Dapr. For up-to-date documentation, see the latest version.

Azure Cosmos DB

关于 Azure CosmosDB 状态存储组件的详细信息

配置

要设置 Azure CosmosDb 状态存储,请创建一个类型为 state.azure.cosmosdb 的组件。 请参阅本指南,了解如何创建和应用状态存储配置。

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: <NAME>
  namespace: <NAMESPACE>
spec:
  type: state.azure.cosmosdb
  version: v1
  metadata:
  - name: url
    value: <REPLACE-WITH-URL>
  - name: masterKey
    value: <REPLACE-WITH-MASTER-KEY>
  - name: database
    value: <REPLACE-WITH-DATABASE>
  - name: collection
    value: <REPLACE-WITH-COLLECTION>

如果您想要使用 CosmosDb 作为 Actor 存储,请在 yaml 上附上以下内容。

  - name: actorStateStore
    value: "true"

元数据字段规范

字段 必填 详情 示例
url Y CosmosDB 地址 "https://******.documents.azure.com:443/".
masterKey Y 认证到CosmosDB 账户的密钥 "key"
database Y 数据库名称 "db"
collection Y 要使用的集合名称 "collection"
actorStateStore N 是否将此状态存储给 Actor 使用。 默认值为 "false" "true", "false"

安装Azure Cosmos DB

请遵循 Azure 文档中关于如何创建 Azure CosmosDB 帐户的说明。 在为 Dapr 所使用之前,必须先在 CosmosDB 中创建数据库和集合。

注意:集合的分区键必须命名为 “/partitionKey”。 注意:这是区分大小写的。

为了配置 CosmosDB 作为状态存储,你需要以下属性:

  • URL: the CosmosDB url. 示例: https://******.documents.azure.com:443/
  • Master Key: 用于验证 CosmosDB 账户的密钥
  • Database: 数据库的名称
  • Collection: 集合的名称

生产使用的最佳实践

Azure Cosmos DB 在单个 Azure Cosmos DB 帐户中的所有数据库中共享严格的元数据请求速率限制。 对 Azure Cosmos DB 的新连接承担了很大比例的允许请求率限制。 (见 CosmosDB 文档)

因此,必须采用多种策略来避免同时对 Azure Cosmos DB 进行新的连接。

  • 确保应用程序的 sidecar 仅在需要时加载 Azure Cosmos DB 组件,以避免不必要的数据库连接。 这可以通过将组件的范围限定为特定应用程序来完成。
  • 选择按顺序部署或启动应用程序的部署策略,以最大程度地减少与 Azure Cosmos DB 帐户的新连接中的突发。
  • 避免对不相关的数据库或系统(甚至在 Dapr 外部)重用同一 Azure Cosmos DB 帐户。 不同的 Azure Cosmos DB 帐户具有不同的速率限制。
  • 增加 initTimeout 值,以允许组件在 sidecar 初始化期间重试连接到 Azure Cosmos DB,最长5分钟。 默认值是 5s ,应该增加。 使用 Kubernetes 时,增加此值可能还需要更新您的 Readiness 和 Liveness 探针
spec:
  type: state.azure.cosmosdb
  version: v1
  initTimeout: 5m
  metadata:

日期格式

要使用 CosmosDB 状态存储,你的数据必须以 JSON 序列化的方式发送到 Dapr。 让它仅仅是 JSON 可序列化 是不行的。

如果您使用的是 Dapr SDKs (例如https://github.com/dapr/dotnet-sdk),SDK 会将您的数据序列化为 json。

例子请看分区键部分的 curl 操作。

分区键

对于non-actor状态操作,Azure Cosmos DB状态存储将使用向Dapr API发出的请求中提供的key属性来确定Cosmos DB分区键。 这可以通过在请求中指定一个元数据字段来覆盖,该字段的键为partitionKey,值为所需的分区。

以下操作将使用 nihilus 作为发送到 CosmosDB 的分区键值:

curl -X POST http://localhost:3500/v1.0/state/<store_name> \
  -H "Content-Type: application/json"
  -d '[
        {
          "key": "nihilus",
          "value": "darth"
        }
      ]'

对于 non-actor 状态操作,如果你想控制 CosmosDB 分区,你可以在元数据中指定它。 重用上面的例子,下面是如何把它放在 mypartition 分区下的方法:

curl -X POST http://localhost:3500/v1.0/state/<store_name> \
  -H "Content-Type: application/json"
  -d '[
        {
          "key": "nihilus",
          "value": "darth",
          "metadata": {
            "partitionKey": "mypartition"
          }
        }
      ]'

对于 actor 状态的操作,Dapr使用 appId、actor 类型和 actor id 生成分区键,这样同一个 actor 的数据最终总是在同一个分区下(你不需要指定它)。 这是因为 actor 状态操作必须使用事务,而在 CosmosDB 中,事务中的项必须在同一个分区上。

相关链接