Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Catégorie : Utilisation, fiabilité, performances
Potentiel d’impact : Moyen
Symptômes
Les expériences utilisateur sont détériorées et les erreurs de délai d’attente peuvent se produire lorsque vous utilisez des types de requêtes par lots dans des plug-ins et des activités de flux de travail qui se produisent dans des opérations synchrones.
Les classes de demande de message suivantes sont considérées comme des types de requêtes par lots , car elles effectuent des opérations sur plusieurs enregistrements au sein d’une seule requête :
- ExecuteMultipleRequest
- ExecuteTransactionRequest
- CreateMultipleRequest
- UpdateMultipleRequest
- UpsertMultipleRequest
Instructions
Utilisez ces messages de lot dans les applications clientes pour effectuer des opérations sur plusieurs enregistrements. N’utilisez pas ces messages dans le code que Dataverse appelle pendant l’exécution d’une autre opération : une activité de plug-in ou de flux de travail inscrite pour une étape synchrone.
Plus précisément, utilisez-les dans les scénarios suivants :
Utilisez ExecuteMultipleRequest pour charger en bloc des données ou des processus externes conçus pour exécuter des opérations de longue durée (supérieures à deux minutes).
Permet ExecuteMultipleRequest de réduire les allers-retours entre le client personnalisé et les serveurs Dataverse, afin de réduire la latence cumulative encourue.
Utilisez ExecuteTransactionRequest pour les clients externes qui nécessitent que le lot d’opérations soit validé comme étant une transaction de base de données atomique unique, ou annulé en cas d'exception. Tenez compte du risque de blocage de la base de données pendant la transaction de longue durée.
Utilisez des messages d’opération en bloc (CreateMultipleRequest, UpdateMultipleRequestet UpsertMultipleRequest) pour les mêmes scénarios et pour atteindre un niveau de débit supérieur.
Schémas problématiques
L’exemple suivant montre l’utilisation ExecuteMultipleRequest dans le contexte d’un plug-in.
Avertissement
Ce scénario doit être évité.
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;
}
}
Cet exemple inclut l’utilisation du type directement avec la Execute méthode. L’utilisation peut être n’importe où dans le contexte d’une exécution d’activité de plug-in ou de flux de travail. Cela peut également se trouver dans une méthode contenue dans la même classe ou une classe distincte. Il n’est pas limité à être directement contenu dans la définition de méthode Execute .
Informations supplémentaires
L’objectif du message est de ExecuteMultiple réduire les allers-retours entre le client et le serveur sur des connexions à latence élevée. Les plug-ins s’exécutent directement dans le processus d’application ou à proximité lorsque le bac à sable est isolé, ce qui signifie que la latence est rarement un problème. Le code de plug-in doit être axé sur les opérations qui s’exécutent rapidement et réduisent le blocage pour éviter de dépasser les seuils de délai d’attente et garantir un système réactif pour les scénarios synchrones. Envoyez chaque demande directement au lieu de les traiter par lots et envoyez-les en tant que requête unique.
Par exemple : foreach (request in requests) service.Execute(request)
Côté serveur, les opérations incluses dans une demande de traitement par lots sont exécutées séquentiellement et ne sont pas effectuées en parallèle. Il s’agit du cas même si la ExecuteMultipleSettingspropriété .ReturnResponses est définie sur false. Les développeurs ont tendance à utiliser des requêtes par lots de cette façon en supposant qu’il autorise le traitement parallèle. Les requêtes Batch n’atteignent pas cet objectif.
Les utilisateurs utilisent ExecuteTransactionRequest pour s’assurer que chaque opération est incluse dans une transaction. Cela n’est pas nécessaire dans une étape de plug-in synchrone, car le plug-in est déjà en train d'être exécuté dans le contexte d’une transaction de base de données, rendant inutile l'utilisation du message ExecuteTransaction.
Voir aussi
Infrastructure d’événements
Limitations de l’exécution
Exécuter plusieurs requêtes à l’aide du Kit de développement logiciel (SDK) pour .NET
Exécuter des messages en une seule transaction de base de données