orchestrator
2021.10
false
Wichtig :
Bitte beachten Sie, dass dieser Inhalt teilweise mithilfe von maschineller Übersetzung lokalisiert wurde.
UiPath logo, featuring letters U and I in white
Kein Support
Installationsanleitung für den Orchestrator
Automation CloudAutomation Cloud Public SectorAutomation SuiteStandalone
Last updated 31. Okt. 2024

Best Practices für Leistung

Auf der folgenden Seite werden die empfohlenen Anforderungen für große Produktionsumgebungen beschrieben und eine Reihe von bewährten Methoden zur Verbesserung ihrer Leistung beschrieben.

Hinweis: Weitere Informationen zu den Mindestanforderungen für den Orchestrator finden Sie auf den Seiten Hardwareanforderungen und Softwareanforderungen.

Empfohlene Anforderungen für große Produktionsumgebungen

Für die Ausführung von 10.000 Attended-Robotern oder 1.000 Unattended-Robotern benötigen Sie:

  • Ein F5-Lastausgleich
  • Orchestrator – mindestens 6 Knoten, die auf Maschinen mit 8 CPU-Kernen und 16 GB RAM ausgeführt werden
  • Roboter – Maschinen mit 4 CPU-Kernen und 16 GB RAM
  • SQL Server - Maschinen mit 4 Sockets/16 CPU-Kernen (Standard 8 Sockets/16 CPU-Kerne) und 64 GB RAM

    Hinweis: Um SQL Server-Zuweisungskonflikte in einer sehr gleichzeitigen Umgebung zu reduzieren, stellen Sie sicher, dass Sie eine optimale Anzahl von tempdb-Datendateien mit gleicher Größe verwenden.

Orchestrator-Änderungen für verbesserte Leistung

In diesem Abschnitt sind eine Reihe von Anpassungen aufgeführt, die Sie an der Datei UiPathOrchestrator.dll.config von Orchestrator vornehmen können, um die Leistung in einer großen Produktionsumgebung zu verbessern.

Aktivieren von Redis

<appSettings>
  <add key="LoadBalancer.UseRedis" value="true"/>
  <add key="LoadBalancer.Redis.ConnectionString" value="your.redis.cache.windows.net:6379,password=***"/>
</appSettings><appSettings>
  <add key="LoadBalancer.UseRedis" value="true"/>
  <add key="LoadBalancer.Redis.ConnectionString" value="your.redis.cache.windows.net:6379,password=***"/>
</appSettings>

Geben Sie eine große maximale Poolgröße in der Verbindungszeichenfolge an.

<connectionStrings>
  <add name="Default" providerName="System.Data.SqlClient" connectionString="Data Source=<SQLServer>;Initial Catalog=<dbName>;User ID=<username>;Password=***;Max Pool Size=1000" />
</connectionStrings><connectionStrings>
  <add name="Default" providerName="System.Data.SqlClient" connectionString="Data Source=<SQLServer>;Initial Catalog=<dbName>;User ID=<username>;Password=***;Max Pool Size=1000" />
</connectionStrings>

Schreiben von Roboterprotokollen in Elasticsearch und Verwenden von AsyncWrapper

  • Fügen Sie das Protokollierungsziel für Elasticsearch mithilfe der folgenden Parameter hinzu oder ändern Sie es.
    xml <nlog> <targets> <target name="robotElasticBuffer" xsi:type="AsyncWrapper" overflowAction="Grow" queueLimit="10000" batchSize="1000" timeToSleepBetweenBatches="1"> <target xsi:type="ElasticSearch" name="robotElastic" uri="elastic.example.com:9200" requireAuth="true" username="***" password="***" index="${event-properties:item=indexName}-${date:format=yyyy.MM}" documentType="logEvent" includeAllProperties="true" layout="${message}" excludedProperties="agentSessionId,tenantId,indexName" /> </target> </targets> </nlog>xml <nlog> <targets> <target name="robotElasticBuffer" xsi:type="AsyncWrapper" overflowAction="Grow" queueLimit="10000" batchSize="1000" timeToSleepBetweenBatches="1"> <target xsi:type="ElasticSearch" name="robotElastic" uri="elastic.example.com:9200" requireAuth="true" username="***" password="***" index="${event-properties:item=indexName}-${date:format=yyyy.MM}" documentType="logEvent" includeAllProperties="true" layout="${message}" excludedProperties="agentSessionId,tenantId,indexName" /> </target> </targets> </nlog>
  • Fügen Sie die Roboterprotokollregel hinzu oder ändern Sie sie, um Protokolle nur in das im vorherigen Beispiel gezeigte Ziel zu schreiben. Dadurch wird das Standard-Datenbankziel automatisch deaktiviert.
    xml <nlog> <rules> <logger name="Robot.*" ruleName="primaryRobotLogsTarget" final="true" writeTo="robotElasticBuffer" /> </rules> </nlog>xml <nlog> <rules> <logger name="Robot.*" ruleName="primaryRobotLogsTarget" final="true" writeTo="robotElasticBuffer" /> </rules> </nlog>
  • Konfigurieren Sie Orchestrator, um Protokolle aus ElasticSearch zu lesen.
    <appSettings>
       <add key="Logs.RobotLogs.ReadTarget" value="robotElasticBuffer" />
    </appSettings><appSettings>
       <add key="Logs.RobotLogs.ReadTarget" value="robotElasticBuffer" />
    </appSettings>

Verwenden eines Speichers mit hohem Durchsatz

Sie können sich zu diesem Zweck für Azure Blob Storage entscheiden.

<appSettings>
  <add key="Storage.Type" value="Azure" />
  <add key="Storage.Location" value="DefaultEndpointsProtocol=https;AccountName=yourBlob;AccountKey=yourKey;EndpointSuffix=core.windows.net" />
</appSettings><appSettings>
  <add key="Storage.Type" value="Azure" />
  <add key="Storage.Location" value="DefaultEndpointsProtocol=https;AccountName=yourBlob;AccountKey=yourKey;EndpointSuffix=core.windows.net" />
</appSettings>

Deaktivieren von Webhooks und Ledger

Wenn Sie die Webhooks-Funktion nicht verwenden, können Sie sie deaktivieren.

<appSettings>
  <add key="Webhooks.Enabled" value="false" />
  <add key="Ledger.Enabled" value="false"/>
  <add key="Webhooks.LedgerIntegration.Enabled" value="false" />
</appSettings><appSettings>
  <add key="Webhooks.Enabled" value="false" />
  <add key="Ledger.Enabled" value="false"/>
  <add key="Webhooks.LedgerIntegration.Enabled" value="false" />
</appSettings>

Wartungsmodus deaktivieren

Wenn Sie den Wartungsmodus nicht verwenden, können Sie ihn deaktivieren.

<appSettings>
  <add key="MaintenanceMode.Enabled" value="false" />
</appSettings><appSettings>
  <add key="MaintenanceMode.Enabled" value="false" />
</appSettings>

Erhöhen der Zwischenspeicherungszeit von Anwendungseinstellungen

Sie können Orchestrator so konfigurieren, dass einige In-Memory-Caches verwendet werden, die die Anzahl der Aufrufe von Redis reduzieren. Wenn Sie sie z. B. so konfigurieren, dass sie alle 30 Minuten ablaufen, bedeutet dies, dass eine Änderung an einer Einstellung auf Anwendungsebene möglicherweise erst nach dem 30-Minuten-Intervall widergespiegelt wird.

Die hier festgelegte Ablaufzeit kann variieren, je nachdem, welche Verzögerung Sie tolerieren können, aber selbst eine Zwischenspeicherungszeit von 5 Minuten kann die Leistung erheblich verbessern.

<appSettings>
  <add key="Caching.MultiTier[AbpApplicationSettingsCache]" value="Memory" />
  <add key="Caching.MultiTier[AbpApplicationSettingsCache].ExpiresAfter" value="0:30:00" />
  <add key="Caching.MultiTier[AbpTenantSettingsCache]" value="Memory"/>
  <add key="Caching.MultiTier[AbpTenantSettingsCache].ExpiresAfter" value="0:30:00"/>
  <add key="Caching.MultiTier[AbpZeroTenantFeatures]" value="Memory"/>
  <add key="Caching.MultiTier[AbpZeroTenantFeatures].ExpiresAfter" value="0:30:00"/>
  <add key="Caching.MultiTier[AbpZeroRolePermissions]" value="Memory"/>
  <add key="Caching.MultiTier[AbpZeroRolePermissions].ExpiresAfter" value="0:30:00"/>
  <add key="Caching.MultiTier[LicenseKeys]" value="Memory"/>
  <add key="Caching.MultiTier[LicenseKeys].ExpiresAfter" value="0:30:00"/>
  <add key="Caching.MultiTier[TenantLicense]" value="Memory"/>
  <add key="Caching.MultiTier[TenantLicense].ExpiresAfter" value="0:30:00"/>
</appSettings><appSettings>
  <add key="Caching.MultiTier[AbpApplicationSettingsCache]" value="Memory" />
  <add key="Caching.MultiTier[AbpApplicationSettingsCache].ExpiresAfter" value="0:30:00" />
  <add key="Caching.MultiTier[AbpTenantSettingsCache]" value="Memory"/>
  <add key="Caching.MultiTier[AbpTenantSettingsCache].ExpiresAfter" value="0:30:00"/>
  <add key="Caching.MultiTier[AbpZeroTenantFeatures]" value="Memory"/>
  <add key="Caching.MultiTier[AbpZeroTenantFeatures].ExpiresAfter" value="0:30:00"/>
  <add key="Caching.MultiTier[AbpZeroRolePermissions]" value="Memory"/>
  <add key="Caching.MultiTier[AbpZeroRolePermissions].ExpiresAfter" value="0:30:00"/>
  <add key="Caching.MultiTier[LicenseKeys]" value="Memory"/>
  <add key="Caching.MultiTier[LicenseKeys].ExpiresAfter" value="0:30:00"/>
  <add key="Caching.MultiTier[TenantLicense]" value="Memory"/>
  <add key="Caching.MultiTier[TenantLicense].ExpiresAfter" value="0:30:00"/>
</appSettings>

MinWorkerThreads-Wert erhöhen

Das Festlegen eines höheren Werts für MinWorkerThreads hilft in Anlaufszenarien.
<appSettings>
  <add key="ThreadPool.MinWorkerThreads" value="50" />
</appSettings><appSettings>
  <add key="ThreadPool.MinWorkerThreads" value="50" />
</appSettings>

Optimieren von Quarz für sehr hohen Durchsatz

Dieser Schritt ist nur notwendig, wenn Sie eine sehr hohe Anzahl von Triggern haben, die ausgelöst werden, z. B. in der Größenordnung von 2.000 pro Minute.

<quartz>
  <add key="quartz.scheduler.batchTriggerAcquisitionMaxCount" value="15" />
  <add key="quartz.threadPool.threadCount" value="15" />
  <add key="quartz.jobStore.misfireThreshold" value="3600000" />
  <add key="quartz.jobStore.clusterCheckinInterval" value="60000" />
  <add key="quartz.jobStore.clustered" value="true" />
</quartz><quartz>
  <add key="quartz.scheduler.batchTriggerAcquisitionMaxCount" value="15" />
  <add key="quartz.threadPool.threadCount" value="15" />
  <add key="quartz.jobStore.misfireThreshold" value="3600000" />
  <add key="quartz.jobStore.clusterCheckinInterval" value="60000" />
  <add key="quartz.jobStore.clustered" value="true" />
</quartz>

Deaktivieren von IP-zu-DNS-Auflösung in der Prüfung

Wenn Sie sich nicht in einem Unternehmensnetzwerk befinden oder die DNS-Namen von IPs, die in der Prüfung aufgezeichnet wurden, nicht sehen müssen, können Sie die Lösung deaktivieren.

<appSettings>
  <add key="Audit.UseDnsResolving" value="false" />
</appSettings><appSettings>
  <add key="Audit.UseDnsResolving" value="false" />
</appSettings>

Wechseln zu einer schnelleren Strategie zum Abrufen der Gruppenmitgliedschaft

Hinweis: Directory.ActiveDirectory.GroupMembershipFetchStrategy und Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours gelten nur für den Legacy AD-Adapter. Sie sollten diese Einstellungen nur verwenden, wenn Sie von einer Orchestrator-Version mit aktiviertem AD auf 2021.10 oder höher aktualisiert haben.
Um Directory.ActiveDirectory.GroupMembershipFetchStrategy in der Tabelle [identity].[Settings] auf TokenGroups festzulegen, führen Sie Folgendes aus:
SELECT * FROM [identity].[Settings] WHERE [Key]='Directory.ActiveDirectory.GroupMembershipFetchStrategy' and [PartitionId]=1
IF @@ROWCOUNT>0
    UPDATE [identity].[Settings] SET [Value]='TokenGroups' WHERE [Key]='Directory.ActiveDirectory.GroupMembershipFetchStrategy' and [PartitionId]=1
ELSE
    INSERT INTO [identity].[Settings] ([Key], [Value], [PartitionId]) VALUES ('Directory.ActiveDirectory.GroupMembershipFetchStrategy', 'TokenGroups', 1)SELECT * FROM [identity].[Settings] WHERE [Key]='Directory.ActiveDirectory.GroupMembershipFetchStrategy' and [PartitionId]=1
IF @@ROWCOUNT>0
    UPDATE [identity].[Settings] SET [Value]='TokenGroups' WHERE [Key]='Directory.ActiveDirectory.GroupMembershipFetchStrategy' and [PartitionId]=1
ELSE
    INSERT INTO [identity].[Settings] ([Key], [Value], [PartitionId]) VALUES ('Directory.ActiveDirectory.GroupMembershipFetchStrategy', 'TokenGroups', 1)
Um Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours in der Tabelle [identity].[Settings] auf vier Stunden festzulegen, führen Sie Folgendes aus:
SELECT * FROM [identity].[Settings] WHERE [Key]='Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours' and [PartitionId]=1
IF @@ROWCOUNT>0
    UPDATE [identity].[Settings] SET [Value]='4' WHERE [Key]='Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours' and [PartitionId]=1
ELSE
    INSERT INTO [identity].[Settings] ([Key], [Value], [PartitionId]) VALUES ('Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours', '4', 1)SELECT * FROM [identity].[Settings] WHERE [Key]='Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours' and [PartitionId]=1
IF @@ROWCOUNT>0
    UPDATE [identity].[Settings] SET [Value]='4' WHERE [Key]='Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours' and [PartitionId]=1
ELSE
    INSERT INTO [identity].[Settings] ([Key], [Value], [PartitionId]) VALUES ('Directory.ActiveDirectory.AuthorizationGroupsCacheExpirationHours', '4', 1)

Ablaufzeit des AD Domänen-Cache anpassen

Hinweis: Directory.ActiveDirectory.CacheExpirationSeconds gilt nur für den Legacy AD-Adapter. Sie sollten diese Einstellung nur verwenden, wenn Sie von einer Orchestrator-Version mit aktiviertem AD auf 2021.10 oder höher aktualisiert haben.
Um die Ablaufzeit des AD Domänen-Caches zu steuern, können Sie die Einstellung Directory.ActiveDirectory.CacheExpirationSeconds in der Tabelle [identity].[Settings] verwenden. Der Standardwert dieser Einstellung ist 43200 Sekunden (12 Stunden). Um das AD Domänen-Caching zu deaktivieren, müssen Sie diese Einstellung auf 0 festlegen.

Um diese Einstellung auf sieben Tage festzulegen, führen Sie Folgendes aus:

SELECT * FROM [identity].[Settings] WHERE [Key]='Directory.ActiveDirectory.CacheExpirationSeconds' and [PartitionId]=1
IF @@ROWCOUNT>0
    UPDATE [identity].[Settings] SET [Value]='604800' WHERE [Key]='Directory.ActiveDirectory.CacheExpirationSeconds' and [PartitionId]=1
ELSE
    INSERT INTO [identity].[Settings] ([Key], [Value], [PartitionId]) VALUES ('Directory.ActiveDirectory.CacheExpirationSeconds', '604800', 1)SELECT * FROM [identity].[Settings] WHERE [Key]='Directory.ActiveDirectory.CacheExpirationSeconds' and [PartitionId]=1
IF @@ROWCOUNT>0
    UPDATE [identity].[Settings] SET [Value]='604800' WHERE [Key]='Directory.ActiveDirectory.CacheExpirationSeconds' and [PartitionId]=1
ELSE
    INSERT INTO [identity].[Settings] ([Key], [Value], [PartitionId]) VALUES ('Directory.ActiveDirectory.CacheExpirationSeconds', '604800', 1)

So deaktivieren Sie das AD Domänen-Caching:

SELECT * FROM [identity].[Settings] WHERE [Key]='Directory.ActiveDirectory.CacheExpirationSeconds' and [PartitionId]=1
IF @@ROWCOUNT>0
    UPDATE [identity].[Settings] SET [Value]='0' WHERE [Key]='Directory.ActiveDirectory.CacheExpirationSeconds' and [PartitionId]=1
ELSE
    INSERT INTO [identity].[Settings] ([Key], [Value], [PartitionId]) VALUES ('Directory.ActiveDirectory.CacheExpirationSeconds', '0', 1)SELECT * FROM [identity].[Settings] WHERE [Key]='Directory.ActiveDirectory.CacheExpirationSeconds' and [PartitionId]=1
IF @@ROWCOUNT>0
    UPDATE [identity].[Settings] SET [Value]='0' WHERE [Key]='Directory.ActiveDirectory.CacheExpirationSeconds' and [PartitionId]=1
ELSE
    INSERT INTO [identity].[Settings] ([Key], [Value], [PartitionId]) VALUES ('Directory.ActiveDirectory.CacheExpirationSeconds', '0', 1)

Deaktivieren von SignalR für Roboter-Lizenzänderungsereignisse

Während einer offensiven Anlaufphase würden die Lizenzerwerbsereignisse die SignalR Redis-Backplane erheblich unter Druck setzen. Um dies zu mildern, kann das Ereignis deaktiviert werden, was dazu führt, dass die Lizenzierungsbenutzeroberfläche nicht mehr in Echtzeit aktualisiert wird. Wenn Sie jedoch 100.000 Roboter haben, ist diese Bildschirmaktualisierung in Echtzeit von geringem Wert.

<appSettings>
  <add key="Scalability.SignalR.Browser.RobotLicenseChangeEventEnabled" value="false" />
</appSettings><appSettings>
  <add key="Scalability.SignalR.Browser.RobotLicenseChangeEventEnabled" value="false" />
</appSettings>

Aktivieren der NuGet-Paketzwischenspeicherung

Diese Änderung stellt sicher, dass der Paketinhalt serverseitig zwischengespeichert wird, und kann sich als nützlich erweisen, wenn die Dateifreigabe nicht mit dem Paket-Download-Durchsatz mithalten kann.

<<add key="NuGet.Caching.Enabled" value="true" />
<add key="NuGet.Caching.MaxCacheSize" value="104857600" /><!-- (100 MiB) -->
<add key="NuGet.Caching.MaxPackageSize" value="4194304" /><!-- (4 MiB) -->
<add key="NuGet.Caching.AbsoluteExpirationRelativeToNow" value="00:10:00" /><!-- (1 min) --><<add key="NuGet.Caching.Enabled" value="true" />
<add key="NuGet.Caching.MaxCacheSize" value="104857600" /><!-- (100 MiB) -->
<add key="NuGet.Caching.MaxPackageSize" value="4194304" /><!-- (4 MiB) -->
<add key="NuGet.Caching.AbsoluteExpirationRelativeToNow" value="00:10:00" /><!-- (1 min) -->
Das Hinzufügen der Einstellung NuGet.Caching.Enabled sollte ausreichen, um die Funktion zu aktivieren. Sie müssen nur die restlichen Einstellungen anpassen, die im obigen Beispiel angezeigt werden, wenn Sie die Standardeinstellungen ändern möchten, z. B. die Größe des Caches oder der Paketgrößenbeschränkungen erhöhen möchten.

Aktivieren des lokalen Caches in Azure PaaS-Bereitstellungen

Legen Sie die folgende Konfiguration für den Produktionsslot des Orchestrator App Service als angeheftet fest.

WEBSITE_LOCAL_CACHE_OPTION = Always
WEBSITE_LOCAL_CACHE_SIZEINMB = 1000WEBSITE_LOCAL_CACHE_OPTION = Always
WEBSITE_LOCAL_CACHE_SIZEINMB = 1000

Konfigurieren von Slot Warm-Up in Azure PaaS-Bereitstellungen

Legen Sie die folgende Konfiguration sowohl für die Produktions- als auch für die Hotswap-Bereitstellungsslots des Orchestrator App Service fest. Während der Bereitstellung wird die Anwendung aufgewärmt, wodurch die Leistungseinbußen minimiert werden, die durch die Umleitung von Datenverkehr an eine kalte App verursacht werden.

WEBSITE_SWAP_WARMUP_PING_PATH = /api/status
WEBSITE_SWAP_WARMUP_PING_STATUSES = 200WEBSITE_SWAP_WARMUP_PING_PATH = /api/status
WEBSITE_SWAP_WARMUP_PING_STATUSES = 200

Verwenden von Azure SignalR Service in Azure PaaS-Bereitstellungen

Die Verwendung von Azure SignalR Service in einer Azure-Bereitstellung kann die Last auf den Webservern erheblich reduzieren. Weitere Informationen zu dieser Einstellung finden Sie unter Scalability.AzureSignalR.ConnectionString .

<appSettings>
  <add key="LoadBalancer.UseRedis" value="true"/>
  <add key="Scalability.AzureSignalR.ConnectionString" value="**myAzureSignalRConnectionString" />
</appSettings><appSettings>
  <add key="LoadBalancer.UseRedis" value="true"/>
  <add key="Scalability.AzureSignalR.ConnectionString" value="**myAzureSignalRConnectionString" />
</appSettings>

Anpassen des Flush-Intervalls und der Größe für den SubmitLogs-Endpunkt

Mit dieser Änderung können Sie das Zeitrahmen-Batchfenster zum Sammeln von Protokollen aus dem Executor-Prozess steuern, bevor Sie den SubmitLogs-API-Endpunkt aufrufen. Aktivieren Sie die folgenden Einstellungen in UiPath.Orchestrator.dll.config und konfigurieren Sie sie entsprechend Ihren Anforderungen:
  • RobotsLogs.Flush.Interval

    <add key="RobotsLogs.Flush.Interval" value="0" /><add key="RobotsLogs.Flush.Interval" value="0" />

Weitere Informationen zu dieser Einstellung finden Sie unter RobotsLogs.Flush.Interval.

  • RobotsLogs.Flush.BatchSize

    <add key="RobotsLogs.Flush.BatchSize" value="100" /><add key="RobotsLogs.Flush.BatchSize" value="100" />

Weitere Informationen zu dieser Einstellung finden Sie unter RobotsLogs.Flush.BatchSize.

Identity Server-Änderungen für verbesserte Leistung

Die folgenden Änderungen an der Datei AppSettings.Production.json von Identity Server sollten zu einer verbesserten Leistung in großen Produktionsumgebungen führen.

Geben Sie eine große maximale Poolgröße in der Verbindungszeichenfolge an.

"ConnectionStrings": {
    "DefaultConnection": "Data Source=dbServer;Initial Catalog=UiPath_is;User ID=username;Password=****;Max Pool Size=1000"
  }"ConnectionStrings": {
    "DefaultConnection": "Data Source=dbServer;Initial Catalog=UiPath_is;User ID=username;Password=****;Max Pool Size=1000"
  }

Aktivieren von Redis

"LoadBalancerSettings": {
      "RedisConnectionString": "yourRedis:6379,password=****",
      "UseRedis": "true"
    }"LoadBalancerSettings": {
      "RedisConnectionString": "yourRedis:6379,password=****",
      "UseRedis": "true"
    }

Benutzeroberflächenkonfigurationsänderungen für verbesserte Leistung

Auf der Benutzeroberfläche von Orchestrator können Sie die folgenden Schritte ausführen, um die Leistung in großen Produktionsumgebungen zu verbessern:

  • Deaktivieren des persönlichen Arbeitsbereichs;
  • Deaktivieren von Webanmeldung zulassen für Roboterbenutzer;
  • Weisen Sie Roboterbenutzern die Rollen Roboter und Automation User zu.

War diese Seite hilfreich?

Hilfe erhalten
RPA lernen – Automatisierungskurse
UiPath Community-Forum
Uipath Logo White
Vertrauen und Sicherheit
© 2005–2024 UiPath. Alle Rechte vorbehalten