From 14855725c94c8f8da5836b7a41b1960bbb2f0a3b Mon Sep 17 00:00:00 2001 From: Erica Sadun Date: Wed, 8 Jan 2025 14:52:32 -0700 Subject: [PATCH 1/4] EDU-3170: Add Nexus Task Queue coverage to Workers --- docs/encyclopedia/workers.mdx | 15 ++++++++++++++- .../encyclopedia/workers/nexus-task-queue.png | Bin 0 -> 31211 bytes 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 static/img/encyclopedia/workers/nexus-task-queue.png diff --git a/docs/encyclopedia/workers.mdx b/docs/encyclopedia/workers.mdx index 5de7a6a45b..3f981e6a16 100644 --- a/docs/encyclopedia/workers.mdx +++ b/docs/encyclopedia/workers.mdx @@ -220,7 +220,7 @@ The Temporal Service interprets the outcome and determines whether to retry the A Task Queue is a lightweight, dynamically allocated queue that one or more [Worker Entities](#worker-entity) poll for [Tasks](#task). -There are two types of Task Queues, Activity Task Queues and Workflow Task Queues. +There are three types of Task Queues, Activity Task Queues, Workflow Task Queues, and Nexus Task Queues.
@@ -235,6 +235,19 @@ There are two types of Task Queues, Activity Task Queues and Workflow Task Queue
+
+
+

Nexus Endpoint component

+
+
+ Task Queue component +
+
+ Task Queues are very lightweight components. Task Queues do not require explicit registration but instead are created on demand when a Workflow Execution or Activity spawns or when a Worker Process subscribes to it. When a Task Queue is created, both a Workflow Task Queue and an Activity Task Queue are created under the same name. diff --git a/static/img/encyclopedia/workers/nexus-task-queue.png b/static/img/encyclopedia/workers/nexus-task-queue.png new file mode 100644 index 0000000000000000000000000000000000000000..5dd8cbcaee7a9b3fd262928ed63eff9152ffbd8f GIT binary patch literal 31211 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 literal 0 HcmV?d00001 From 61fb0eae62cf3c408c863a84d33166f16e825705 Mon Sep 17 00:00:00 2001 From: Erica Sadun Date: Thu, 9 Jan 2025 13:40:09 -0700 Subject: [PATCH 2/4] EDU-3170: Updates Worker Task Queue coverage for Nexus SME Phil --- docs/encyclopedia/workers.mdx | 127 ++++++++++++++++++++-------------- 1 file changed, 76 insertions(+), 51 deletions(-) diff --git a/docs/encyclopedia/workers.mdx b/docs/encyclopedia/workers.mdx index 3f981e6a16..0320774e0b 100644 --- a/docs/encyclopedia/workers.mdx +++ b/docs/encyclopedia/workers.mdx @@ -39,8 +39,7 @@ A Worker Program is the static code that defines the constraints of the Worker P - [How to run a development Worker using the PHP SDK](/develop/php/core-application#run-a-dev-worker) - [How to run a development Worker using the Python SDK](/develop/python/core-application#run-a-dev-worker) - [How to run a development Worker using the TypeScript SDK](/develop/typescript/core-application#run-a-dev-worker) -- [How to run a development Worker using the .NET SDK](/develop/dotnet/core-application#run-worker-process) - +- [How to run a development Worker using the .NET SDK](/develop/dotnet/core-application#run-worker-process)

- [How to run a Temporal Cloud Worker using the Go SDK](/develop/go/core-application#run-a-temporal-cloud-worker) - [How to run a Temporal Cloud Worker using the TypeScript SDK](/develop/typescript/core-application#run-a-temporal-cloud-worker) @@ -219,8 +218,7 @@ The Temporal Service interprets the outcome and determines whether to retry the ## What is a Task Queue? {#task-queue} A Task Queue is a lightweight, dynamically allocated queue that one or more [Worker Entities](#worker-entity) poll for [Tasks](#task). - -There are three types of Task Queues, Activity Task Queues, Workflow Task Queues, and Nexus Task Queues. +There are three types of Task Queues: Activity Task Queues, Workflow Task Queues, and Nexus Task Queues.

@@ -235,6 +233,10 @@ There are three types of Task Queues, Activity Task Queues, Workflow Task Queues
+A Nexus Endpoint creates an entry point that separates callers from the underlying Nexus Task Queue. +The Nexus callers only interact with the Nexus Endpoint. +This endpoint routes Nexus Requests to a target Task Queue that's polled by a Nexus Worker. +

Nexus Endpoint component

@@ -242,85 +244,108 @@ There are three types of Task Queues, Activity Task Queues, Workflow Task Queues
Task Queue component
-Task Queues are very lightweight components. -Task Queues do not require explicit registration but instead are created on demand when a Workflow Execution or Activity spawns or when a Worker Process subscribes to it. -When a Task Queue is created, both a Workflow Task Queue and an Activity Task Queue are created under the same name. -There is no limit to the number of Task Queues a Temporal Application can use or a Temporal Service can maintain. +Task Queues are lightweight components that don’t require explicit registration. +They’re created on demand when a Workflow Execution, Activity, or Nexus Operation is invoked, and/or when a Worker Process subscribes to start polling. +When a named Task Queue is created, individual Task Queues for Workflows, Activities, and Nexus are created using the same name. +A Temporal Application can use, and the Temporal Service can maintain, an unlimited number of Task Queues. Workers poll for Tasks in Task Queues via synchronous RPC. This implementation offers several benefits: - A Worker Process polls for a message only when it has spare capacity, avoiding overloading itself. - In effect, Task Queues enable load balancing across many Worker Processes. -- Task Queues enable what we call [Task Routing](#task-routing), which is the routing of specific Tasks to specific Worker Processes or even a specific process. -- Task Queues support server-side throttling, which enables you to limit the Task dispatching rate to the pool of Worker Processes while still supporting Task dispatching at higher rates when spikes happen. -- When all Worker Processes are down, messages simply persist in a Task Queue, waiting for the Worker Processes to recover. +- Task Queues enable [Task Routing](#task-routing), which is the routing of specific Tasks to specific Worker Processes or even a specific process. +- Activity Task Queues support server-side throttling, which enables you to limit the Task dispatching rate to the pool of Worker Processes while still supporting Task dispatching at higher rates when spikes happen. +- Workflow and Activity Tasks persist in a Task Queue. + When a Worker Process goes down, the messages remain until the Worker recovers and can process the Tasks. +- Nexus and Query Tasks are not persisted. + Instead, they are sync matched when, and only when, polled by a Worker. + Sync matching immediately matches and delivers a Task to an available Worker without persisting a Task to the Service database. + The caller is responsible to retry failed operations. + Caller Workflows that invoke Nexus Operations will automatically retry Nexus Tasks until exceeding the Schedule-to-Close timeout. - Worker Processes do not need to advertise themselves through DNS or any other network discovery mechanism. -- Worker Processes do not need to have any open ports, which is more secure. +- Worker Processes connect directly to the Temporal Service for secure communication without needing to open exposed ports. + +Any Worker can pick up any Task on a given Task Queue. +You must ensure that if a Worker accepts a Task that it can process that task using one of its registered Workflows, Activities, or Nexus Operation handlers. +This means that all Workers listening to a Task Queue must register all Tasks and Nexus Operations that live on that Queue. -All Workers listening to a given Task Queue must have identical registrations of Activities and/or Workflows. -The one exception is during a Server upgrade, where it is okay to have registration temporarily misaligned while the binary rolls out. +There are two exceptions to this "Task Queue Workers with identical registrations" rule. +First, Worker Versioning may be used. +During a Worker upgrade binary rollouts, it's okay to have temporarily misaligned registrations. +Second, dynamic Workflows or Activity components may be used. +If a Task arrives with a recognized method signature, the Worker can use a pre-registered dynamic stand-in. + +When Workers don't have a registered Workflow, Activity, Nexus Operation, or dynamic Workflow or Activity component for a given Task, the Task will fail with a "Not Found" error. +- "Not Found" Workflow Tasks and Activity Tasks are treated as *retryable* errors. +- "Not Found" Nexus Operation handlers are *non-retryable* and must be manually retried from the caller Workflow. #### Where to set Task Queues -There are four places where the name of the Task Queue can be set by the developer. +There are five places where the name of the Task Queue can be set by the developer. 1. A Task Queue must be set when spawning a Workflow Execution: -- [How to start a Workflow Execution using the Temporal CLI](/cli/workflow#start) -- [How to start a Workflow Execution using the Go SDK](/develop/go/temporal-clients#start-workflow-execution) -- [How to start a Workflow Execution using the Java SDK](/develop/java/temporal-clients#start-workflow-execution) -- [How to start a Workflow Execution using the PHP SDK](/develop/php/temporal-clients#start-workflow-execution) -- [How to start a Workflow Execution using the Python SDK](/develop/python/temporal-clients#start-workflow-execution) -- [How to start a Workflow Execution using the TypeScript SDK](/develop/typescript/temporal-clients#start-workflow-execution) -- [How to start a Workflow Execution using the .NET SDK](/develop/dotnet/temporal-client#start-workflow) + - [How to start a Workflow Execution using the Temporal CLI](/cli/workflow#start) + - [How to start a Workflow Execution using the Go SDK](/develop/go/temporal-clients#start-workflow-execution) + - [How to start a Workflow Execution using the Java SDK](/develop/java/temporal-clients#start-workflow-execution) + - [How to start a Workflow Execution using the PHP SDK](/develop/php/temporal-clients#start-workflow-execution) + - [How to start a Workflow Execution using the Python SDK](/develop/python/temporal-clients#start-workflow-execution) + - [How to start a Workflow Execution using the TypeScript SDK](/develop/typescript/temporal-clients#start-workflow-execution) + - [How to start a Workflow Execution using the .NET SDK](/develop/dotnet/temporal-client#start-workflow) 2. A Task Queue name must be set when creating a Worker Entity and when running a Worker Process: -- [How to run a development Worker using the Go SDK](/develop/go/core-application#develop-worker) -- [How to run a development Worker using the Java SDK](/develop/java/core-application#run-a-dev-worker) -- [How to run a development Worker using the PHP SDK](/develop/php/core-application#run-a-dev-worker) -- [How to run a development Worker using the Python SDK](/develop/python/core-application#run-a-dev-worker) -- [How to run a development Worker using the TypeScript SDK](/develop/typescript/core-application#run-a-dev-worker) -- [How to run a development Worker using the .NET SDK](/develop/dotnet/core-application#run-worker-process) + - [How to run a development Worker using the Go SDK](/develop/go/core-application#develop-worker) + - [How to run a development Worker using the Java SDK](/develop/java/core-application#run-a-dev-worker) + - [How to run a development Worker using the PHP SDK](/develop/php/core-application#run-a-dev-worker) + - [How to run a development Worker using the Python SDK](/develop/python/core-application#run-a-dev-worker) + - [How to run a development Worker using the TypeScript SDK](/develop/typescript/core-application#run-a-dev-worker) + - [How to run a development Worker using the .NET SDK](/develop/dotnet/core-application#run-worker-process)

+ - [How to run a Temporal Cloud Worker using the Go SDK](/develop/go/core-application#run-a-temporal-cloud-worker) + - [How to run a Temporal Cloud Worker using the TypeScript SDK](/develop/typescript/core-application#run-a-temporal-cloud-worker) -- [How to run a Temporal Cloud Worker using the Go SDK](/develop/go/core-application#run-a-temporal-cloud-worker) -- [How to run a Temporal Cloud Worker using the TypeScript SDK](/develop/typescript/core-application#run-a-temporal-cloud-worker) + Note that all Worker Entities listening to the same Task Queue name must be registered to handle the exact same Workflows Types and Activity Types. -Note that all Worker Entities listening to the same Task Queue name must be registered to handle the exact same Workflows Types and Activity Types. - -If a Worker Entity polls a Task for a Workflow Type or Activity Type it does not know about, it will fail that Task. -However, the failure of the Task will not cause the associated Workflow Execution to fail. + If a Worker Entity polls a Task for a Workflow Type or Activity Type it does not know about, it will fail that Task. + However, the failure of the Task will not cause the associated Workflow Execution to fail. 3. A Task Queue name can be provided when spawning an Activity Execution: -This is optional. -An Activity Execution inherits the Task Queue name from its Workflow Execution if one is not provided. + This is optional. + An Activity Execution inherits the Task Queue name from its Workflow Execution if one is not provided. -- [How to start an Activity Execution using the Go SDK](/develop/go/core-application#activity-execution) -- [How to start an Activity Execution using the Java SDK](/develop/java/core-application#activity-execution) -- [How to start an Activity Execution using the PHP SDK](/develop/php/core-application#activity-execution) -- [How to start an Activity Execution using the Python SDK](/develop/python/core-application#activity-execution) -- [How to start an Activity Execution using the TypeScript SDK](/develop/typescript/core-application#activity-execution) -- [How to start an Activity Execution using the .NET SDK](/develop/dotnet/core-application#activity-execution) + - [How to start an Activity Execution using the Go SDK](/develop/go/core-application#activity-execution) + - [How to start an Activity Execution using the Java SDK](/develop/java/core-application#activity-execution) + - [How to start an Activity Execution using the PHP SDK](/develop/php/core-application#activity-execution) + - [How to start an Activity Execution using the Python SDK](/develop/python/core-application#activity-execution) + - [How to start an Activity Execution using the TypeScript SDK](/develop/typescript/core-application#activity-execution) + - [How to start an Activity Execution using the .NET SDK](/develop/dotnet/core-application#activity-execution) 4. A Task Queue name can be provided when spawning a Child Workflow Execution: -This is optional. -A Child Workflow Execution inherits the Task Queue name from its Parent Workflow Execution if one is not provided. + This is optional. + A Child Workflow Execution inherits the Task Queue name from its Parent Workflow Execution if one is not provided. + + - [How to start a Child Workflow Execution using the Go SDK](/develop/go/child-workflows) + - [How to start a Child Workflow Execution using the Java SDK](/develop/java/child-workflows) + - [How to start a Child Workflow Execution using the PHP SDK](/develop/php/continue-as-new) + - [How to start a Child Workflow Execution using the Python SDK](/develop/python/child-workflows) + - [How to start a Child Workflow Execution using the TypeScript SDK](/develop/typescript/child-workflows) + - [How to start a Child Workflow Execution using the .NET SDK](/develop/dotnet/child-workflows) + +5. A Task Queue name can be provided when creating a Nexus Endpoint. + Nexus Endpoints route requests to the target Task Queue. + Nexus Workers poll the target Task Queue to handle the Nexus Tasks, such as starting or cancelling a Nexus Operation. -- [How to start a Child Workflow Execution using the Go SDK](/develop/go/child-workflows) -- [How to start a Child Workflow Execution using the Java SDK](/develop/java/child-workflows) -- [How to start a Child Workflow Execution using the PHP SDK](/develop/php/continue-as-new) -- [How to start a Child Workflow Execution using the Python SDK](/develop/python/child-workflows) -- [How to start a Child Workflow Execution using the TypeScript SDK](/develop/typescript/child-workflows) -- [How to start a Child Workflow Execution using the .NET SDK](/develop/dotnet/child-workflows) + - [How to run a Nexus Worker using the Go SDK](https://docs.temporal.io/develop/go/nexus#register-a-nexus-service-in-a-worker) + - [How to run a Nexus Worker using the Java SDK](https://docs.temporal.io/develop/java/nexus#register-a-nexus-service-in-a-worker) #### Task ordering From 6ce47716ee14179fdcd45b363450775d00da3f76 Mon Sep 17 00:00:00 2001 From: Erica Sadun <156466156+fairlydurable@users.noreply.github.com> Date: Tue, 14 Jan 2025 14:23:58 -0700 Subject: [PATCH 3/4] Update docs/encyclopedia/workers.mdx Co-authored-by: Roey Berman --- docs/encyclopedia/workers.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/encyclopedia/workers.mdx b/docs/encyclopedia/workers.mdx index 0320774e0b..b835c0c6a2 100644 --- a/docs/encyclopedia/workers.mdx +++ b/docs/encyclopedia/workers.mdx @@ -274,7 +274,7 @@ This implementation offers several benefits: Any Worker can pick up any Task on a given Task Queue. You must ensure that if a Worker accepts a Task that it can process that task using one of its registered Workflows, Activities, or Nexus Operation handlers. -This means that all Workers listening to a Task Queue must register all Tasks and Nexus Operations that live on that Queue. +This means that all Workers listening to a Task Queue must register all Workflows, Activities, and Nexus Operations that live on that Queue. There are two exceptions to this "Task Queue Workers with identical registrations" rule. First, Worker Versioning may be used. From a7980df428c8afc013bb574a26d0eafcf24e9f4a Mon Sep 17 00:00:00 2001 From: Erica Sadun <156466156+fairlydurable@users.noreply.github.com> Date: Tue, 14 Jan 2025 14:24:09 -0700 Subject: [PATCH 4/4] Update docs/encyclopedia/workers.mdx Co-authored-by: Roey Berman --- docs/encyclopedia/workers.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/encyclopedia/workers.mdx b/docs/encyclopedia/workers.mdx index b835c0c6a2..ad88caeec7 100644 --- a/docs/encyclopedia/workers.mdx +++ b/docs/encyclopedia/workers.mdx @@ -311,7 +311,7 @@ There are five places where the name of the Task Queue can be set by the develop - [How to run a Temporal Cloud Worker using the Go SDK](/develop/go/core-application#run-a-temporal-cloud-worker) - [How to run a Temporal Cloud Worker using the TypeScript SDK](/develop/typescript/core-application#run-a-temporal-cloud-worker) - Note that all Worker Entities listening to the same Task Queue name must be registered to handle the exact same Workflows Types and Activity Types. + Note that all Worker Entities listening to the same Task Queue name must be registered to handle the exact same Workflows Types, Activity Types, and Nexus Operations. If a Worker Entity polls a Task for a Workflow Type or Activity Type it does not know about, it will fail that Task. However, the failure of the Task will not cause the associated Workflow Execution to fail.