mirror of https://github.com/dapr/docs.git
Add code samples for distributed lock (#2610)
* add code samples for distributed lock Signed-off-by: yaron2 <schneider.yaron@live.com> * nit Signed-off-by: yaron2 <schneider.yaron@live.com> * changes Signed-off-by: yaron2 <schneider.yaron@live.com> * changes Signed-off-by: yaron2 <schneider.yaron@live.com> * Update daprdocs/content/en/developing-applications/building-blocks/distributed-lock/howto-use-distributed-lock.md Co-authored-by: Mark Fussell <markfussell@gmail.com> * Update daprdocs/content/en/developing-applications/building-blocks/distributed-lock/howto-use-distributed-lock.md Co-authored-by: Mark Fussell <markfussell@gmail.com> * Update daprdocs/content/en/developing-applications/building-blocks/distributed-lock/howto-use-distributed-lock.md Co-authored-by: Mark Fussell <markfussell@gmail.com> * changes Signed-off-by: yaron2 <schneider.yaron@live.com> * changes Signed-off-by: yaron2 <schneider.yaron@live.com> Co-authored-by: Mark Fussell <markfussell@gmail.com>
This commit is contained in:
parent
493fbe5a7b
commit
8eeaf204dc
|
|
@ -6,11 +6,19 @@ weight: 2000
|
||||||
description: "Learn how to use distributed locks to provide exclusive access to a resource"
|
description: "Learn how to use distributed locks to provide exclusive access to a resource"
|
||||||
---
|
---
|
||||||
|
|
||||||
Now that you've learned what the Dapr distributed lock API building block provides, learn how it can work in your service. The example below describes an application that aquires a lock. This example uses the Redis lock component to demonstrate how to lock resources.
|
Now that you've learned what the Dapr distributed lock API building block provides, learn how it can work in your service. The example below describes an application that aquires a lock. This example uses the Redis lock component to demonstrate how to lock resources. For a list of supported lock stores, see [this list](/reference/components-reference/supported-locks/).
|
||||||
|
|
||||||
|
The diagram below shows two instances of the same application acquiring a lock, where one instance is successful and the other is denied.
|
||||||
|
|
||||||
|
<img src="/images/building-block-lock-example.png" width=1000 alt="The diagram below shows two instances of the same application acquiring a lock, where one instance is successful and the other is denied">
|
||||||
|
|
||||||
|
The diagram below shows two instances of the same application, where one instance releases the lock and the other instance is then able to acquire the lock.
|
||||||
|
|
||||||
<img src="/images/building-block-lock-example.png" width=1000 alt="Diagram showing aquiring a lock from multiple instances of same application">
|
|
||||||
<img src="/images/building-block-lock-unlock-example.png" width=1000 alt="Diagram showing releasing a lock from multiple instances of same application">
|
<img src="/images/building-block-lock-unlock-example.png" width=1000 alt="Diagram showing releasing a lock from multiple instances of same application">
|
||||||
<img src="/images/building-block-lock-multiple-example.png" width=1000 alt="Diagram showing aquiring multiple locks from different applications">
|
|
||||||
|
The diagram below shows two instances of different applications, acquiring different locks on the same resource.
|
||||||
|
|
||||||
|
<img src="/images/building-block-lock-multiple-example.png" width=1000 alt="The diagram below shows two instances of different applications, acquiring different locks on the same resource">
|
||||||
|
|
||||||
### Configure a lock component
|
### Configure a lock component
|
||||||
|
|
||||||
|
|
@ -20,7 +28,7 @@ Save the following component file to the [default components folder]({{< ref "in
|
||||||
apiVersion: dapr.io/v1alpha1
|
apiVersion: dapr.io/v1alpha1
|
||||||
kind: Component
|
kind: Component
|
||||||
metadata:
|
metadata:
|
||||||
name: lock
|
name: lockstore
|
||||||
spec:
|
spec:
|
||||||
type: lock.redis
|
type: lock.redis
|
||||||
metadata:
|
metadata:
|
||||||
|
|
@ -30,36 +38,153 @@ spec:
|
||||||
value: <PASSWORD>
|
value: <PASSWORD>
|
||||||
```
|
```
|
||||||
|
|
||||||
### Get configuration items using Dapr SDKs
|
### Acquire lock
|
||||||
|
|
||||||
{{< tabs Dotnet Java Python>}}
|
{{< tabs HTTP Dotnet Go >}}
|
||||||
|
|
||||||
|
{{% codetab %}}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -X POST http://localhost:3500/v1.0-alpha1/lock/lockstore
|
||||||
|
-H 'Content-Type: application/json'
|
||||||
|
-d '{"resourceId":"my_file_name", "lockOwner":"random_id_abc123", "expiryInSeconds": 60}'
|
||||||
|
```
|
||||||
|
|
||||||
|
{{% /codetab %}}
|
||||||
|
|
||||||
{{% codetab %}}
|
{{% codetab %}}
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
|
using System;
|
||||||
|
using Dapr.Client;
|
||||||
|
|
||||||
|
namespace LockService
|
||||||
|
{
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static async Task Main(string[] args)
|
||||||
|
{
|
||||||
|
string DAPR_LOCK_NAME = "lockstore";
|
||||||
|
var client = new DaprClientBuilder().Build();
|
||||||
|
|
||||||
|
using (var fileLock = await client.Lock(DAPR_LOCK_NAME, "my_file_name", "random_id_abc123", 60))
|
||||||
|
{
|
||||||
|
if (fileLock.Success)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Success");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Failed to lock {fileName}.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
{{% /codetab %}}
|
{{% /codetab %}}
|
||||||
|
|
||||||
{{% codetab %}}
|
{{% codetab %}}
|
||||||
|
|
||||||
```java
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
```
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
{{% /codetab %}}
|
dapr "github.com/dapr/go-sdk/client"
|
||||||
|
)
|
||||||
|
|
||||||
{{% codetab %}}
|
func main() {
|
||||||
|
client, err := dapr.NewClient()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer client.Close()
|
||||||
|
|
||||||
```python
|
resp, err := client.TryLockAlpha1(ctx, "lockstore", &dapr.LockRequest{
|
||||||
|
LockOwner: "random_id_abc123",
|
||||||
|
ResourceID: "my_file_name",
|
||||||
|
ExpiryInSeconds: 60,
|
||||||
|
})
|
||||||
|
|
||||||
|
fmt.Println(resp.Success)
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
{{% /codetab %}}
|
{{% /codetab %}}
|
||||||
|
|
||||||
{{< /tabs >}}
|
{{< /tabs >}}
|
||||||
|
|
||||||
|
### Unlock existing lock
|
||||||
|
|
||||||
|
{{< tabs HTTP Dotnet Go >}}
|
||||||
|
|
||||||
|
{{% codetab %}}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -X POST http://localhost:3500/v1.0-alpha1/unlock/lockstore
|
||||||
|
-H 'Content-Type: application/json'
|
||||||
|
-d '{"resourceId":"my_file_name", "lockOwner":"random_id_abc123"}'
|
||||||
|
```
|
||||||
|
|
||||||
|
{{% /codetab %}}
|
||||||
|
|
||||||
|
{{% codetab %}}
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
using System;
|
||||||
|
using Dapr.Client;
|
||||||
|
|
||||||
|
namespace LockService
|
||||||
|
{
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static async Task Main(string[] args)
|
||||||
|
{
|
||||||
|
string DAPR_LOCK_NAME = "lockstore";
|
||||||
|
var client = new DaprClientBuilder().Build();
|
||||||
|
|
||||||
|
var response = await client.Unlock(DAPR_LOCK_NAME, "my_file_name", "random_id_abc123"));
|
||||||
|
Console.WriteLine(response.LockStatus);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
{{% /codetab %}}
|
||||||
|
|
||||||
|
{{% codetab %}}
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
dapr "github.com/dapr/go-sdk/client"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
client, err := dapr.NewClient()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer client.Close()
|
||||||
|
|
||||||
|
resp, err := client.UnlockAlpha1(ctx, "lockstore", &UnlockRequest{
|
||||||
|
LockOwner: "random_id_abc123",
|
||||||
|
ResourceID: "my_file_name",
|
||||||
|
})
|
||||||
|
|
||||||
|
fmt.Println(resp.Status)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
{{% /codetab %}}
|
||||||
|
|
||||||
|
{{< /tabs >}}
|
||||||
|
|
||||||
## Next steps
|
## Next steps
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue