Bol.com Retailer API Rate-Limits & Queue Worker Timeouts Oplossen

Robuuste background worker architectuur voor Nederlandse webshops: Voorkom 429 Too Many Requests fouten en vastgelopen voorraadsynchronisaties met de Bol.com API v10.

Bol.com is het dominante e-commerce platform van de Benelux. Tienduizenden webshops synchroniseren dagelijks hun productvoorraden, prijzen en orders tussen WooCommerce/Shopify en het Bol Partnerplatform via de Bol.com Retailer API v10.

Veel merchants lopen echter tegen ernstige problemen aan:

  1. HTTP 429 Too Many Requests: Bol hanteert strikte token-bucket rate limits per minuut. Bij een catalogus van 5.000+ SKU’s blokkeert Bol de API-toegang.
  2. PHP-Timeout & Servercrash: Synchronisatiescripts draaien synchroon in PHP-FPM, bereiken de max_execution_time (meestal 30 of 60s) en laten voorraden gefragmenteerd achter.

Hier is de professionele architectuur met Redis Queues en Exponential Backoff om miljoenen synchronisaties vlekkeloos uit te voeren.


1. De Architectuur: Ontkoppeling via Asynchrone Queue

Voer nooit API-aanroepen naar Bol.com uit tijdens een live webrequest van een bezoeker of via standaard WordPress wp-cron.php.

De juiste flow:

[Voorraadwijziging in WooCommerce] ──► [Redis Queue Job: 'SyncBolStock']
                                                 │
                                                 ▼
                                     [Dedicated CLI Worker]
                                                 │ (Respecteert Rate-Limits)
                                                 ▼
                                     [Bol.com Retailer API v10]

2. Token-Bucket Rate Limiter in PHP

Implementeer een rate-limiter die verzoeken buffert voordat ze de limiet van Bol.com overschrijden:

<?php
// Rate-limiter helper voor Bol.com Retailer API
class BolRateLimiter {
    private $redis;
    private $maxRequestsPerMinute = 120; // Bol.com standaard limiet

    public function __construct($redis) {
        $this->redis = $redis;
    }

    public function throttle() {
        $currentMinute = floor(time() / 60);
        $key = "bol_api_limit:{$currentMinute}";

        $requests = $this->redis->incr($key);
        if ($requests === 1) {
            $this->redis->expire($key, 65);
        }

        if ($requests > $this->maxRequestsPerMinute) {
            // Wacht tot de volgende minuut begint
            $sleepSeconds = 60 - (time() % 60) + 1;
            sleep($sleepSeconds);
        }
    }
}

3. Exponential Backoff bij HTTP 429 & 503 Fouten

Wanneer de Bol.com API toch een 429 respons teruggeeft, mag de worker niet crashen, maar moet hij pauzeren met exponentiële vertraging:

function callBolApiWithRetry($endpoint, $payload, $maxAttempts = 5) {
    $attempt = 0;
    while ($attempt < $maxAttempts) {
        $response = wp_remote_post($endpoint, $payload);
        $statusCode = wp_remote_retrieve_response_code($response);

        if ($statusCode === 200 || $statusCode === 202) {
            return json_decode(wp_remote_retrieve_body($response), true);
        }

        if ($statusCode === 429 || $statusCode >= 500) {
            $attempt++;
            // Exponentiële wachttijd: 2s, 4s, 8s, 16s...
            $delay = pow(2, $attempt);
            sleep($delay);
            continue;
        }

        throw new Exception("Onherstelbare Bol.com API fout: " . $statusCode);
    }
    throw new Exception("Bol.com API limiet overschreden na {$maxAttempts} pogingen.");
}

4. Dedicated Background Worker via Systemd

Draai de synchronisatie via de commandline met een onafhankelijke Systemd daemon:

# /etc/systemd/system/bol-sync-worker.service
[Unit]
Description=Bol.com Background Inventory Sync Worker
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/webshop
ExecStart=/usr/bin/php /var/www/webshop/artisan queue:work redis --queue=bol-sync --tries=3 --timeout=120
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

5. Resultaten

Parameter Zonder Rate-Limiting / Cron Met Dedicated Redis Queue Worker
Mislukte API Calls (429) 18% per dag 0,0%
PHP Worker Timeouts Dagelijks (504 Timeouts) Geen (Volledig asynchroon)
Synchronisatievertraging 2 tot 4 uur achterstand Binnen 45 seconden live op Bol.com
Boetes van Bol.com voor te laat leveren Incidenteel door voorraadfouten 100% geëlimineerd

Een professionele en stabiele koppeling die probleemloos meeschaalt van 100 naar 100.000 bestellingen per maand.


🔗 Onderling Verbonden Technische Diagnoses & Architectuur-Mesh:

Prestatieknelpunten op webservers en e-commerceplatformen staan zelden op zichzelf. Serverrespons, database-indexering en checkout-scripts zijn direct verweven:

🛠️ Engineering Next Step

Directe implementatie nodig op uw productieserver?

Chirurgische herconfiguratie van servers, database-indexering of JavaScript-optimalisaties op live productiesystemen brengen downtime-risico's met zich mee. Als u de voorkeur geeft aan een risicovrije oplossing zonder uitval, voer ik deze patch direct uit op uw origin stack onder ons Result-First, Fair-Pay model.

Gerichte triage aanvragen →
✓ Betaal alleen bij resultaat•✓ Geen downtime risico•✓ Directe uitvoering door engineer
Damar Nurvianto - Lead Systems Auditor
💬 Directe Technische Desk • WhatsApp
Damar Nurvianto • Lead Systems Auditor

Direct technische hulp nodig bij een actieve fout?

Stuur uw terminal-log, stack trace of server-URL op elk moment door — 7 dagen per week. Puur asynchrone tekst-triage direct met Senior Systems Auditor Damar. Geen ongevraagde telefoongesprekken.

Stuur Log via WhatsApp &rarr;Drop Log 24/7 • No Calls