No use tipos de solicitud por lotes en complementos y actividades de flujo de trabajo
Categoría: uso, fiabilidad, rendimiento
Potencial de impacto: medio
Síntomas
Debido a su naturaleza de larga duración, el uso de las clases de solicitud de mensajes ExecuteMultipleRequest y ExecuteTransactionRequest en el contexto de un complemento o una actividad de flujo de trabajo, expone los tipos de complementos en un espacio aislado a la excepción de tiempo de espera del canal de dos minutos (120000 ms), lo que puede degradar la experiencia del usuario para registros sincrónicos.
Instrucciones
Use estos mensajes por lotes cuando se ejecute código fuera de la canalización de ejecución de la plataforma, como en escenarios de integración donde la latencia de red reduciría el rendimiento e incrementaría la duración de operaciones masivas más voluminosas.
Más concretamente, úselos en los siguientes casos:
Use ExecuteMultipleRequest para cargar datos o procesos externos de forma masiva dirigidos a ejecutar operaciones prolongadas (superiores a dos minutos).
Use ExecuteMultipleRequest para minimizar los viajes de ida y vuelta entre los servidores del cliente personalizado y Dynamics 365, lo que reduce consiguientemente la latencia total acumulada.
Use ExecuteTransactionRequest para clientes externos que requieren confirmar el lote de operaciones como una transacción o reversión de base de datos única y atómica si se producen excepciones. Tenga en cuenta un posible bloqueo de la base de datos mientras dure la transacción prolongada.
Patrones problemáticos
A continuación, se ofrece un ejemplo de uso de ExecuteMultipleRequest con un complemento.
Advertencia
Este escenario debe evitarse.
public class ExecuteMultipleRequestInPlugin : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = factory.CreateOrganizationService(context.UserId);
QueryExpression query = new QueryExpression("account")
{
ColumnSet = new ColumnSet("accountname", "createdon"),
};
//Obtain the results of previous QueryExpression
EntityCollection results = service.RetrieveMultiple(query);
if (results != null && results.Entities != null && results.Entities.Count > 0)
{
ExecuteMultipleRequest batch = new ExecuteMultipleRequest();
foreach (Entity account in results.Entities)
{
account.Attributes["accountname"] += "_UPDATED";
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.Target = account;
batch.Requests.Add(updateRequest);
}
service.Execute(batch);
}
else return;
}
}
Este ejemplo incluye el uso del tipo directamente con el método Execute. Este tipo de uso puede darse en cualquier momento durante la ejecución de un complemento o una actividad de flujo de trabajo. Esto podría ser también en un método contenido en la misma clase o en otra distinta. No se limita a estar directamente contenido en la definición del método Execute.
Información adicional
Los mensajes ExecuteMultiple y ExecuteTransaction se consideran mensajes de solicitud por lotes. Su objetivo es minimizar acciones de ida y vuelta entre el cliente y el servidor en conexiones latencia alta. Los complementos se ejecutan directamente en el proceso de la aplicación o muy cerca cuando están en espacios aislados y la latencia no suele ser un problema. El código del complemento tienen que ser operaciones muy concisas que se ejecuten rápidamente y minimicen el bloqueo para evitar superar los umbrales de tiempo de espera y asegurarse de que el sistema es dinámico en escenarios sincrónicos. Solo tiene que enviar cada solicitud directamente, en lugar de agruparlas en un lote y enviarlo como una sola solicitud.
Por ejemplo: foreach (request in requests) service.Execute(request)
En el servidor, las operaciones incluidas en una solicitud por lotes se ejecutan de forma secuencial y no se realizan en paralelo. Es así aunque la propiedad ExecuteMultipleSettings.ReturnResponses se haya establecido en false. Los programadores tienden a usar solicitudes por lotes de esta manera sabiendo que permitirán el procesamiento en paralelo. La solicitudes por lotes no lograrán este objetivo. Otro factor de motivación común es intentar asegurarse de que cada operación esté incluida en una transacción. Esto no es necesario porque el complemento ya se está ejecutando en la transacción de base de datos, lo que no hace necesario utilizar el mensaje ExecuteTransaction.
Vea también
Marco de trabajo de eventos
Limitaciones al tiempo de ejecución
Ejecutar varias solicitudes con el servicio de la organización
Ejecutar mensajes en una sola transacción de la base de datos
Nota
¿Puede indicarnos sus preferencias de idioma de documentación? Realice una breve encuesta. (tenga en cuenta que esta encuesta está en inglés)
La encuesta durará unos siete minutos. No se recopilan datos personales (declaración de privacidad).
Comentarios
Enviar e ver os comentarios