From f527fa5cc9ed1fcc9798434657e9cef630d486e4 Mon Sep 17 00:00:00 2001 From: ShahabT Date: Sun, 22 Feb 2026 19:02:10 -0800 Subject: [PATCH 1/5] Add poller groups --- openapi/openapiv2.json | 19 +++++++++++++++++++ openapi/openapiv3.yaml | 12 ++++++++++++ temporal/api/taskqueue/v1/message.proto | 5 +++++ .../workflowservice/v1/request_response.proto | 14 ++++++++++++-- 4 files changed, 48 insertions(+), 2 deletions(-) diff --git a/openapi/openapiv2.json b/openapi/openapiv2.json index 2f21bedcc..dd5d2a0d2 100644 --- a/openapi/openapiv2.json +++ b/openapi/openapiv2.json @@ -14518,6 +14518,25 @@ "pollerScalingDecision": { "$ref": "#/definitions/v1PollerScalingDecision", "description": "Server-advised information the SDK may use to adjust its poller count." + }, + "pollerGroupInfos": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1PollerGroupInfo" + } + } + } + }, + "v1PollerGroupInfo": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "weight": { + "type": "number", + "format": "float" } } }, diff --git a/openapi/openapiv3.yaml b/openapi/openapiv3.yaml index c220f6773..55e007aa6 100644 --- a/openapi/openapiv3.yaml +++ b/openapi/openapiv3.yaml @@ -11625,6 +11625,18 @@ components: allOf: - $ref: '#/components/schemas/PollerScalingDecision' description: Server-advised information the SDK may use to adjust its poller count. + pollerGroupInfos: + type: array + items: + $ref: '#/components/schemas/PollerGroupInfo' + PollerGroupInfo: + type: object + properties: + id: + type: string + weight: + type: number + format: float PollerInfo: type: object properties: diff --git a/temporal/api/taskqueue/v1/message.proto b/temporal/api/taskqueue/v1/message.proto index 3580abdc2..e3749e6d4 100644 --- a/temporal/api/taskqueue/v1/message.proto +++ b/temporal/api/taskqueue/v1/message.proto @@ -304,6 +304,11 @@ message TimestampedCompatibleBuildIdRedirectRule { google.protobuf.Timestamp create_time = 2; } +message PollerGroupInfo { + string id = 1; + float weight = 2; +} + // Attached to task responses to give hints to the SDK about how it may adjust its number of // pollers. message PollerScalingDecision { diff --git a/temporal/api/workflowservice/v1/request_response.proto b/temporal/api/workflowservice/v1/request_response.proto index 4bf3272c6..fcfb00eea 100644 --- a/temporal/api/workflowservice/v1/request_response.proto +++ b/temporal/api/workflowservice/v1/request_response.proto @@ -257,6 +257,7 @@ message GetWorkflowExecutionHistoryReverseResponse { message PollWorkflowTaskQueueRequest { string namespace = 1; temporal.api.taskqueue.v1.TaskQueue task_queue = 2; + string poller_group_id = 9; // The identity of the worker/client who is polling this task queue string identity = 3; // A unique key for this worker instance, used for tracking worker lifecycle. @@ -275,7 +276,7 @@ message PollWorkflowTaskQueueRequest { temporal.api.deployment.v1.WorkerDeploymentOptions deployment_options = 6; // Removed in 1.55.0; was temporal.api.worker.v1.WorkerHeartbeat worker_heartbeat - reserved 7; + reserved 7; reserved "worker_heartbeat"; } @@ -331,6 +332,7 @@ message PollWorkflowTaskQueueResponse { repeated temporal.api.protocol.v1.Message messages = 15; // Server-advised information the SDK may use to adjust its poller count. temporal.api.taskqueue.v1.PollerScalingDecision poller_scaling_decision = 16; + repeated temporal.api.taskqueue.v1.PollerGroupInfo poller_group_infos = 17; } message RespondWorkflowTaskCompletedRequest { @@ -439,6 +441,7 @@ message RespondWorkflowTaskFailedResponse { message PollActivityTaskQueueRequest { string namespace = 1; temporal.api.taskqueue.v1.TaskQueue task_queue = 2; + string poller_group_id = 9; // The identity of the worker/client string identity = 3; // A unique key for this worker instance, used for tracking worker lifecycle. @@ -512,6 +515,8 @@ message PollActivityTaskQueueResponse { temporal.api.common.v1.Priority priority = 19; // The run ID of the activity execution, only set for standalone activities. string activity_run_id = 20; + + repeated temporal.api.taskqueue.v1.PollerGroupInfo poller_group_infos = 21; } message RecordActivityTaskHeartbeatRequest { @@ -1848,12 +1853,13 @@ message PollWorkflowExecutionUpdateResponse { message PollNexusTaskQueueRequest { string namespace = 1; + temporal.api.taskqueue.v1.TaskQueue task_queue = 3; + string poller_group_id = 9; // The identity of the client who initiated this request. string identity = 2; // A unique key for this worker instance, used for tracking worker lifecycle. // This is guaranteed to be unique, whereas identity is not guaranteed to be unique. string worker_instance_key = 8; - temporal.api.taskqueue.v1.TaskQueue task_queue = 3; // Information about this worker's build identifier and if it is choosing to use the versioning // feature. See the `WorkerVersionCapabilities` docstring for more. // Deprecated. Replaced by deployment_options. @@ -1872,6 +1878,8 @@ message PollNexusTaskQueueResponse { temporal.api.nexus.v1.Request request = 2; // Server-advised information the SDK may use to adjust its poller count. temporal.api.taskqueue.v1.PollerScalingDecision poller_scaling_decision = 3; + string resource_id = 4; + repeated temporal.api.taskqueue.v1.PollerGroupInfo poller_group_infos = 5; } message RespondNexusTaskCompletedRequest { @@ -1882,6 +1890,7 @@ message RespondNexusTaskCompletedRequest { bytes task_token = 3; // Embedded response to be translated into a frontend response. temporal.api.nexus.v1.Response response = 4; + string resource_id = 5; } message RespondNexusTaskCompletedResponse { @@ -1897,6 +1906,7 @@ message RespondNexusTaskFailedRequest { temporal.api.nexus.v1.HandlerError error = 4 [deprecated = true]; // The error the handler failed with. Must contain a NexusHandlerFailureInfo object. temporal.api.failure.v1.Failure failure = 5; + string resource_id = 6; } message RespondNexusTaskFailedResponse { From 641feb1b6ffa5d89055c2931b57b15ee65080381 Mon Sep 17 00:00:00 2001 From: ShahabT Date: Wed, 25 Feb 2026 18:11:17 -0800 Subject: [PATCH 2/5] rename resource_id to routing key for nexus --- .../api/workflowservice/v1/request_response.proto | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/temporal/api/workflowservice/v1/request_response.proto b/temporal/api/workflowservice/v1/request_response.proto index fcfb00eea..976bfeb09 100644 --- a/temporal/api/workflowservice/v1/request_response.proto +++ b/temporal/api/workflowservice/v1/request_response.proto @@ -1878,7 +1878,9 @@ message PollNexusTaskQueueResponse { temporal.api.nexus.v1.Request request = 2; // Server-advised information the SDK may use to adjust its poller count. temporal.api.taskqueue.v1.PollerScalingDecision poller_scaling_decision = 3; - string resource_id = 4; + // Should be return in RespondNexusTaskCompletedRequest and RespondNexusTaskFailedRequest + // for proper routing of handler's response. + string routing_key = 4; repeated temporal.api.taskqueue.v1.PollerGroupInfo poller_group_infos = 5; } @@ -1890,7 +1892,9 @@ message RespondNexusTaskCompletedRequest { bytes task_token = 3; // Embedded response to be translated into a frontend response. temporal.api.nexus.v1.Response response = 4; - string resource_id = 5; + // Client must forward the routing_key received in PollNexusTaskQueueResponse for proper routing + // of response. + string routing_key = 5; } message RespondNexusTaskCompletedResponse { @@ -1906,7 +1910,9 @@ message RespondNexusTaskFailedRequest { temporal.api.nexus.v1.HandlerError error = 4 [deprecated = true]; // The error the handler failed with. Must contain a NexusHandlerFailureInfo object. temporal.api.failure.v1.Failure failure = 5; - string resource_id = 6; + // Client must forward the routing_key received in PollNexusTaskQueueResponse for proper routing + // of response. + string routing_key = 6; } message RespondNexusTaskFailedResponse { From c2c59955a7e14385a0a670df981634230434c62e Mon Sep 17 00:00:00 2001 From: ShahabT Date: Wed, 25 Feb 2026 19:09:05 -0800 Subject: [PATCH 3/5] fix typo --- temporal/api/workflowservice/v1/request_response.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporal/api/workflowservice/v1/request_response.proto b/temporal/api/workflowservice/v1/request_response.proto index 976bfeb09..7bba86710 100644 --- a/temporal/api/workflowservice/v1/request_response.proto +++ b/temporal/api/workflowservice/v1/request_response.proto @@ -1878,7 +1878,7 @@ message PollNexusTaskQueueResponse { temporal.api.nexus.v1.Request request = 2; // Server-advised information the SDK may use to adjust its poller count. temporal.api.taskqueue.v1.PollerScalingDecision poller_scaling_decision = 3; - // Should be return in RespondNexusTaskCompletedRequest and RespondNexusTaskFailedRequest + // Should be returned in RespondNexusTaskCompletedRequest and RespondNexusTaskFailedRequest // for proper routing of handler's response. string routing_key = 4; repeated temporal.api.taskqueue.v1.PollerGroupInfo poller_group_infos = 5; From 3385ec2bd5abded906135f08f4f7e565a08e5675 Mon Sep 17 00:00:00 2001 From: ShahabT Date: Tue, 24 Mar 2026 16:44:34 -0700 Subject: [PATCH 4/5] Add poller group fields --- openapi/openapiv2.json | 7 ++- openapi/openapiv3.yaml | 12 ++++ .../workflowservice/v1/request_response.proto | 58 ++++++++++++++++--- temporal/api/workflowservice/v1/service.proto | 27 ++++++++- 4 files changed, 93 insertions(+), 11 deletions(-) diff --git a/openapi/openapiv2.json b/openapi/openapiv2.json index 7db73e3a1..61f32bd54 100644 --- a/openapi/openapiv2.json +++ b/openapi/openapiv2.json @@ -14589,12 +14589,17 @@ "$ref": "#/definitions/v1PollerScalingDecision", "description": "Server-advised information the SDK may use to adjust its poller count." }, + "pollerGroupId": { + "type": "string", + "description": "This poller group ID identifies the owner of the workflow task awaiting for query response.\nCorresponding RespondQueryTaskCompleted should pass this value for proper routing." + }, "pollerGroupInfos": { "type": "array", "items": { "type": "object", "$ref": "#/definitions/v1PollerGroupInfo" - } + }, + "description": "The weighted list of poller groups IDs that client should use for future polls to this task\nqueue. Client is expected to:\n 1. Maintain minimum number of pollers no less than the number of groups.\n 2. Try to assign the next poll to a group without any pending polls,\n 3. If every group has some pending polls, assign the next poll to a group randomly\n according to the weights." } } }, diff --git a/openapi/openapiv3.yaml b/openapi/openapiv3.yaml index 674faeb0d..c80e9dbab 100644 --- a/openapi/openapiv3.yaml +++ b/openapi/openapiv3.yaml @@ -11647,10 +11647,22 @@ components: allOf: - $ref: '#/components/schemas/PollerScalingDecision' description: Server-advised information the SDK may use to adjust its poller count. + pollerGroupId: + type: string + description: |- + This poller group ID identifies the owner of the workflow task awaiting for query response. + Corresponding RespondQueryTaskCompleted should pass this value for proper routing. pollerGroupInfos: type: array items: $ref: '#/components/schemas/PollerGroupInfo' + description: |- + The weighted list of poller groups IDs that client should use for future polls to this task + queue. Client is expected to: + 1. Maintain minimum number of pollers no less than the number of groups. + 2. Try to assign the next poll to a group without any pending polls, + 3. If every group has some pending polls, assign the next poll to a group randomly + according to the weights. PollerGroupInfo: type: object properties: diff --git a/temporal/api/workflowservice/v1/request_response.proto b/temporal/api/workflowservice/v1/request_response.proto index e7f01738f..9feaab034 100644 --- a/temporal/api/workflowservice/v1/request_response.proto +++ b/temporal/api/workflowservice/v1/request_response.proto @@ -257,6 +257,10 @@ message GetWorkflowExecutionHistoryReverseResponse { message PollWorkflowTaskQueueRequest { string namespace = 1; temporal.api.taskqueue.v1.TaskQueue task_queue = 2; + // Client must pass one of the poller group IDs received in `poller_group_infos` of the last + // the PollWorkflowTaskQueueResponse according to the instructions. If not set, the poll is + // routed randomly which can cause it being blocked without receiving a task while the queue + // actually has tasks in another server location. string poller_group_id = 9; // The identity of the worker/client who is polling this task queue string identity = 3; @@ -332,7 +336,16 @@ message PollWorkflowTaskQueueResponse { repeated temporal.api.protocol.v1.Message messages = 15; // Server-advised information the SDK may use to adjust its poller count. temporal.api.taskqueue.v1.PollerScalingDecision poller_scaling_decision = 16; - repeated temporal.api.taskqueue.v1.PollerGroupInfo poller_group_infos = 17; + // This poller group ID identifies the owner of the workflow task awaiting for query response. + // Corresponding RespondQueryTaskCompleted should pass this value for proper routing. + string poller_group_id = 17; + // The weighted list of poller groups IDs that client should use for future polls to this task + // queue. Client is expected to: + // 1. Maintain minimum number of pollers no less than the number of groups. + // 2. Try to assign the next poll to a group without any pending polls, + // 3. If every group has some pending polls, assign the next poll to a group randomly + // according to the weights. + repeated temporal.api.taskqueue.v1.PollerGroupInfo poller_group_infos = 18; } message RespondWorkflowTaskCompletedRequest { @@ -445,6 +458,10 @@ message RespondWorkflowTaskFailedResponse { message PollActivityTaskQueueRequest { string namespace = 1; temporal.api.taskqueue.v1.TaskQueue task_queue = 2; + // Client must pass one of the poller group IDs received in `poller_group_infos` of the last + // the PollActivityTaskQueueResponse according to the instructions. If not set, the poll is + // routed randomly which can cause it being blocked without receiving a task while the queue + // actually has tasks in another server location. string poller_group_id = 9; // The identity of the worker/client string identity = 3; @@ -519,7 +536,12 @@ message PollActivityTaskQueueResponse { temporal.api.common.v1.Priority priority = 19; // The run ID of the activity execution, only set for standalone activities. string activity_run_id = 20; - + // The weighted list of poller groups IDs that client should use for future polls to this task + // queue. Client is expected to: + // 1. Maintain minimum number of pollers no less than the number of groups. + // 2. Try to assign the next poll to a group without any pending polls, + // 3. If every group has some pending polls, assign the next poll to a group randomly + // according to the weights. repeated temporal.api.taskqueue.v1.PollerGroupInfo poller_group_infos = 21; } @@ -1033,6 +1055,9 @@ message RespondQueryTaskCompletedRequest { // Why did the task fail? It's important to note that many of the variants in this enum cannot // apply to worker responses. See the type's doc for more. temporal.api.enums.v1.WorkflowTaskFailedCause cause = 8; + // Client must forward the poller_group_id received in PollWorkflowTaskQueueResponse for proper + // routing of the response. + string poller_group_id = 9; } message RespondQueryTaskCompletedResponse { @@ -1874,6 +1899,10 @@ message PollWorkflowExecutionUpdateResponse { message PollNexusTaskQueueRequest { string namespace = 1; temporal.api.taskqueue.v1.TaskQueue task_queue = 3; + // Client must pass one of the poller group IDs received in `poller_group_infos` of the last + // the PollNexusTaskQueueResponse according to the instructions. If not set, the poll is + // routed randomly which can cause it being blocked without receiving a task while the queue + // actually has tasks in another server location. string poller_group_id = 9; // The identity of the client who initiated this request. string identity = 2; @@ -1901,7 +1930,18 @@ message PollNexusTaskQueueResponse { // Should be returned in RespondNexusTaskCompletedRequest and RespondNexusTaskFailedRequest // for proper routing of handler's response. string routing_key = 4; - repeated temporal.api.taskqueue.v1.PollerGroupInfo poller_group_infos = 5; + // This poller group ID identifies the owner of the nexus task awaiting for synchronous + // response. + // Corresponding `RespondNexusTaskCompleted` and `RespondNexusTaskFailed` calls should pass this + // value for proper response routing. + string poller_group_id = 5; + // The weighted list of poller groups IDs that client should use for future polls to this task + // queue. Client is expected to: + // 1. Maintain minimum number of pollers no less than the number of groups. + // 2. Try to assign the next poll to a group without any pending polls, + // 3. If every group has some pending polls, assign the next poll to a group randomly + // according to the weights. + repeated temporal.api.taskqueue.v1.PollerGroupInfo poller_group_infos = 6; } message RespondNexusTaskCompletedRequest { @@ -1912,9 +1952,9 @@ message RespondNexusTaskCompletedRequest { bytes task_token = 3; // Embedded response to be translated into a frontend response. temporal.api.nexus.v1.Response response = 4; - // Client must forward the routing_key received in PollNexusTaskQueueResponse for proper routing - // of response. - string routing_key = 5; + // Client must forward the poller_group_id received in PollNexusTaskQueueResponse for proper + // routing of the response. + string poller_group_id = 5; } message RespondNexusTaskCompletedResponse { @@ -1930,9 +1970,9 @@ message RespondNexusTaskFailedRequest { temporal.api.nexus.v1.HandlerError error = 4 [deprecated = true]; // The error the handler failed with. Must contain a NexusHandlerFailureInfo object. temporal.api.failure.v1.Failure failure = 5; - // Client must forward the routing_key received in PollNexusTaskQueueResponse for proper routing - // of response. - string routing_key = 6; + // Client must forward the poller_group_id received in PollNexusTaskQueueResponse for proper + // routing of the response. + string poller_group_id = 6; } message RespondNexusTaskFailedResponse { diff --git a/temporal/api/workflowservice/v1/service.proto b/temporal/api/workflowservice/v1/service.proto index 18e579c2c..f2e18c9a7 100644 --- a/temporal/api/workflowservice/v1/service.proto +++ b/temporal/api/workflowservice/v1/service.proto @@ -166,6 +166,10 @@ service WorkflowService { // (-- api-linter: core::0127::http-annotation=disabled // aip.dev/not-precedent: We do not expose worker API to HTTP. --) rpc PollWorkflowTaskQueue (PollWorkflowTaskQueueRequest) returns (PollWorkflowTaskQueueResponse) { + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "poller:{poller_group_id}" + }; } // RespondWorkflowTaskCompleted is called by workers to successfully complete workflow tasks @@ -219,6 +223,10 @@ service WorkflowService { // (-- api-linter: core::0127::http-annotation=disabled // aip.dev/not-precedent: We do not expose worker API to HTTP. --) rpc PollActivityTaskQueue (PollActivityTaskQueueRequest) returns (PollActivityTaskQueueResponse) { + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "poller:{poller_group_id}" + }; } // RecordActivityTaskHeartbeat is optionally called by workers while they execute activities. @@ -618,7 +626,12 @@ service WorkflowService { // // (-- api-linter: core::0127::http-annotation=disabled // aip.dev/not-precedent: We do not expose worker API to HTTP. --) - rpc RespondQueryTaskCompleted (RespondQueryTaskCompletedRequest) returns (RespondQueryTaskCompletedResponse) {} + rpc RespondQueryTaskCompleted (RespondQueryTaskCompletedRequest) returns (RespondQueryTaskCompletedResponse) { + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "poller:{poller_group_id}" + }; + } // ResetStickyTaskQueue resets the sticky task queue related information in the mutable state of // a given workflow. This is prudent for workers to perform if a workflow has been paged out of @@ -1240,18 +1253,30 @@ service WorkflowService { // (-- api-linter: core::0127::http-annotation=disabled // aip.dev/not-precedent: We do not expose worker API to HTTP. --) rpc PollNexusTaskQueue(PollNexusTaskQueueRequest) returns (PollNexusTaskQueueResponse) { + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "poller:{poller_group_id}" + }; } // RespondNexusTaskCompleted is called by workers to respond to Nexus tasks received via PollNexusTaskQueue. // (-- api-linter: core::0127::http-annotation=disabled // aip.dev/not-precedent: We do not expose worker API to HTTP. --) rpc RespondNexusTaskCompleted(RespondNexusTaskCompletedRequest) returns (RespondNexusTaskCompletedResponse) { + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "poller:{poller_group_id}" + }; } // RespondNexusTaskFailed is called by workers to fail Nexus tasks received via PollNexusTaskQueue. // (-- api-linter: core::0127::http-annotation=disabled // aip.dev/not-precedent: We do not expose worker API to HTTP. --) rpc RespondNexusTaskFailed(RespondNexusTaskFailedRequest) returns (RespondNexusTaskFailedResponse) { + option (temporal.api.protometa.v1.request_header) = { + header: "temporal-resource-id" + value: "poller:{poller_group_id}" + }; } // UpdateActivityOptions is called by the client to update the options of an activity by its ID or type. From d051ae734ae00303ed191f73d4d16b4e2e3f75cf Mon Sep 17 00:00:00 2001 From: ShahabT Date: Wed, 25 Mar 2026 14:30:52 -0700 Subject: [PATCH 5/5] address comments --- .../workflowservice/v1/request_response.proto | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/temporal/api/workflowservice/v1/request_response.proto b/temporal/api/workflowservice/v1/request_response.proto index 9feaab034..ca4a3d772 100644 --- a/temporal/api/workflowservice/v1/request_response.proto +++ b/temporal/api/workflowservice/v1/request_response.proto @@ -257,10 +257,10 @@ message GetWorkflowExecutionHistoryReverseResponse { message PollWorkflowTaskQueueRequest { string namespace = 1; temporal.api.taskqueue.v1.TaskQueue task_queue = 2; - // Client must pass one of the poller group IDs received in `poller_group_infos` of the last - // the PollWorkflowTaskQueueResponse according to the instructions. If not set, the poll is - // routed randomly which can cause it being blocked without receiving a task while the queue - // actually has tasks in another server location. + // Unless this is the first poll, the client must pass one of the poller group IDs received in + // `poller_group_infos` of the last the PollWorkflowTaskQueueResponse according to the + // instructions. If not set, the poll is routed randomly which can cause it being blocked + // without receiving a task while the queue actually has tasks in another server location. string poller_group_id = 9; // The identity of the worker/client who is polling this task queue string identity = 3; @@ -458,10 +458,10 @@ message RespondWorkflowTaskFailedResponse { message PollActivityTaskQueueRequest { string namespace = 1; temporal.api.taskqueue.v1.TaskQueue task_queue = 2; - // Client must pass one of the poller group IDs received in `poller_group_infos` of the last - // the PollActivityTaskQueueResponse according to the instructions. If not set, the poll is - // routed randomly which can cause it being blocked without receiving a task while the queue - // actually has tasks in another server location. + // Unless this is the first poll, the client must pass one of the poller group IDs received in + // `poller_group_infos` of the last the PollActivityTaskQueueResponse according to the + // instructions. If not set, the poll is routed randomly which can cause it being blocked + // without receiving a task while the queue actually has tasks in another server location. string poller_group_id = 9; // The identity of the worker/client string identity = 3; @@ -1899,10 +1899,10 @@ message PollWorkflowExecutionUpdateResponse { message PollNexusTaskQueueRequest { string namespace = 1; temporal.api.taskqueue.v1.TaskQueue task_queue = 3; - // Client must pass one of the poller group IDs received in `poller_group_infos` of the last - // the PollNexusTaskQueueResponse according to the instructions. If not set, the poll is - // routed randomly which can cause it being blocked without receiving a task while the queue - // actually has tasks in another server location. + // Unless this is the first poll, the client must pass one of the poller group IDs received in + // `poller_group_infos` of the last the PollNexusTaskQueueResponse according to the + // instructions. If not set, the poll is routed randomly which can cause it being blocked + // without receiving a task while the queue actually has tasks in another server location. string poller_group_id = 9; // The identity of the client who initiated this request. string identity = 2; @@ -1927,21 +1927,18 @@ message PollNexusTaskQueueResponse { temporal.api.nexus.v1.Request request = 2; // Server-advised information the SDK may use to adjust its poller count. temporal.api.taskqueue.v1.PollerScalingDecision poller_scaling_decision = 3; - // Should be returned in RespondNexusTaskCompletedRequest and RespondNexusTaskFailedRequest - // for proper routing of handler's response. - string routing_key = 4; // This poller group ID identifies the owner of the nexus task awaiting for synchronous // response. // Corresponding `RespondNexusTaskCompleted` and `RespondNexusTaskFailed` calls should pass this // value for proper response routing. - string poller_group_id = 5; + string poller_group_id = 4; // The weighted list of poller groups IDs that client should use for future polls to this task // queue. Client is expected to: // 1. Maintain minimum number of pollers no less than the number of groups. // 2. Try to assign the next poll to a group without any pending polls, // 3. If every group has some pending polls, assign the next poll to a group randomly // according to the weights. - repeated temporal.api.taskqueue.v1.PollerGroupInfo poller_group_infos = 6; + repeated temporal.api.taskqueue.v1.PollerGroupInfo poller_group_infos = 5; } message RespondNexusTaskCompletedRequest {