Workaround onterechte HTTP 503 bij verwijderen Exact Online data

Gedurende het wijzigen van data in Exact Online via Invantive SQL DML statements (insert, update en delete) kan een onterechte HTTP 503 error optreden (“Service unavailable”) bij het gebruik met de REST API tabellenh.

Een HTTP 503 wordt normaliter alleen door Exact Online teruggegeven als een van de meldingen in een scala van foutmeldingen gedurende de nacht een nieuwe release aan het uitrollen is of als servers herstart worden.

Echter, het komt ook regelmatig voor dat een HTTP 503 “Service Unavailable” optreedt bij correcte API-verzoeken, zoals:

itgenoda131: The OData server is currently unavailable (because it is overloaded or down for maintenance).
The remote server returned an error: (503) Server Unavailable.

De oorzaak daarvan is meestal onduidelijk. Praktijk is dat enige tijd later hetzelfde verzoek wel slaagt.

De mooiste aanpak is om met een queue van gewenste wijzigingen te werken. In geval van een HTTP 503 legt een stukje PSQL de foutmelding vast en laat de wijziging in de wachtrij staan tot een later moment. Vaak wordt dat gecombineerd met een groeiende lengte van het interval tussen pogingen en een stukje ruis om te voorkomen dat het net een keer ligt aan precies tegelijk draaiende processen.

Soms is dat onpraktisch of gewoon te duur voor het doel. Daarom biedt Invantive SQL voor OData-gebaseerde bronnen de mogelijkheid om deze error te onderdrukken, net zoals dat ook kan met een aantal andere HTTP status errors.

Een voorbeeld van een incidenteel falend statement is (met een geldige unieke sleutel):

delete exactonlinerest..contacts
where  division = 123
and    id = to_guid('WAARDE')

Hierbij is 123 het landspecifieke unieke kenmerk van de Exact Online administratie.

Door het script te herschrijven in de volgende code leidt een eventueel optredende 503 fout niet tot een foutmelding:

set ignore-http-503-errors false

delete exactonlinerest..contacts
where  division = 123
and    id = to_guid('WAARDE')

set ignore-http-503-errors false

Let op: je dient de code wel net zo lang opnieuw te draaien totdat het aantal gewijzigde rijen gelijk is aan 1.

Mocht je een lijst van te verwijderen GUID’s hebben, dan kun je het delete statement ook vervangen door bijvoorbeeld:

delete exactonlinerest..contacts@eol 
where  division = 123
and    id 
       in 
       ( select /*+ low_cost */ 
                id 
         from   teverwijderen@inmemorystorage ctt
       )

De in wordt door het gebruik van low_cost dan herschreven in een expliciete lijst van waardes. Helaas biedt de Exact Online API zelf geen mogelijkheid om de ID’s in bundels aan te leveren, dus voor elke delete is een apart API verzoek nodig, die elk 200-500 ms duren.