Freigeben über


Optimieren der Leistung für Massenvorgänge

Wenn Sie Tausende oder Millionen von Datensätzen in Dataverse erstellen oder aktualisieren müssen, können die Entscheidungen, die Sie treffen, Stunden Zeit sparen, damit das Projekt für Massenoperationen abgeschlossen werden kann. In diesem Artikel werden die Faktoren beschrieben, die sich auf die Leistung auswirken, und die Optionen zum Erstellen von Clientanwendungen, die die Leistung für Massenvorgänge optimieren. Außerdem sollten andere Faktoren berücksichtigt werden, z. B. die Anzahl der Datensätze, die Datensatzgröße, die Netzwerklatenz und die Datenkomplexität.

Tabellentyp

Der Typ der Tabelle, die Sie zum Speichern Ihrer Daten auswählen, hat die größten Auswirkungen auf den Durchsatz, den Sie mit Massenvorgängen erwarten können. Dataverse bietet zwei Arten von Tabellen: Standard und elastisch.

  • In einer Standardtabelle werden Daten mit Azure SQL gespeichert. Standardtabellen bieten Transaktionsunterstützung und größere Funktionen für die Modellierung von Beziehungen.
  • Eine elastische Tabelle speichert Daten mit Azure Cosmos DB. Flexible Tabellen werden automatisch horizontal skaliert, um große Datenmengen und hohe Durchsatzmengen mit geringer Latenz zu verarbeiten. Elastische Tabellen eignen sich für Anwendungen, die unvorhersehbare, spitzenartige oder schnell wachsende Belastungen aufweisen.

Wenn die Datenladezeiten Ihr Hauptanliegen sind, bieten elastische Tabellen die beste Leistung. Erfahren Sie, wann Sie elastische Tabellen verwenden.

Geschäftslogik

Dataverse bietet die Möglichkeit, zusätzliche Geschäftslogik hinzuzufügen, wenn Datensätze mithilfe von Plug-Ins erstellt oder aktualisiert werden. Plug-Ins können für die synchrone Ausführung vor oder innerhalb der Transaktion eines Standardtabellenvorgangs registriert werden. Flexible Tabellen unterstützen Plug-Ins, die ausgeführt werden können, bevor ein Vorgang gestartet wird, da keine Transaktion vorhanden ist. Jeder Fehler, der während eines synchronen Schritts für eine Standardtabelle oder vor dem Vorgang in einer elastischen Tabelle im Plug-In-Code auftritt, bricht den Vorgang ab. Ein Plug-In-Entwickler kann absichtlich eine Ausnahme auslösen, um den Vorgang abzubrechen, um sicherzustellen, dass die Datenüberprüfungslogik angewendet wird.

Jedes Plug-In, das für die synchrone Ausführung registriert ist, erhöht die Zeit für den Abschluss des Vorgangs. So behalten Sie die Leistung bei:

  • Beschränken Sie die Anzahl synchroner Plug-Ins, die für die Vorgänge registriert sind. Fügen Sie Logik hinzu, die asynchron ausgeführt werden soll, indem Sie einen asynchronen Plug-In- oder Power Automate-Fluss verwenden, es sei denn, die Logik muss synchron angewendet werden.
  • Stellen Sie sicher, dass die Plug-Ins, die Sie haben, in der Logik eingeschränkt sind, die sie ausführen möchten. Während Plug-Ins innerhalb einer großzügigen zweiminütigen Zeitbegrenzung fertig sein müssen, beeinträchtigen synchrone Plug-Ins, die länger als zwei Sekunden laufen, die Leistung erheblich.
  • Stellen Sie sicher, dass Plug-Ins nur bei Bedarf ausgeführt werden. Filter-Plug-ins für Aktualisierungsvorgänge laufen nur, wenn bestimmte Spalten aktualisiert werden.
  • Stellen Sie sicher, dass Plug-Ins so optimiert sind, dass logik so effizient wie möglich ausgeführt wird. Bei Standardtabellen müssen Sie die Auswirkungen berücksichtigen, die Transaktionen und Datensatzsperren möglicherweise auf die Leistung haben. Erfahren Sie mehr über das skalierbare Anpassungsdesign und andere bewährte Methoden zum Schreiben von Plug-Ins.
  • Wählen Sie aus, auf welcher API Ihr Plug-In registriert werden soll. Sie können synchrone Logik anwenden, um effizienter mit den Massenvorgangs-APIs CreateMultiple und UpdateMultiple zu arbeiten. Erfahren Sie, wie Sie Plug-Ins für CreateMultiple und UpdateMultiple schreiben.

Umgehen der Geschäftslogik

Um das Massenverarbeitungsprojekt zu beschleunigen, deaktivieren Sie Erweiterungen, die für die Erstellungs- oder Aktualisierungsvorgänge registriert sind, um die Leistung zu verbessern. Wenn die Geschäftslogik nicht unbedingt erforderlich ist oder Wenn Sie andere Schritte planen, um die Konsistenz der Daten sicherzustellen, deaktivieren Sie die Plug-In-Schritte manuell, und aktivieren Sie sie erneut, wenn das Massenvorgangsprojekt abgeschlossen ist. Durch deaktivieren von Plug-Ins wird jedoch die Anwendung der Logik von jedem Client deaktiviert. Jeder Benutzer oder ein anderer Prozess, der Dataverse während dieses Zeitraums Daten hinzufügt, hat keine geschäftslogik angewendet.

Als Entwickler einer Clientanwendung, die den Massenvorgang ausführt, können Sie einen optionalen Parameter auf die Anforderungen anwenden, die Sie an die Umgehungslogik senden. Nur ein Systemadministrator oder Benutzer, denen eine bestimmte Berechtigung gewährt wurde, kann diesen Header verwenden. Erfahren Sie mehr darüber, wie Sie benutzerdefinierte Dataverse-Logik umgehen.

Massenvorgangs-APIs

Dataverse stellt Massenvorgangs-APIs bereit, die den größtmöglichen Durchsatz für Erstellungs- und Aktualisierungsvorgänge ermöglichen. Diese APIs umfassen CreateMultiple, UpdateMultipleund UpsertMultiple. Nur für elastische Tabellen können Sie verwenden DeleteMultiple.

Während diese APIs den höchsten Durchsatz bieten, weisen sie die folgenden Einschränkungen für Standardtabellen auf:

  • Derzeit nicht für alle Tabellen verfügbar. Jede benutzerdefinierte Tabelle unterstützt sie, aber nicht alle wichtigsten Dataverse-Tabellen unterstützen sie, z. B. "Konto" oder "Kontakt". Sie können eine in der Dokumentation bereitgestellte Abfrage ausführen, um zu ermitteln, ob eine Tabelle diese APIs verwenden kann.
  • Keine Verzeihung von Datenfehlern. Sie müssen sicherstellen, dass die daten, die Sie ändern, sorgfältig entfernt und überprüft werden. Jeder Fehler, der innerhalb eines Vorgangs in diesen APIs auftritt, führt dazu, dass der gesamte Vorgang fehlschlägt.
  • Die Verwendung in Plug-Ins wird nicht unterstützt. Derzeit sollten nur externe Clientanwendungen diese APIs verwenden.

Massenvorgänge sind für alle elastischen Tabellen verfügbar, und elastische Tabellen können Informationen zu einzelnen Vorgängen zurückgeben, die fehlschlagen. Erfahren Sie mehr über Massenvorgänge mit elastischen Tabellen.

Batch-APIs

Wenn Sie keine Massenvorgangs-APIs verwenden können, verwenden Sie ExecuteMultiple mit dem SDK für .NET, und verwenden Sie OData-$batch mit Web-API.

Verwenden Sie diese API-Schnittstellen, um eine Gruppe von Vorgängen in einer einzigen Anforderung zu bündeln und eine größere Effizienz zu erreichen, da weniger, aber größere Anfragen die gesamte Nutzlast reduzieren, die für jeden Vorgang gesendet und empfangen wird. Eine Clientanwendung muss nicht warten, bis ein Vorgang abgeschlossen ist, bevor die nächste Anforderung gesendet wird.

Jeder Vorgang innerhalb der Anforderung wird sequenziell auf dem Server angewendet, sodass pro Vorgang keine verbesserte Effizienz vorhanden ist. Da die Vorgänge jedoch einzeln ausgeführt werden, können Sie Informationen zu den fehlgeschlagenen Vorgängen abrufen oder den Batch beenden, wenn ein Fehler auftritt. Sie können bis zu 1.000 Vorgänge pro Anforderung senden, aber für optimale Ergebnisse beginnen Sie mit einer kleineren Zahl, und experimentieren Sie, um zu bestimmen, welche Größe batch am besten für Ihren Fall geeignet ist.

Hinweis

Sowohl Massenvorgänge als auch Batch-APIs sehen erhebliche Leistungssteigerungen, wenn sie parallel verwendet werden. Siehe parallele Anforderungen.

Client-Architektur

Dataverse ist als Datenquelle konzipiert, um mehrere Anwendungen mit einer großen Anzahl gleichzeitiger Benutzer zu unterstützen. Um den Durchsatz zu optimieren, entwerfen Sie Ihren Client so, dass die Stärken von Dataverse verwendet werden.

Engpässe im clientseitigen Code sind die primäre Ursache für Leistungsprobleme. Entwickler können die Funktionen des Codes häufig nicht vollständig verwenden, was sich auf die Leistung auswirken kann. Es ist entscheidend zu optimieren, wie die Clientanwendung die Kerne oder die Rechenleistung der Infrastruktur nutzt, da eine nicht erfolgte Optimierung die Leistung erheblich beeinträchtigen kann. Wenn Sie z. B. Azure Functions verwenden, führen Sie zusätzliche Schritte aus, um die Leistung zu optimieren, z. B. das Implementieren der automatischen Skalierung, die Verwendung von Warm-up-Instanzen, das Anpassen der CPU-Auslastung, das Verwenden mehrerer Kerne und die Gleichzeitigkeit zu ermöglichen.

Grenzwerte für den Serviceschutz

Um eine konsistente Verfügbarkeit und Leistung für jeden zu gewährleisten, wendet Dataverse einige Grenzwerte für die Verwendung von APIs an. Diese Grenzwerte erkennen, wenn Clientanwendungen außergewöhnliche Anforderungen an Serverressourcen stellen. Massenvorgangsprojekte stellen immer außergewöhnliche Anforderungen dar, daher müssen Sie auf die Fehler vorbereitet sein, die durch Dienstschutzbeschränkungen auftreten. Wenn Sie nicht einige Dienstschutzlimit-Fehler erhalten, haben Sie die Kapazität Ihrer Anwendung nicht maximiert.

Fehler bei Dienstschutzgrenzen sind lediglich eine weitere Art von vorübergehenden Fehlern, auf die Ihr Client vorbereitet sein sollte, beispielsweise ein vorübergehender Verlust der Netzwerkkonnektivität. Eine robuste Clientanwendung muss auf den Fehler reagieren, indem sie warten und wiederholen. Der einzige Unterschied besteht darin, dass Dienstschutzgrenzwerte Ihnen mitteilen, wie lange Sie warten müssen, bevor Sie den Vorgang wiederholen.

Weitere Informationen finden Sie unter:

Parallele Anforderungen

Sie können eine erhebliche Verbesserung des Durchsatzes sehen, indem Sie Anforderungen parallel senden, aber Sie müssen verstehen, wie sie ordnungsgemäß gesendet werden.

Nicht alle Umgebungen sind gleich

Nicht jede Dataverse-Umgebung weist die gleiche Anzahl von Webserverressourcen auf, die ihm zugeordnet sind. Dataverse skaliert auf die Notwendigkeit der Umgebung, indem weitere Webserverressourcen hinzugefügt werden, um sie zu unterstützen. Eine Produktionsumgebung, die Tausende aktiver Benutzer unterstützt, erfordert mehr Webserver als eine Testumgebung. Wenn Ihre Umgebung über viele Webserver verfügt, kann das Senden von Anforderungen parallel zu einem dramatischen Unterschied beim gesamten Durchsatz führen, den Ihre Clientanwendung erzielen kann.

Dataverse gibt Daten in einem Antwortheader zurück, der Ihnen einen empfohlenen Grad an Parallelisierung (DOP) für Ihre Umgebung angibt. Die Leistung verschlechtert sich, wenn Sie mehr parallele Anforderungen senden, als der Antwortheader empfiehlt. Die Clienthardware, die Sie zum Ausführen Ihrer Anwendung verwenden, benötigt möglicherweise mehr CPU-Kerne, um diese vielen Anforderungen parallel zu senden. Möglicherweise müssen Sie weitere Clients verwenden, um den maximalen Durchsatz zu erzielen. Sie können z. B. einen skalierten App-Dienst oder eine Azure-Funktion verwenden.

Je nach clientseitiger Architektur müssen Sie möglicherweise den empfohlenen Parallelitätsgrad aufteilen. Wenn Sie beispielsweise über zwei Clients verfügen und ihr empfohlener DOP 50 ist, konfigurieren Sie jeden Client für die Verwendung von 25.

Deaktivieren der Azure-Affinität

Bei Bedarf werden optimale Ergebnisse angezeigt, wenn Sie Ihren Client so konfigurieren, dass alle verfügbaren Webserver verwendet werden, indem Sie das Azure-Affinitätscookie entfernen , das versucht, Ihre Anwendung einem einzelnen Webserver zuzuordnen. Das Deaktivieren der Azure-Affinität eignet sich nicht für interaktive Anwendungen, die zwischengespeicherte Daten vom Server verwenden, um die Benutzererfahrung zu optimieren.

Optimieren Sie Ihre Verbindung

Wenn Sie .NET verwenden, wenden Sie Konfigurationsänderungen wie die folgende an, um Ihre Verbindung zu optimieren, sodass Ihre Anforderungen nicht durch Standardeinstellungen eingeschränkt sind.

// Bump up the min threads reserved for this app to ramp connections faster - minWorkerThreads defaults to 4, minIOCP defaults to 4 
ThreadPool.SetMinThreads(100, 100);
// Change max connections from .NET to a remote service default: 2
System.Net.ServicePointManager.DefaultConnectionLimit = 65000;
// Turn off the Expect 100 to continue message - 'true' will cause the caller to wait until it round-trip confirms a connection to the server 
System.Net.ServicePointManager.Expect100Continue = false;
// Can decrease overall transmission overhead but can cause delay in data packet arrival
System.Net.ServicePointManager.UseNagleAlgorithm = false;

Empfehlungszusammenfassung

Befolgen Sie basierend auf den zuvor beschriebenen Faktoren die folgenden Empfehlungen, um den Durchsatz für Massenbetriebsprojekte zu optimieren:

  • Wählen Sie einen Tabellentyp aus, der Ihren Anforderungen entspricht. Elastische Tabellen verfügen über viel größere Kapazität für Massenvorgänge.
  • Minimieren, Deaktivieren oder Umgehen benutzerdefinierter Geschäftslogik in den von Ihnen verwendeten Tabellen. Konfigurieren Sie Ihre Clientanwendung so, dass benutzerdefinierte Logik bei Bedarf umgangen wird.
  • Verwenden Sie Dataverse-Massenvorgangs-APIs, wenn Möglich, andernfalls Batch-APIs verwenden.
  • Entwerfen Sie Ihre Client-Anwendung so, dass sie vorübergehende Fehler verwaltet, einschließlich der Fehler, die durch Dienstschutzgrenzen zurückgegeben werden.
  • Senden Sie Anforderungen parallel. Verwenden Sie den Antwortheader, um Sie zum empfohlenen Grad an Parallelität (DOP) zu führen. Deaktivieren Sie das Affinitätscookie bei Bedarf.
  • Überprüfen Sie die Daten, um sicherzustellen, dass sie das Tabellenspaltenschema erfüllt. Diese Überprüfung trägt dazu bei, Fehler zu vermeiden und die Anzahl der fehlgeschlagenen Vorgänge zu verringern.

Siehe auch

Elastische Tabellen
Plug-Ins zur Erweiterung von Geschäftsprozessen verwenden
Umgehen benutzerdefinierter Dataverse-Logik
Massenvorgang für Nachrichten
Plug-Ins für „CreateMultiple“ und „UpdateMultiple“ schreiben
Parallele Anforderungen senden