Verarbeitung großer Nachrichten in BizTalk Server
Was ist eine große Nachricht?
Leider ist die Antwort auf diese Frage nicht direkt an eine bestimmte Nachrichtengröße gebunden, sondern hängt vielmehr von bestimmten Engpässen in Ihrem Microsoft BizTalk Server-System ab. Die Probleme im Zusammenhang mit großen Nachrichten können in die folgenden Kategorien unterteilt werden:
Fehler bei nicht genügend Arbeitsspeicher Bestimmte Arten der Nachrichtenverarbeitung – z. B. Zuordnung, Validierung und Eigenschaftsaufstufung – laden die gesamte Nachricht in den Arbeitsspeicher. Wenn die Größe der Nachricht im Speicher die verfügbaren Ressourcen überschreitet, tritt ein Fehler aufgrund von unzureichendem Arbeitsspeicher auf. Der Schwellenwert für die Größe von Nachrichten, die in diese Kategorie fallen, ist wesentlich niedriger als der Schwellenwert für die Größe von Nachrichten, die nicht in den Arbeitsspeicher geladen werden. Die Größe einer 10 MB großen Flatfile, die analysiert, in XML konvertiert und dann zugeordnet wird, kann um das Zehnfache oder mehr ansteigen, sodass die Datei über 100 MB an Arbeitsspeicher beansprucht. Ein 100 MB großes XML-Dokument dagegen, das nicht analysiert und konvertiert oder zugeordnet wurde, nimmt unter Umständen beim Streamen in die MessageBox-Datenbank lediglich 1 MB an Arbeitsspeicher ein.
Leistungsprobleme für Nachrichten, die nicht in den Arbeitsspeicher geladen werden Nachrichten, die nicht in den Arbeitsspeicher geladen werden müssen, werden mithilfe der .NET XmlReader-Schnittstelle an die MessageBox-Datenbank gestreamt. Sie unterliegen zwar nicht den Größenbeschränkungen von Nachrichten, die in den Arbeitsspeicher geladen werden müssen, dennoch sind einige wichtige Faktoren zu beachten, die einen Einfluss darauf haben, wie BizTalk Server in die MessageBox-Datenbank gestreamte Nachrichten verarbeitet.
Faktoren, die die Verarbeitung großer Nachrichten beeinflussen
Die Originalgröße der Nachricht, das Nachrichtenformat und die Art der Nachrichtenverarbeitung haben einen Einfluss darauf, wie BizTalk Server große Nachrichten verarbeitet.
Ursprüngliche Nachrichtengröße Die Größe der von BizTalk Server empfangenen Nachricht ist der sichtbarste Hinweis darauf, wie groß die Nachricht sein wird, wenn sie von BizTalk Server verarbeitet wird. Die Originalgröße einer Nachricht hat wesentlich größere Auswirkungen auf die Leistung, wenn die gesamte Nachricht in den Arbeitsspeicher geladen und nicht in die MessageBox-Datenbank gestreamt wird.
Nachrichtenformat Nachrichten werden in BizTalk Server in einem von zwei primären Formaten empfangen: XML-Dateien oder Flatfiles.
XML-Dateien Damit BizTalk Server eine andere Verarbeitung einer Nachricht als das Passthrough-Routing durchführen kann, muss die Nachricht im XML-Dateiformat vorliegen. Wenn die zu verarbeitenden Dateien im XML-Format eingehen, behalten sie zumeist ihre Originalgröße bei.
Flatfiles Flatfiles müssen in ein XML-Format analysiert werden, bevor BizTalk Server andere Verarbeitungen als passthrough-Routing durchführen können. Beim Analysieren einer Flatfile und ihrer Konvertierung in eine XML-Datei kann die Dateigröße drastisch ansteigen. Flatfiles enthalten keine XML-Tags, die ihre Daten beschreiben. XML-Dateien schließen ihre Daten dagegen in beschreibende XML-Tags ein. In einigen Szenarien kann das Konvertieren je nach dem Umfang der beschreibenden Daten in den XML-Tags der Datei zu einer Vergrößerung der Datei um das Zehnfache oder mehr führen.
Flatfiledokumente, die in einem einzelnen CDATA-Abschnittsknoten in einem XML-Dokument umschlossen sind Dieser Dokumenttyp ist eine Kombination aus XML und Flatfile und kann problematisch sein, da BizTalk Server das gesamte umschlossene Flatfiledokument vor der Verarbeitung in den Arbeitsspeicher laden muss.
Art der Nachrichtenverarbeitung In BizTalk Server gibt es zwei Arten der Nachrichtenverarbeitung: Nur Routing und Zuordnung. Die mit dieser Art der Nachrichtenverarbeitung verbundenen Leistungsvariablen sind die Nachrichtengröße und ob die Nachricht in den Arbeitsspeicher geladen wird.
Nur Routing Wenn BizTalk Server nur zum Weiterleiten von Nachrichten verwendet wird, die auf höhergestuften Nachrichteneigenschaften basieren, wird die Nachricht mithilfe der .NET XmlReader-Schnittstelle in die Messagebox-Datenbank gestreamt, und Nachrichtenteile werden nicht einzeln in den Arbeitsspeicher geladen. In diesem Szenario stellen Fehler aufgrund von unzureichendem Arbeitsspeicher kein Problem dar, die wichtigste Überlegung ist vielmehr der Zeitaufwand, der zum Schreiben sehr großer Nachrichten (von über 100 MB) in die MessageBox-Datenbank erforderlich ist. Das BizTalk Server-Entwicklungsteam hat Tests durchgeführt, in denen bei der reinen Weiterleitung Nachrichten von einer Größe bis zu 1 GB erfolgreich verarbeitet werden konnten.
Der primäre Faktor, der die Leistung in diesem Szenario bestimmt, ist die Größe des großen Nachrichtenfragments , das zum Fragmentieren der Daten in die Datenbank verwendet wird. Die Größe des Großen Nachrichtenfragments ist eine konfigurierbare Option auf der Konfigurationsseite der BizTalk-Gruppeneigenschaften und hat einen Standardwert von 102400 Bytes (100 KB). Durch Erhöhen dieses Wertes wird die Anzahl der Roundtrips reduziert, die zum Streamen einer Nachricht in die MessageBox-Datenbank erforderlich sind.
Zuordnung Das Transformieren eines Dokuments mit einer Zuordnung kann ein speicherintensiver Vorgang sein. Wenn ein Dokument von einer Zuordnung transformiert wird, leitet BizTalk Server die Nachricht an die Klasse .Net XslTransform weiter, die das XSL-Stylesheet lädt. Nachdem die Methode Load erfolgreich abgeschlossen wurde, kann die Methode Transform gleichzeitig aus mehreren Threads aufgerufen werden. Die XslCompiledTransform-Klasse bietet weitere Informationen zur XSLCompiledTransform-Klasse.
BizTalk Server verbessert die Speicherverwaltung für große Dokumente erheblich, indem ein konfigurierbarer Schwellenwert für die Nachrichtengröße zum Laden von Dokumenten in den Speicher während Transformationen implementiert wird. Nachrichten, deren Größe unterhalb des Schwellenwertes liegt, werden im Arbeitsspeicher verarbeitet. Nachrichten, deren Größe diesen Schwellenwert überschreitet, werden dagegen im Dateisystem gepuffert, um ihren Speicherbedarf zu verringern. Der Standardschwellenwert für die Nachrichtengröße ist 1 MB.
Richtlinien für das Verarbeiten großer Nachrichten
Beachten Sie diese Richtlinien, um die Leistung beim Verarbeiten großer Nachrichten in BizTalk Server zu verbessern:
Stellen Sie einen Schwellenwert für die Nachrichtengröße ein, oberhalb dessen Dokumente beim Zuordnen im Dateisystem gepuffert werden sollen. Um den Größenschwellenwert zu ändern, erstellen Sie einen DWORD-Wert namens TransformThreshold am folgenden Speicherort in der BizTalk Server Registrierung:
HKLM\Software\Microsoft\BizTalk Server\3.0\Administration\TransformThreshold
Geben Sie nach der Erstellung dieses Wertes einen Dezimalwert (in Byte) ein, der dem Schwellenwert entsprechen soll. Geben Sie zum Beispiel den Dezimalwert 2097152 ein, um den Schwellenwert für die Nachrichtengröße (von der Standardeinstellung von 1 MB) auf 2 MB zu erhöhen. Erhöhen Sie diesen Wert zur Verbesserung des Durchsatzes auf Systemen mit ausreichend großem, verfügbarem Arbeitsspeicher. Beim Puffern von Dokumenten auf der Festplatte wird zwar Arbeitsspeicher eingespart, jedoch führt dies zu einem Abfall des Gesamtdurchsatzes.
Hinweis
Standardmäßig werden Dokumente, die während der Zuordnung in das Dateisystem gepuffert werden, in das Verzeichnis %temp% des BizTalk Server Computers geschrieben. Ändern Sie die Einstellung für die Umgebungsvariable %temp% in einen Nicht-Systemdatenträger, um die Leistung beim Puffern großer Nachrichten im Dateisystem während der Zuordnung zu verbessern.
Minimieren Sie die Verwendung von Zuordnungen in Orchestrierungen:
Es empfiehlt sich, Eigenschaften, die mit der Geschäftslogik in einer Orchestrierung verwendet werden, nicht mithilfe einer Zuordnung zu extrahieren oder festzulegen, sondern stattdessen gekennzeichnete Felder oder höher gestufte Eigenschaften zu verwenden. Beim Extrahieren oder Festlegen von Werten mit einer Zuordnung wird das Dokument in den Arbeitsspeicher geladen. Beim Verwenden von gekennzeichneten Feldern oder höher gestuften Eigenschaften greift die Orchestrierungs-Engine auf den Nachrichtenkontext zu und lädt das Dokument nicht in den Arbeitsspeicher.
Wenn Sie mehrere Felder mit einer Zuordnung in einem Feld zusammenfassen, können Sie zum Kumulieren des Resultsets gekennzeichnete Felder oder höher gestufte Eigenschaften mit einer Orchestrierungsvariablen verwenden.
Konfigurieren Sie keine Orchestrierung mit mehreren Eingaben zur Transformation von Formen. Von einer Orchestrierung, die mehrere Eingaben zur Transformation von Formen enthält, kann beim Zuordnen kein Streaming auf das Dateisystem ausgeführt werden. Durch diese Einschränkung wird das gesamte zugeordnete Dokument in den Speicher geladen, wenn die Dokumentgröße den angegebenen Registrierungswert TransformThreshold überschreitet. Eine Möglichkeit, dieses Problem zu umgehen, besteht darin, die Transformationen auf Empfangsportebene anzuwenden, sodass von der Orchestrierung nur eine Eingabe zur Transformation von Formen akzeptiert wird.
Passen Sie die Eigenschaft Große Nachrichtenfragmentgröße an, die auf der Konfigurationsseite der BizTalk-Gruppeneigenschaften verfügbar gemacht wird:
Wenn die In-Memory-Größe einer empfangenen Nachricht die für große Nachrichtenfragmentgröße angegebene Anzahl von Bytes überschreitet, wird die Nachricht wie folgt in Fragmente der angegebenen Größe aufgeteilt, und die Fragmente werden im Kontext einer MSDTC-Transaktion (Microsoft Distributed Transaction Coordinator) in das MessageBox-Objekt geschrieben:
Wenn die eingehende Nachricht im Kontext einer bestehenden MSDTC-Transaktion veröffentlicht wird, wird diese Transaktion beim Schreiben der Nachrichtenfragmente in die MessageBox-Datenbank verwendet. Wird die eingehende Nachricht beispielsweise von einem transaktionalen Adapter veröffentlicht, dessen Konfiguration Transaktionen erfordert, wird die bestehende Transaktion beim Schreiben der Nachrichtenfragmente in die MessageBox-Datenbank verwendet.
Wenn die eingehende Nachricht nicht im Kontext einer bestehenden MSDTC-Transaktion veröffentlicht wird, wird zum Schreiben der Nachrichtenfragmente eine neue MSDTC-Transaktion erstellt.
Erhöhen Sie den Wert für große Nachrichtenfragmentgröße , um die Häufigkeit zu reduzieren, mit der große Nachrichten fragmentiert werden, und verringern Sie das Inzidenz der Erstellung der zugehörigen MSDTC-Transaktionen. Dies empfiehlt sich, da ein übermäßiger Gebrauch von MSDTC-Transaktionen in Bezug auf die Leistung relativ teuer ist. Beachten Sie, dass beim Erhöhen dieses Wertes außerdem auch mehr verfügbarer Arbeitsspeicher verwendet wird.
Wenn zum Schreiben einer Nachricht in die MessageBox-Datenbank mehr Zeit als der maximal zulässige Timeout von 60 Sekunden für MSDTC-Transaktionen benötigt wird, kommt es bei der Transaktion zu einem Timeout. Daraufhin tritt ein Fehler auf, der Versuch, die Nachricht zu schreiben, schlägt fehl, und es muss ein Rollback durchgeführt werden. Der Wert für große Nachrichtenfragmente sollte so erhöht werden, dass dieses Problem bei der Verarbeitung sehr großer Nachrichten vermieden wird. Je nach verfügbarem Arbeitsspeicher empfiehlt sich eine Erhöhung dieses Wertes auf höchstens 1000000 Byte.
Jedes Nachrichtenfragment in einer Nachricht erstellt ein oder mehrere SQL Server-Datenbanksperren für die MessageBox-Datenbank. Wenn die Anzahl der Sperren über mehrere Hunderttausend hinausgeht, ist es möglich, dass SQL Server beim Programmstart einen Fehler vom Typ "unzureichende Sperren" anzeigt. Wenn dieses Problem auftritt, erhöhen Sie die Größe des Großen Nachrichtenfragments, um die Anzahl der SQL Server Datenbanksperren für die MessageBox-Datenbank zu verringern.
Wenn Fehler vom Typ "unzureichende Sperren" auftreten, sollten Sie es in Erwägung ziehen, die MessageBox-Datenbank in einer 64-Bit-Version von SQL Server zu speichern. Bei dieser Version von SQL Server steht eine wesentlich höhere Anzahl an Sperren zur Verfügung.
Passen Sie die Eigenschaft Schwellenwert für große Nachrichten an, die auf der Konfigurationsseite der BizTalk-Gruppeneigenschaften verfügbar gemacht wird:
Wenn bei der Verarbeitung eines Nachrichtenbatches die In-Memory-Größe eines Nachrichtenbatches die für den Schwellenwert für große Nachricht angegebene Anzahl von Bytes erreicht, wird der Teil des verarbeiteten Nachrichtenbatches in das MessageBox-Element geschrieben, bevor der rest des Nachrichtenbatches verarbeitet wird. Dies erfolgt im Kontext einer MSDTC-Transaktion wie nachstehend beschrieben:
Wenn der Nachrichtenbatch im Kontext einer bestehenden MSDTC-Transaktion veröffentlicht wird, wird diese Transaktion beim Schreiben des verarbeiteten Teils des Nachrichtenbatches in die MessageBox-Datenbank verwendet. Wird der eingehende Nachrichtenbatch beispielsweise von einem transaktionalen Adapter veröffentlicht, dessen Konfiguration Transaktionen erfordert, wird die bestehende Transaktion beim Schreiben des verarbeiteten Teiles des Nachrichtenbatches in die MessageBox-Datenbank verwendet.
Wenn der Nachrichtenbatch nicht im Kontext einer bestehenden MSDTC-Transaktion veröffentlicht wird, muss eine neue MSDTC-Transaktion zum Schreiben der Teile des Nachrichtenbatches in die MessageBox-Datenbank erstellt werden. Mit der MSDTC-Transaktion wird sichergestellt, dass alle Teile eines bestimmten Nachrichtenbatches erfolgreich in die MessageBox-Datenbank geschrieben werden.
Die Schwellenwerteinstellung für große Nachrichten gilt direkt für Nachrichtenbatches, aber da ein Nachrichtenbatch auf den Wert 1 festgelegt werden kann, kann die Schwellenwerteinstellung für große Nachrichten auch indirekt auf einzelne Nachrichten angewendet werden. Wenn beispielsweise ein Nachrichtenbatch einer Nachricht den angegebenen Schwellenwert für große Nachrichten überschreitet, gilt der Schwellenwert für große Nachrichten nur für die einzelne Nachricht im Batch.
Der Schwellenwertparameter für große Nachrichten sollte angepasst werden, um die Erstellung von MSDTC-Transaktionen zu verringern, die zum Aufschlüsseln von Nachrichtenbatches auf das MessageBox-Objekt verwendet werden. Dies sollte erfolgen, da die übermäßige Verwendung von MSDTC-Transaktionen aus Leistungssicht teuer ist. Verwenden Sie die folgende Berechnung, um zu bestimmen, welcher Mindestwert für die Schwellenwerteinstellung für große Nachrichten sein sollte, um zu vermeiden, dass unnötige MSDTC-Transaktionen erstellt werden:
Batch Size * Average size (in bytes) of each message in the batch after being processed by the receive pipeline < Large message threshold
Solange die Gesamtgröße in Bytes eines Nachrichtenbatches den angegebenen Wert für den Schwellenwert für große Nachrichten nicht überschreitet, muss BizTalk keine MSDTC-Transaktion initiieren, um den Nachrichtenbatch der MessageBox-Datenbank zuzuteilen.