Add Azure Table storage to the list of store providers (#323)

* add Azure Table storage to the list of store providers

* find & replace bug
This commit is contained in:
Ivan Gavryliuk 2020-02-05 23:51:27 +00:00 committed by GitHub
parent 6930252e77
commit 02593f45fe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 103 additions and 0 deletions

View File

@ -48,6 +48,7 @@ kubectl apply -f statestore.yaml
* [Setup Consul](./setup-consul.md) * [Setup Consul](./setup-consul.md)
* [Setup Memcached](./setup-memcached.md) * [Setup Memcached](./setup-memcached.md)
* [Setup Azure CosmosDB](./setup-azure-cosmosdb.md) * [Setup Azure CosmosDB](./setup-azure-cosmosdb.md)
* [Setup Azure Table Storage](./setup-azure-tablestorage.md)
* [Setup Google Cloud Firestore (Datastore mode)](./setup-firestore.md) * [Setup Google Cloud Firestore (Datastore mode)](./setup-firestore.md)
* [Setup MongoDB](./setup-mongodb.md) * [Setup MongoDB](./setup-mongodb.md)
* [Setup Zookeeper](./setup-zookeeper.md) * [Setup Zookeeper](./setup-zookeeper.md)

View File

@ -0,0 +1,102 @@
# Setup Azure Table Storage
## Creating Azure Storage account
[Follow the instructions](https://docs.microsoft.com/en-us/azure/storage/common/storage-account-create?tabs=azure-portal) from the Azure documentation on how to create an Azure Storage Account.
If you wish to create a table for Dapr to use, you can do so beforehand. However, Table Storage state provider will create one for you automatically if it doesn't exist.
In order to setup Azure Table Storage as a state store, you will need the following properties:
* **AccountName**: The storage account name. For example: **mystorageaccount**.
* **AccountKey**: Primary or secondary storage key.
* **TableName**: The name of the table to be used for Dapr state. The table will be created for you if it doesn't exist.
## Create a Dapr component
The next step is to create a Dapr component for Azure Table Storage.
Create the following YAML file named `azuretable.yaml`:
```
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: <name>
spec:
type: state.azure.tablestorage
metadata:
- name: accountName
value: <REPLACE-WITH-ACCOUNT-NAME>
- name: accountKey
value: <REPLACE-WITH-ACCOUNT-KEY>
- name: tableName
value: <REPLACE-WITH-TABLE-NAME>
```
The above example uses secrets as plain strings. It is recommended to use a secret store for the secrets as described [here](../../concepts/components/secrets.md).
The following example uses the Kubernetes secret store to retrieve the secrets:
```
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: <name>
spec:
type: state.azure.tablestorage
metadata:
- name: accountName
value: <REPLACE-WITH-ACCOUNT-NAME>
- name: accountKey
secretKeyRef:
name: <KUBERNETES-SECRET-NAME>
key: <KUBERNETES-SECRET-KEY>
- name: tableName
value: <REPLACE-WITH-TABLE-NAME>
```
## Apply the configuration
### In Kubernetes
To apply Azure Table Storage state store to Kubernetes, use the `kubectl` CLI:
```
kubectl apply -f azuretable.yaml
```
### Running locally
The Dapr CLI will automatically create a directory named `components` in your current working directory with a Redis component.
To use Azure Table Storage, replace the redis.yaml file with azuretable.yaml file above.
## Partitioning
The Azure Table Storage state store will use the `key` property provided in the requests to the Dapr API to determine the `row key`. Service Name is used for `partition key`. This provides best performance, as each service type will store state in it's own table partition.
This state store creates a column called `Value` in the table storage and puts raw state inside it.
For example, the following operation coming from service called `myservice`
```shell
curl -X POST http://localhost:3500/v1.0/state \
-H "Content-Type: application/json"
-d '[
{
"key": "nihilus",
"value": "darth"
}
]'
```
will create the following record in a table:
| PartitionKey | RowKey | Value |
| ------------ | ------- | ----- |
| myservice | nihilus | darth |
## Concurrency
Azure Table Storage state concurrency is achieved by using `ETag`s according to [the official documenation]( https://docs.microsoft.com/en-us/azure/storage/common/storage-concurrency#managing-concurrency-in-table-storage).