维护和优化AI小龙虾养殖数据可视化系统,确保系统稳定运行,提高数据展示效果和用户体验。

系统架构
前端(React/Vue + ECharts) ↔ API网关 ↔ 后端服务(Flask/Django) ↔ 数据库/实时数据流
维护重点
数据获取优化
// 优化后的实时数据获取
async function fetchRealTimeData() {
try {
// 使用WebSocket替代轮询,减少请求次数
const ws = new WebSocket('wss://api.xiaolongxia.com/ws');
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
// 数据缓存,避免重复渲染
if (!isDataDuplicate(data)) {
updateCharts(data);
cacheData(data);
}
};
// 心跳检测
setInterval(() => {
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify({ type: 'ping' }));
}
}, 30000);
} catch (error) {
// 降级处理:使用轮询
fallbackToPolling();
}
}
图表性能优化
// ECharts配置优化
const optimizedChartOptions = {
// 启用数据采样,大数据集时自动降采样
dataZoom: [{
type: 'inside',
start: 0,
end: 100,
minValueSpan: 10
}],
// 开启Canvas渲染(替代SVG,提升性能)
renderer: 'canvas',
// 动画优化
animation: {
duration: 300,
easing: 'cubicOut',
threshold: 100 // 数据点超过100时关闭动画
},
// 系列配置
series: [{
type: 'line',
sampling: 'lttb', // 使用LTTB降采样算法
progressive: 1000, // 增量渲染
progressiveThreshold: 3000,
// ...
}]
};
异常检测与告警
# 后端异常检测逻辑
class AbnormalDetection:
def __init__(self):
self.thresholds = {
'temperature': {'min': 20, 'max': 30},
'ph': {'min': 6.5, 'max': 8.5},
'dissolved_oxygen': {'min': 5, 'max': 12}
}
self.anomaly_history = []
def detect_anomalies(self, data):
anomalies = []
for metric, value in data.items():
if metric in self.thresholds:
threshold = self.thresholds[metric]
if value < threshold['min'] or value > threshold['max']:
anomaly = {
'metric': metric,
'value': value,
'threshold': threshold,
'timestamp': datetime.now(),
'severity': self.calculate_severity(metric, value)
}
anomalies.append(anomaly)
self.notify_alert(anomaly)
return anomalies
def calculate_severity(self, metric, value):
# 计算异常严重程度
threshold = self.thresholds[metric]
deviation = min(
abs(value - threshold['min']),
abs(value - threshold['max'])
)
return min(deviation * 10, 100) # 0-100评分
数据缓存策略
# Redis缓存实现
import redis
import json
from datetime import timedelta
class DataCache:
def __init__(self):
self.redis_client = redis.Redis(
host='localhost',
port=6379,
decode_responses=True
)
def cache_realtime_data(self, pool_id, data):
"""缓存实时数据,有效期5分钟"""
key = f"realtime:{pool_id}"
self.redis_client.setex(
key,
timedelta(minutes=5),
json.dumps(data)
)
def cache_historical_data(self, pool_id, date_range, data):
"""缓存历史数据,根据时间范围设置不同有效期"""
key = f"historical:{pool_id}:{date_range}"
# 根据时间范围设置不同缓存策略
ttl_map = {
'1d': 300, # 5分钟
'7d': 1800, # 30分钟
'30d': 3600, # 1小时
'custom': 300 # 5分钟
}
ttl = ttl_map.get(date_range, 300)
self.redis_client.setex(key, ttl, json.dumps(data))
监控与告警
# Prometheus监控配置
scrape_configs:
- job_name: 'crayfish_monitoring'
static_configs:
- targets: ['localhost:8000']
metrics_path: '/metrics'
# 自定义指标
metric_relabel_configs:
- source_labels: [__name__]
regex: '(water_temperature|ph_value|dissolved_oxygen)'
action: keep
# 告警规则
groups:
- name: crayfish_alerts
rules:
- alert: HighTemperature
expr: water_temperature > 30
for: 5m
labels:
severity: critical
annotations:
summary: "水温过高"
description: "水温连续5分钟超过30度,当前值: {{ $value }}°C"
- alert: LowPH
expr: ph_value < 6.5
for: 10m
labels:
severity: warning
annotations:
summary: "pH值过低"
description: "pH值连续10分钟低于6.5,当前值: {{ $value }}"
前端组件优化
<!-- 优化后的Vue组件 -->
<template>
<div class="dashboard-container">
<!-- 骨架屏加载 -->
<div v-if="loading" class="skeleton-loader">
<div v-for="i in 3" :key="i" class="chart-skeleton"></div>
</div>
<!-- 主图表区域 -->
<div v-else class="charts-grid">
<chart-card
v-for="chart in charts"
:key="chart.id"
:title="chart.title"
:data="chart.data"
:options="chart.options"
@time-range-change="handleTimeRangeChange"
/>
</div>
<!-- 异常告警面板 -->
<alert-panel
v-if="anomalies.length > 0"
:anomalies="anomalies"
@acknowledge="handleAcknowledge"
/>
</div>
</template>
<script>
import { debounce } from 'lodash';
export default {
data() {
return {
loading: true,
charts: [],
anomalies: [],
resizeHandler: null
};
},
mounted() {
this.initCharts();
this.setupResponsive();
},
methods: {
// 防抖处理窗口调整
setupResponsive() {
this.resizeHandler = debounce(() => {
this.charts.forEach(chart => {
chart.instance.resize();
});
}, 300);
window.addEventListener('resize', this.resizeHandler);
},
// 数据预加载
async initCharts() {
try {
const [realtimeData, historicalData, anomalies] = await Promise.all([
this.fetchRealtimeData(),
this.fetchHistoricalData('24h'),
this.fetchAnomalies()
]);
this.updateCharts(realtimeData, historicalData);
this.anomalies = anomalies;
} catch (error) {
this.handleError(error);
} finally {
this.loading = false;
}
}
}
};
</script>
数据库查询优化
-- 优化后的历史数据查询 CREATE INDEX idx_timestamp_metric ON sensor_data (timestamp, metric_type); -- 使用物化视图预聚合数据 CREATE MATERIALIZED VIEW daily_aggregates AS SELECT DATE(timestamp) as date, pool_id, metric_type, AVG(value) as avg_value, MIN(value) as min_value, MAX(value) as max_value, COUNT(*) as readings FROM sensor_data WHERE timestamp >= NOW() - INTERVAL '30 days' GROUP BY DATE(timestamp), pool_id, metric_type; -- 定期刷新物化视图 CREATE OR REPLACE FUNCTION refresh_daily_aggregates() RETURNS void AS $$ BEGIN REFRESH MATERIALIZED VIEW CONCURRENTLY daily_aggregates; END; $$ LANGUAGE plpgsql; -- 设置定时任务每小时刷新一次
错误处理与降级
// 前端错误处理和降级策略
class VisualizationFallback {
constructor() {
this.fallbackMode = false;
}
// 检查图表渲染性能
checkPerformance(renderTime) {
if (renderTime > 1000) { // 渲染超过1秒
this.enableFallbackMode();
return false;
}
return true;
}
enableFallbackMode() {
this.fallbackMode = true;
// 切换到简化图表
this.switchToSimplifiedCharts();
// 减少数据点
this.reduceDataPoints();
// 通知用户
this.showPerformanceNotice();
}
switchToSimplifiedCharts() {
// 使用简化版本的图表配置
const simplifiedOptions = {
animation: false,
tooltip: { show: false },
dataZoom: { disabled: true },
// ... 其他简化配置
};
this.charts.forEach(chart => {
chart.setOption(simplifiedOptions, true);
});
}
}
部署与运维脚本
#!/bin/bash
# 部署脚本
# 环境检查
check_environment() {
echo "检查系统环境..."
# 检查Docker
if ! command -v docker &> /dev/null; then
echo "错误: Docker未安装"
exit 1
fi
# 检查Docker Compose
if ! command -v docker-compose &> /dev/null; then
echo "错误: Docker Compose未安装"
exit 1
fi
# 检查端口占用
for port in 3000 8000 9090; do
if lsof -Pi :$port -sTCP:LISTEN -t >/dev/null ; then
echo "警告: 端口 $port 已被占用"
fi
done
}
# 备份数据
backup_data() {
echo "备份现有数据..."
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="backups/$TIMESTAMP"
mkdir -p $BACKUP_DIR
# 备份数据库
docker exec postgres pg_dump -U crayfish_user crayfish_db > $BACKUP_DIR/db_backup.sql
# 备份配置文件
cp -r config/* $BACKUP_DIR/config/
echo "数据备份完成: $BACKUP_DIR"
}
# 执行部署
deploy() {
echo "开始部署..."
# 停止现有服务
docker-compose down
# 拉取最新镜像
docker-compose pull
# 启动服务
docker-compose up -d
# 等待服务就绪
sleep 30
# 运行数据库迁移
docker-compose exec backend python manage.py migrate
echo "部署完成"
}
# 健康检查
health_check() {
echo "执行健康检查..."
# 检查前端
curl -f http://localhost:3000/health || echo "前端服务异常"
# 检查后端API
curl -f http://localhost:8000/api/health || echo "后端服务异常"
# 检查数据库连接
docker-compose exec backend python check_db.py || echo "数据库连接异常"
echo "健康检查完成"
}
# 主流程
main() {
check_environment
backup_data
deploy
health_check
}
main "$@"
维护计划
日常维护
-
监控检查(每日)
- 检查系统日志和错误率
- 验证数据采集完整性
- 检查告警系统状态
-
性能检查(每周)
- 图表渲染性能测试
- 数据库查询性能分析
- 缓存命中率检查
-
数据质量检查(每月)
- 异常数据验证
- 数据一致性检查
- 备份完整性验证
季度优化
- 图表库版本更新
- 性能基准测试
- 用户体验调研和改进
文档更新
每次维护后需要更新:
- 系统架构图
- API文档
- 故障处理手册
- 性能监控指标文档
紧急响应
- 建立7×24小时响应机制
- 制定故障升级流程
- 准备应急预案和回滚方案
这个维护方案确保了AI小龙虾养护数据可视化系统的稳定性、性能和可维护性,同时提供了应对各种情况的策略和工具。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。