diff --git a/docs/develop/go/best-practices/data-handling/external-storage.mdx b/docs/develop/go/best-practices/data-handling/external-storage.mdx index f0255a644f..10f893c065 100644 --- a/docs/develop/go/best-practices/data-handling/external-storage.mdx +++ b/docs/develop/go/best-practices/data-handling/external-storage.mdx @@ -41,58 +41,43 @@ The Go SDK includes an S3 storage driver. Follow these steps to set it up: 1. Load your AWS configuration and create the S3 storage driver. The driver uses your standard [AWS credentials](https://docs.aws.amazon.com/sdk-for-go/v2/developer-guide/configure-gosdk.html) from the environment (environment variables, IAM role, or AWS config file): +[features/snippets/external_storage/s3_setup/s3_driver_create.go](https://github.com/temporalio/features/blob/main/features/snippets/external_storage/s3_setup/s3_driver_create.go) +```go +cfg, err := config.LoadDefaultConfig(context.Background(), + config.WithRegion("us-east-2"), +) +if err != nil { + log.Fatalf("load AWS config: %v", err) +} - ```go - import ( - "github.com/aws/aws-sdk-go-v2/config" - "github.com/aws/aws-sdk-go-v2/service/s3" - "go.temporal.io/sdk/contrib/aws/s3driver" - "go.temporal.io/sdk/contrib/aws/s3driver/awssdkv2" - ) - - cfg, err := config.LoadDefaultConfig(context.Background(), - config.WithRegion("us-east-2"), - ) - if err != nil { - log.Fatalf("load AWS config: %v", err) - } - - driver, err := s3driver.NewDriver(s3driver.Options{ - Client: awssdkv2.NewClient(s3.NewFromConfig(cfg)), - Bucket: s3driver.StaticBucket("my-temporal-payloads"), - }) - if err != nil { - log.Fatalf("create S3 driver: %v", err) - } - ``` - +driver, err := s3driver.NewDriver(s3driver.Options{ + Client: awssdkv2.NewClient(s3.NewFromConfig(cfg)), + Bucket: s3driver.StaticBucket("my-temporal-payloads"), +}) +if err != nil { + log.Fatalf("create S3 driver: %v", err) +} +``` 2. Configure the driver on `ExternalStorage` and pass it in your Client options: +[features/snippets/external_storage/s3_setup/s3_external_storage_setup.go](https://github.com/temporalio/features/blob/main/features/snippets/external_storage/s3_setup/s3_external_storage_setup.go) +```go +c, err := client.Dial(client.Options{ + HostPort: "localhost:7233", + ExternalStorage: converter.ExternalStorage{ + Drivers: []converter.StorageDriver{driver}, + }, +}) +if err != nil { + log.Fatalf("connect to Temporal: %v", err) +} +defer c.Close() - ```go - import ( - "go.temporal.io/sdk/client" - "go.temporal.io/sdk/converter" - "go.temporal.io/sdk/worker" - ) - - c, err := client.Dial(client.Options{ - HostPort: "localhost:7233", - ExternalStorage: converter.ExternalStorage{ - Drivers: []converter.StorageDriver{driver}, - }, - }) - if err != nil { - log.Fatalf("connect to Temporal: %v", err) - } - defer c.Close() - - w := worker.New(c, "my-task-queue", worker.Options{}) - ``` - +w := worker.New(c, "my-task-queue", worker.Options{}) +``` By default, payloads larger than 256 KiB are offloaded to external storage. You can adjust this with the @@ -112,21 +97,8 @@ The following example shows a custom driver that uses local disk as the backing development and testing only. In production, use a durable storage system that is accessible to all Workers: - +[features/snippets/external_storage/custom_driver/custom_storage_driver.go](https://github.com/temporalio/features/blob/main/features/snippets/external_storage/custom_driver/custom_storage_driver.go) ```go -package main - -import ( - "fmt" - "os" - "path/filepath" - - "github.com/google/uuid" - commonpb "go.temporal.io/api/common/v1" - "go.temporal.io/sdk/converter" - "google.golang.org/protobuf/proto" -) - type LocalDiskStorageDriver struct { storeDir string } @@ -204,7 +176,6 @@ func (d *LocalDiskStorageDriver) Retrieve( return payloads, nil } ``` - The following sections walk through the key parts of the driver implementation. @@ -262,18 +233,15 @@ are offloaded to external storage. You can adjust this with the `PayloadSizeThre externalize all payloads regardless of size. A value of 0 is interpreted as the default (256 KiB). - +[features/snippets/external_storage/threshold/threshold_config.go](https://github.com/temporalio/features/blob/main/features/snippets/external_storage/threshold/threshold_config.go) ```go -import "go.temporal.io/sdk/converter" - c, err := client.Dial(client.Options{ - ExternalStorage: converter.ExternalStorage{ - Drivers: []converter.StorageDriver{driver}, - PayloadSizeThreshold: 1, - }, + ExternalStorage: converter.ExternalStorage{ + Drivers: []converter.StorageDriver{driver}, + PayloadSizeThreshold: 1, + }, }) ``` - ## Use multiple storage drivers @@ -296,29 +264,24 @@ The following example registers two drivers but always selects `preferredDriver` is only registered so the Worker can retrieve payloads that were previously stored with it: - +[features/snippets/external_storage/multiple_drivers/multiple_drivers.go](https://github.com/temporalio/features/blob/main/features/snippets/external_storage/multiple_drivers/multiple_drivers.go) ```go -import ( - commonpb "go.temporal.io/api/common/v1" - "go.temporal.io/sdk/converter" -) - type PreferredSelector struct { - preferred converter.StorageDriver + preferred converter.StorageDriver } func (s *PreferredSelector) SelectDriver( - ctx converter.StorageDriverStoreContext, - payload *commonpb.Payload, + ctx converter.StorageDriverStoreContext, + payload *commonpb.Payload, ) (converter.StorageDriver, error) { - return s.preferred, nil + return s.preferred, nil } -// Usage: -converter.ExternalStorage{ - Drivers: []converter.StorageDriver{preferredDriver, legacyDriver}, - DriverSelector: &PreferredSelector{preferred: preferredDriver}, +func MultipleDriversSetup(preferredDriver, legacyDriver converter.StorageDriver) converter.ExternalStorage { + return converter.ExternalStorage{ + Drivers: []converter.StorageDriver{preferredDriver, legacyDriver}, + DriverSelector: &PreferredSelector{preferred: preferredDriver}, + } } ``` - diff --git a/docs/develop/python/nexus/feature-guide.mdx b/docs/develop/python/nexus/feature-guide.mdx index cd780a52ad..afad0f58d9 100644 --- a/docs/develop/python/nexus/feature-guide.mdx +++ b/docs/develop/python/nexus/feature-guide.mdx @@ -245,7 +245,7 @@ class MyNexusServiceHandler: input.name, # First argument: name input.language, # Second argument: language ], - id=str(uuid.uuid4()), + id=f"hello-multi-args-{input.name}-{input.language}", )