Remove per-message Task.Run from Service Bus inline message deserialization
Los mantenedores suelen responder en 3 días
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 74/100
- Tipo de issue
- Refactorización
- Claridad
- Bien especificado
- Estado de actividad
- Tranquilo
- Stack tecnológico
- azure, csharp
- Área
- backend, performance
Línea de trabajo
Comienza en src/DurableTask.ServiceBus/Common/ServiceBusUtils.cs, en LoadMessageStreamAsync, y después inspecciona los puntos de llamada de deserialización por lotes en ServiceBusOrchestrationService.cs. Añade cobertura para ambas ramas del framework de destino y verifica que las tareas inline ya estén completas, mientras que la carga de blobs externos permanezca sin cambios. Compara el comportamiento por lotes con el tamaño de prefetch predeterminado usando las medidas de rendimiento solicitadas.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
What is the issue
ServiceBusUtils.LoadMessageStreamAsync queues synchronous, in-memory work to the thread pool for every message whose body is stored inline:
For netstandard2.0, the work is only new MemoryStream(message.Body). For net48, message.GetBody<Stream>() reads the already-received brokered-message body. Neither branch performs asynchronous I/O, but both use Task.Run.
The orchestration and tracking receivers deserialize whole batches through this method using Task.WhenAll:
The configured prefetch count is 50, so a full batch can enqueue 50 trivial thread-pool work items at once:
Performance impact
Each inline message creates and schedules an unnecessary work item plus its task/delegate state. Under sustained load, batches from multiple dispatchers create bursts of thread-pool queueing that add scheduling latency, consume worker threads, and increase short-lived allocations. Thread-pool ramp-up or contention can amplify first-batch and tail latency even though there is no I/O to overlap.
The overhead scales with message rate and is paid before every inline task-message deserialization. The external-blob path is genuinely asynchronous and is not affected by this concern.
Proposed backward-compatible solution
Keep the existing private Task<Stream> signature and return an already-completed task for inline bodies:
#if NETSTANDARD2_0
return Task.FromResult<Stream>(new MemoryStream(message.Body));
#else
return Task.FromResult(message.GetBody<Stream>());
#endif
This preserves the same stream construction and downstream deserialization behavior while removing the thread-pool hop. Leave the blob-store load path unchanged.
Validation
- Add coverage for both target-framework branches confirming that inline bodies deserialize identically and the returned task is already complete.
- Retain integration coverage for external blob-backed messages.
- Benchmark batch deserialization at the default prefetch size, comparing elapsed time, allocations, thread-pool work-item count, and tail latency.
- Lenguaje dominante
- C#
- Estrellas
- 1.7k
- Forks
- 335
- Merge medio
- 5 d 3 h
- PR fusionados (30 d)
- 8
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de Azure/durabletask
-
Dificultad 4/5 3-5 días Aptitud para principiantes 55/100
Azure/durabletask#1398 · 2 comentarios ·
Los mantenedores suelen responder en 3 días
-
Azure Storage backend: control queue partition left unowned for hours/days after lease expiresQuizá libre de nuevo @nytian la tomó hace 35 días y no hay ningún pull request abierto. Abierto
Azure/durabletask#1389 · 1 comentario · 1 asignado ·
Los mantenedores suelen responder en 3 días
-
Dificultad 4/5 3-5 días Aptitud para principiantes 48/100
Azure/durabletask#1332 ·
Los mantenedores suelen responder en 3 días
-
Dificultad 3/5 1-2 días Aptitud para principiantes 58/100
Azure/durabletask#1318 · 1 comentario ·
Los mantenedores suelen responder en 3 días
-
Early (compile-time) detection of non-determinism in orchestrators — maintainer perspective?Abierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
Azure/durabletask#1301 · 3 comentarios ·
Los mantenedores suelen responder en 3 días
Todos los issues de Azure/durabletask
Issues similares
-
S: Untriaged
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
space-wizards/space-station-14#46357 ·
Los mantenedores suelen responder en 1 día
-
Versioning_oM: Remove unneeded depeendecy on Test_oMPosiblemente ocupada @IsakNaslundBh la tomó hoy. Abiertotype:bug type:compliance
Dificultad 2/5 Menos de una hora Aptitud para principiantes 85/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
MicrosoftLearning/PL-400_Microsoft-Power-Platform-Developer#231 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
joinrpg/joinrpg-net#5313 ·
Los mantenedores suelen responder en 1 día