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 :
Organisme |
Avant (secondes) |
Après (secondes) |
Amélioration |
|---|---|---|---|
|
7-8s (63MB) |
1,4s (2,3MB) |
81 % plus rapide |
|
21-23s (186MB) |
7 s (13Mo) |
70% plus rapide |
|
6-15s (51MB) |
2s (4Mo) |
87% plus rapide |
Stratégies d’optimisation :
Endpoints optimisés : routes
/api/optimized/*avec une charge minimalePagination : grands ensembles de données divisés en chunks gérables
Chargement parallèle : plusieurs sections de cartes chargées simultanément
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 :
Mesure d’abord : Utilisez les outils de développement du navigateur pour identifier les goulets d’étranglement
Optimiser les requêtes : Utilisez la base de données pour expliquer les plans d’optimisation des requêtes
Taille du lot du moniteur : Gardez les paquets JavaScript à moins de 250 Ko
Optimisation de l’image : Utilisez des formats modernes (WebP, AVIF) et des images réactives
Répartition du code : Charger uniquement le code nécessaire pour chaque page
Meilleures pratiques de production :
Activer Compression : Utiliser la compression gzip/brotli
Utilisation du CDN : Servir les assets statiques depuis CDN
Index de la base de données : Assurer une indexation correcte pour toutes les requêtes
Regroupement de connexions : Optimiser les pools de connexion à la base de données
Surveillance des performances : Configurez des alertes pour la dégradation des performances
Dépannage¶
Problèmes communs de performance :
Chargement lent des pages: Vérifiez l’onglet réseau pour les grosses charges
Utilisation mémoire élevée : Utiliser l’onglet Mémoire DevTools Chrome
Délai d’attente de la base de données : Revoir les logs de requêtes lents de MongoDB
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