Optimisation des performances

AMRnet a été largement optimisé pour gérer efficacement les grands ensembles de données de surveillance génomique, couvrant les considérations de performance, les stratégies d’optimisation et les meilleures pratiques de déploiement.

Aperçu de l’architecture

Les optimisations de performances d’AMRnet couvrent toute la pile d’application :

Optimisations du frontend :

  • Chargement à la légère : Composants et données chargés à la demande

  • Défilement Virtuel : Rendu efficace des grands ensembles de données

  • Mise en cache intelligente : Stockage basé sur le navigateur pour les données fréquemment consultées

  • Compression : Les réponses compressées réduisent le transfert jusqu’à 96%

  • Charge progressive : Récupération des données par priorité

Optimisations Backend :

  • Indexation de la base de données : Optimisation des index MongoDB pour les requêtes courantes

  • Pipelines d’agrégation : Traitement des données côté serveur

  • Regroupement de connexions : Gestion efficace des connexions à la base de données

  • Projection de champ: Transférer uniquement les champs de données nécessaires

  • Traitement parallèle : Traitement simultané des données pour plusieurs requêtes

Charger des améliorations de temps

Les optimisations récentes ont considérablement amélioré les temps de chargement pour tous les organismes:

Benchmarks de performance :

Charger des améliorations de temps

Organisme

Avant (secondes)

Après (secondes)

Amélioration

  1. pneumoniae

7-8s (63MB)

1,4s (2,3MB)

81 % plus rapide

  1. coli

21-23s (186MB)

7 s (13Mo)

70% plus rapide

  1. coli (diarrhée)

6-15s (51MB)

2s (4Mo)

87% plus rapide

Stratégies d’optimisation :

  1. Endpoints optimisés : routes /api/optimized/* avec une charge minimale

  2. Pagination : grands ensembles de données divisés en chunks gérables

  3. Chargement parallèle : plusieurs sections de cartes chargées simultanément

  4. Smart Caching : Données fréquemment consultées en cache localement

Optimisation de la base de données

Les optimisations de performance de MongoDB garantissent des réponses rapides aux requêtes :

Stratégie d’indexation :

// Compound indexes for common query patterns
db.ecoli_data.createIndex({ COUNTRY_ONLY: 1, YEAR: 1 })
db.kpneumo_data.createIndex({ GENOTYPE: 1, COUNTRY_ONLY: 1 })
db.styphi_data.createIndex({ GENOTYPE: 1, YEAR: 1, COUNTRY_ONLY: 1 })

Pipelines d’agrégation :

// Efficient data aggregation with field projection
db.collection.aggregate([
  { $match: { COUNTRY_ONLY: "BGD", YEAR: { $gte: 2020 } } },
  { $project: {
      COUNTRY_ONLY: 1,
      YEAR: 1,
      GENOTYPE: 1,
      RESISTANCE_PROFILE: 1,
      _id: 0
    } },
  { $group: {
      _id: { country: "$COUNTRY_ONLY", year: "$YEAR" },
      count: { $sum: 1 },
      genotypes: { $addToSet: "$GENOTYPE" }
    } }
])

Optimisation de la connexion :

// MongoDB connection settings for production
const mongoOptions = {
  maxPoolSize: 10,
  minPoolSize: 5,
  maxIdleTimeMS: 30000,
  serverSelectionTimeoutMS: 5000,
  socketTimeoutMS: 45000,
  bufferMaxEntries: 0
};

Performance du frontend

Optimisations d’application React pour une expérience utilisateur fluide:

Optimisation des composants :

// Memoized components prevent unnecessary re-renders
import React, { memo, useMemo, useCallback } from 'react';

const OptimizedChart = memo(({ data, filters }) => {
  const processedData = useMemo(() =>
    processChartData(data, filters), [data, filters]
  );

  const handleFilterChange = useCallback((newFilter) => {
    // Debounced filter updates
    debounce(() => updateFilters(newFilter), 300);
  }, []);

  return <Chart data={processedData} onFilterChange={handleFilterChange} />;
});

Optimisation du chargement des données :

// Parallel data loading with Promise.all
const loadOrganismData = async (organism) => {
  const [mapData, trendsData, resistanceData] = await Promise.all([
    fetch(`/api/optimized/map/${organism}`),
    fetch(`/api/optimized/trends/${organism}`),
    fetch(`/api/optimized/resistance/${organism}`)
  ]);

  return {
    map: await mapData.json(),
    trends: await trendsData.json(),
    resistance: await resistanceData.json()
  };
};

Défilement virtuel pour les grandes listes :

import { FixedSizeList as List } from 'react-window';

const LargeDataList = ({ data }) => (
  <List
    height={400}
    itemCount={data.length}
    itemSize={50}
    itemData={data}
  >
    {({ index, style, data }) => (
      <div style={style}>
        {/* Render only visible items */}
        <DataRow item={data[index]} />
      </div>
    )}
  </List>
);

Optimisation du déploiement

Configurations de déploiement de production pour des performances optimales :

Configuration Heroku :

# Environment variables for production
NODE_ENV=production
MONGODB_URI=mongodb+srv://...

# Enable compression
ENABLE_COMPRESSION=true

# Connection pooling
DB_POOL_SIZE=10

# Cache settings
CACHE_TTL=300

Intégration CDN :

// Static asset optimization
const nextConfig = {
  images: {
    domains: ['cdn.amrnet.org'],
    formats: ['image/webp', 'image/avif'],
  },
  compiler: {
    removeConsole: process.env.NODE_ENV === 'production',
  },
  experimental: {
    optimizeCss: true,
  }
};

Surveillance et Alerte :

// Performance monitoring
const performanceMonitor = {
  trackPageLoad: (pageName, loadTime) => {
    if (loadTime > 3000) {
      console.warn(`Slow page load: ${pageName} took ${loadTime}ms`);
    }
  },

  trackAPICall: (endpoint, responseTime, payloadSize) => {
    if (responseTime > 2000 || payloadSize > 5000000) {
      console.warn(`Performance issue: ${endpoint}`);
    }
  }
};

Stratégies de mise en cache

Mise en cache à plusieurs niveaux pour des performances optimales:

Mise en cache du navigateur:

// Service worker for offline capabilities
const CACHE_NAME = 'amrnet-v1';
const urlsToCache = [
  '/',
  '/static/css/main.css',
  '/static/js/main.js',
  '/api/metadata'
];

self.addEventListener('fetch', event => {
  event.respondWith(
    caches.match(event.request)
      .then(response => response || fetch(event.request))
  );
});

Mise en cache Redis (facultatif) :

// Server-side caching for frequently accessed data
const redis = require('redis');
const client = redis.createClient(process.env.REDIS_URL);

const getCachedData = async (key) => {
  const cached = await client.get(key);
  return cached ? JSON.parse(cached) : null;
};

const setCachedData = async (key, data, ttl = 300) => {
  await client.setex(key, ttl, JSON.stringify(data));
};

Surveillance des performances

Suivi et optimisation des performances en temps réel :

Client-Side Metrics:

// Web Vitals monitoring
import { getCLS, getFID, getFCP, getLCP, getTTFB } from 'web-vitals';

const sendToAnalytics = (metric) => {
  // Send performance metrics to monitoring service
  fetch('/api/analytics', {
    method: 'POST',
    body: JSON.stringify(metric)
  });
};

getCLS(sendToAnalytics);
getFID(sendToAnalytics);
getFCP(sendToAnalytics);
getLCP(sendToAnalytics);
getTTFB(sendToAnalytics);

Surveillance côté serveur :

// Express middleware for performance tracking
const performanceMiddleware = (req, res, next) => {
  const start = Date.now();

  res.on('finish', () => {
    const duration = Date.now() - start;
    console.log(`${req.method} ${req.path}: ${duration}ms`);

    // Alert if response time exceeds threshold
    if (duration > 2000) {
      console.warn(`Slow request: ${req.path} took ${duration}ms`);
    }
  });

  next();
};

Meilleures pratiques

Meilleures pratiques de développement :

  1. Mesure d’abord : Utilisez les outils de développement du navigateur pour identifier les goulets d’étranglement

  2. Optimiser les requêtes : Utilisez la base de données pour expliquer les plans d’optimisation des requêtes

  3. Taille du lot du moniteur : Gardez les paquets JavaScript à moins de 250 Ko

  4. Optimisation de l’image : Utilisez des formats modernes (WebP, AVIF) et des images réactives

  5. Répartition du code : Charger uniquement le code nécessaire pour chaque page

Meilleures pratiques de production :

  1. Activer Compression : Utiliser la compression gzip/brotli

  2. Utilisation du CDN : Servir les assets statiques depuis CDN

  3. Index de la base de données : Assurer une indexation correcte pour toutes les requêtes

  4. Regroupement de connexions : Optimiser les pools de connexion à la base de données

  5. Surveillance des performances : Configurez des alertes pour la dégradation des performances

Dépannage

Problèmes communs de performance :

  1. Chargement lent des pages: Vérifiez l’onglet réseau pour les grosses charges

  2. Utilisation mémoire élevée : Utiliser l’onglet Mémoire DevTools Chrome

  3. Délai d’attente de la base de données : Revoir les logs de requêtes lents de MongoDB

  4. Manque de cache : Vérifiez la configuration du cache et les paramètres TTL

Test des performances :

# Load testing with Artillery
npm install -g artillery
artillery quick --count 100 --num 10 https://amrnet.org

# Bundle analysis
npm run build
npm run analyze

Outils de Surveillance :

  • DevTools du navigateur (onglet Performance)

  • Boussole MongoDB (Requête de performance)

  • Métriques Heroku (si déployées sur Heroku)

  • Extension Web Vitals

  • Lighthouse CI pour les tests automatisés