Axios 请求超时设置无效的问题及解决方案

在这里插入图片描述

文章目录

  • Axios 请求超时设置无效的问题及解决方案
    • 1. 引言
    • 2. 理解 Axios 的超时机制
      • 2.1 Axios 超时的工作原理
      • 2.2 超时错误的处理
    • 3. Axios 请求超时设置无效的常见原因
      • 3.1 配置错误或遗漏
      • 3.2 超时发生在建立连接之前
      • 3.3 使用了不支持的传输协议
      • 3.4 代理服务器或中间件干扰
      • 3.5 请求被拦截或修改
      • 3.6 环境或库版本不兼容
      • 3.7 使用了自定义的 Cancel Token 或其他中断机制
    • 4. 解决 Axios 请求超时设置无效的问题
      • 4.1 确保正确配置超时选项
      • 4.2 使用 Axios 实例进行配置
      • 4.3 实现自动重试机制
      • 4.4 结合使用其他超时方法
      • 4.5 检查和优化拦截器逻辑
      • 4.6 更新 Axios 和相关依赖
      • 4.7 避免在代理或中间件中拦截超时设置
    • 5. 示例实现
      • 5.1 基本超时设置
      • 5.2 使用 Axios 实例
      • 5.3 自动重试机制
      • 5.4 结合使用 AbortController
      • 5.5 清理拦截器
    • 6. 高级优化建议
      • 6.1 动态设置超时
      • 6.2 使用自定义超时逻辑
      • 6.3 集成重试库
      • 6.4 结合使用 Web Workers
    • 7. 总结

Axios 请求超时设置无效的问题及解决方案

1. 引言

在现代前端开发中,Axios 是一个广泛使用的 HTTP 客户端库,用于向服务器发送请求并处理响应。为了确保应用的健壮性和用户体验,开发者通常会为请求设置超时时间,以防止因网络问题或服务器响应缓慢导致的无限等待。然而,有时开发者可能会发现 Axios 的超时设置似乎无效,导致请求在超时后仍然继续执行,或者超时行为未按预期触发。本文将深入探讨 Axios 请求超时设置无效的常见原因,并提供详细的解决方案和最佳实践,帮助开发者有效地配置和调试 Axios 的超时机制。

2. 理解 Axios 的超时机制

2.1 Axios 超时的工作原理

Axios 提供了一个 timeout 配置选项,用于指定请求的最大等待时间(以毫秒为单位)。如果请求在指定的时间内未完成,Axios 将自动中止请求并抛出一个超时错误。

axios.get('/user/12345', {
  timeout: 5000 // 5秒超时
})
.then(response => {
  console.log(response.data);
})
.catch(error => {
  if (error.code === 'ECONNABORTED') {
    console.error('请求超时!');
  } else {
    console.error('请求失败:', error.message);
  }
});

2.2 超时错误的处理

当请求超时时,Axios 会抛出一个错误对象,其 code 属性为 'ECONNABORTED',并包含超时的相关信息。开发者可以通过捕获该错误来进行相应的处理,例如提示用户重试或记录日志。

3. Axios 请求超时设置无效的常见原因

3.1 配置错误或遗漏

原因描述:未正确设置 timeout 配置选项,或在错误的位置设置了超时。

解决方案

  • 确保 timeout 配置项以毫秒为单位正确设置。
  • 确保 timeout 配置在正确的位置,例如全局配置或请求级别配置。

示例

// 全局配置
axios.defaults.timeout = 5000; // 5秒

// 请求级别配置
axios.get('/user/12345', {
  timeout: 5000
});

3.2 超时发生在建立连接之前

原因描述Axiostimeout 选项仅适用于请求的建立和响应过程,不包括 DNS 查询、TCP 连接建立等低层次的网络操作。因此,如果问题出在这些阶段,超时设置可能无法生效。

解决方案

  • 使用网络代理或 VPN 进行网络调试,确保 DNS 和 TCP 连接的稳定性。
  • 优化服务器的网络响应时间,减少建立连接所需的时间。

3.3 使用了不支持的传输协议

原因描述Axios 主要支持 HTTP 和 HTTPS 协议。如果使用其他传输协议(如 WebSocket),timeout 设置可能不会生效。

解决方案

  • 确保请求使用的是 Axios 支持的 HTTP 或 HTTPS 协议。
  • 对于需要其他协议的场景,使用适合的客户端库并实现相应的超时机制。

3.4 代理服务器或中间件干扰

原因描述:网络中存在代理服务器、防火墙或其他中间件,可能会延迟或阻止请求,从而影响超时设置的效果。

解决方案

  • 检查并配置代理服务器,确保其不会无故延迟或阻止请求。
  • 在必要时,调整代理服务器的超时设置,使其与 Axios 的超时配置保持一致。

3.5 请求被拦截或修改

原因描述:使用了 Axios 的拦截器(interceptors),在请求或响应阶段进行了拦截和修改,可能导致超时设置失效。

解决方案

  • 仔细检查请求和响应拦截器,确保它们不会意外地延迟或阻止请求的完成。
  • 在拦截器中处理超时逻辑,确保与 Axios 的超时机制兼容。

示例

// 请求拦截器
axios.interceptors.request.use(config => {
  // 例如,添加自定义头部
  config.headers['X-Custom-Header'] = 'foobar';
  return config;
}, error => {
  return Promise.reject(error);
});

// 响应拦截器
axios.interceptors.response.use(response => {
  // 例如,处理特定的响应格式
  return response;
}, error => {
  // 确保超时错误被正确传递
  return Promise.reject(error);
});

3.6 环境或库版本不兼容

原因描述:使用的 Axios 版本与其他依赖库或运行环境存在兼容性问题,可能导致超时设置无法正常工作。

解决方案

  • 确保使用的是 Axios 的最新稳定版本。
  • 检查并更新其他相关库,确保它们与 Axios 兼容。
  • 在不同环境(如浏览器、Node.js)中测试超时设置,确认其一致性。

3.7 使用了自定义的 Cancel Token 或其他中断机制

原因描述:在请求中使用了 AxiosCancelToken 或其他中断机制,可能与超时设置冲突,导致超时行为未按预期触发。

解决方案

  • 确保 CancelToken 的使用不会干扰 Axios 的超时机制。
  • 在实现自定义中断逻辑时,明确区分超时引发的中断和其他类型的中断。

示例

const source = axios.CancelToken.source();

axios.get('/user/12345', {
  timeout: 5000,
  cancelToken: source.token
})
.then(response => {
  console.log(response.data);
})
.catch(error => {
  if (axios.isCancel(error)) {
    console.log('请求被取消:', error.message);
  } else if (error.code === 'ECONNABORTED') {
    console.error('请求超时!');
  } else {
    console.error('请求失败:', error.message);
  }
});

// 在需要时取消请求
source.cancel('操作被用户取消');

4. 解决 Axios 请求超时设置无效的问题

4.1 确保正确配置超时选项

步骤

  1. 全局配置:在 Axios 的默认配置中设置 timeout,适用于所有请求。
  2. 请求级别配置:在单个请求中设置 timeout,覆盖全局配置。

示例

// 全局配置
axios.defaults.timeout = 5000; // 5秒超时

// 请求级别配置
axios.get('/user/12345', {
  timeout: 10000 // 10秒超时
});

注意:请求级别的配置会覆盖全局配置。

4.2 使用 Axios 实例进行配置

步骤

  1. 创建一个 Axios 实例,并在实例中设置 timeout
  2. 使用该实例发送请求,确保所有请求都应用相同的超时设置。

示例

const axiosInstance = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 5000, // 5秒超时
  headers: { 'X-Custom-Header': 'foobar' }
});

axiosInstance.get('/user/12345')
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    if (error.code === 'ECONNABORTED') {
      console.error('请求超时!');
    } else {
      console.error('请求失败:', error.message);
    }
  });

4.3 实现自动重试机制

步骤

  1. 当请求超时时,自动尝试重新发送请求。
  2. 设置最大重试次数,防止无限重试。

示例

function axiosWithRetry(url, options, retries = 3) {
  return axios.get(url, options).catch(error => {
    if (retries > 0 && error.code === 'ECONNABORTED') {
      console.warn(`请求超时,正在重试... 剩余重试次数:${retries}`);
      return axiosWithRetry(url, options, retries - 1);
    }
    return Promise.reject(error);
  });
}

axiosWithRetry('/user/12345', { timeout: 5000 })
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    if (error.code === 'ECONNABORTED') {
      console.error('请求超时,所有重试均失败!');
    } else {
      console.error('请求失败:', error.message);
    }
  });

4.4 结合使用其他超时方法

步骤

  1. Axiostimeout 基础上,使用 AbortController 来实现更细粒度的超时控制。
  2. 适用于现代浏览器和 Node.js 环境。

示例

const controller = new AbortController();
const timeout = setTimeout(() => {
  controller.abort();
}, 5000); // 5秒超时

axios.get('/user/12345', {
  signal: controller.signal
})
.then(response => {
  clearTimeout(timeout);
  console.log(response.data);
})
.catch(error => {
  if (axios.isCancel(error)) {
    console.error('请求被取消:', error.message);
  } else {
    console.error('请求失败:', error.message);
  }
});

4.5 检查和优化拦截器逻辑

步骤

  1. 仔细检查请求和响应拦截器,确保它们不会无意中延迟请求或阻止超时行为。
  2. 在拦截器中处理错误时,确保不覆盖或忽略超时错误。

示例

// 请求拦截器
axios.interceptors.request.use(config => {
  // 添加自定义逻辑
  return config;
}, error => {
  return Promise.reject(error);
});

// 响应拦截器
axios.interceptors.response.use(response => {
  // 添加自定义逻辑
  return response;
}, error => {
  // 确保超时错误被正确传递
  if (error.code === 'ECONNABORTED') {
    console.error('请求超时!');
  }
  return Promise.reject(error);
});

4.6 更新 Axios 和相关依赖

步骤

  1. 确保使用的是 Axios 的最新稳定版本,修复已知的超时问题。
  2. 更新其他相关依赖库,确保它们与 Axios 兼容。

命令

npm install axios@latest

4.7 避免在代理或中间件中拦截超时设置

原因描述:某些代理服务器或中间件可能会修改请求或响应,影响 Axios 的超时行为。

解决方案

  • 检查并配置代理服务器,确保其不会无故延迟或修改请求和响应。
  • 在本地开发环境中,尽量减少使用代理或中间件,确认问题是否由它们引起。

5. 示例实现

5.1 基本超时设置

代码示例

axios.get('https://api.example.com/data', {
  timeout: 5000 // 5秒超时
})
.then(response => {
  console.log('数据接收成功:', response.data);
})
.catch(error => {
  if (error.code === 'ECONNABORTED') {
    console.error('请求超时!');
  } else {
    console.error('请求失败:', error.message);
  }
});

5.2 使用 Axios 实例

代码示例

const axiosInstance = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 7000, // 7秒超时
  headers: { 'X-Custom-Header': 'foobar' }
});

axiosInstance.get('/data')
  .then(response => {
    console.log('数据接收成功:', response.data);
  })
  .catch(error => {
    if (error.code === 'ECONNABORTED') {
      console.error('请求超时!');
    } else {
      console.error('请求失败:', error.message);
    }
  });

5.3 自动重试机制

代码示例

function axiosWithRetry(url, options, retries = 2) {
  return axios.get(url, options).catch(error => {
    if (retries > 0 && error.code === 'ECONNABORTED') {
      console.warn(`请求超时,正在重试... 剩余重试次数:${retries}`);
      return axiosWithRetry(url, options, retries - 1);
    }
    return Promise.reject(error);
  });
}

axiosWithRetry('https://api.example.com/data', { timeout: 5000 })
  .then(response => {
    console.log('数据接收成功:', response.data);
  })
  .catch(error => {
    if (error.code === 'ECONNABORTED') {
      console.error('请求超时,所有重试均失败!');
    } else {
      console.error('请求失败:', error.message);
    }
  });

5.4 结合使用 AbortController

代码示例

const controller = new AbortController();
const timeoutId = setTimeout(() => {
  controller.abort();
}, 5000); // 5秒超时

axios.get('https://api.example.com/data', {
  signal: controller.signal
})
.then(response => {
  clearTimeout(timeoutId);
  console.log('数据接收成功:', response.data);
})
.catch(error => {
  if (axios.isCancel(error)) {
    console.error('请求被取消:', error.message);
  } else {
    console.error('请求失败:', error.message);
  }
});

5.5 清理拦截器

代码示例

// 添加拦截器
const requestInterceptor = axios.interceptors.request.use(config => {
  // 添加自定义逻辑
  return config;
}, error => {
  return Promise.reject(error);
});

const responseInterceptor = axios.interceptors.response.use(response => {
  // 添加自定义逻辑
  return response;
}, error => {
  if (error.code === 'ECONNABORTED') {
    console.error('请求超时!');
  }
  return Promise.reject(error);
});

// 移除拦截器
axios.interceptors.request.eject(requestInterceptor);
axios.interceptors.response.eject(responseInterceptor);

6. 高级优化建议

6.1 动态设置超时

场景:根据请求的性质或优先级,动态调整不同请求的超时时间。

代码示例

function fetchData(endpoint, isCritical = false) {
  const timeout = isCritical ? 10000 : 5000; // 关键请求超时 10秒,其他请求 5秒

  return axios.get(endpoint, { timeout })
    .then(response => response.data)
    .catch(error => {
      if (error.code === 'ECONNABORTED') {
        console.error(`请求 ${endpoint} 超时!`);
      } else {
        console.error(`请求 ${endpoint} 失败:`, error.message);
      }
      throw error;
    });
}

fetchData('/critical-data', true)
  .then(data => {
    console.log('关键数据接收成功:', data);
  })
  .catch(error => {
    // 处理错误
  });

6.2 使用自定义超时逻辑

场景:在 Axios 的基础上,结合自定义逻辑实现更复杂的超时控制,例如基于条件的超时取消。

代码示例

function fetchWithCustomTimeout(url, options, conditionFn, timeout = 5000) {
  const controller = new AbortController();
  const timeoutId = setTimeout(() => {
    controller.abort();
  }, timeout);

  return axios.get(url, {
    ...options,
    signal: controller.signal
  })
  .then(response => {
    clearTimeout(timeoutId);
    if (conditionFn(response.data)) {
      return response.data;
    } else {
      throw new Error('条件不满足');
    }
  })
  .catch(error => {
    clearTimeout(timeoutId);
    throw error;
  });
}

fetchWithCustomTimeout(
  '/data',
  {},
  data => data.isValid === true,
  7000 // 7秒超时
)
.then(data => {
  console.log('数据接收成功且条件满足:', data);
})
.catch(error => {
  if (error.code === 'ECONNABORTED') {
    console.error('请求超时!');
  } else {
    console.error('请求失败或条件不满足:', error.message);
  }
});

6.3 集成重试库

场景:使用第三方重试库(如 axios-retry)实现更智能的重试机制,包括指数退避和错误过滤。

代码示例

import axios from 'axios';
import axiosRetry from 'axios-retry';

// 配置 Axios 重试
axiosRetry(axios, {
  retries: 3, // 最大重试次数
  retryDelay: (retryCount) => {
    return retryCount * 1000; // 每次重试延迟增加
  },
  retryCondition: (error) => {
    // 只在超时或网络错误时重试
    return axiosRetry.isNetworkOrIdempotentRequestError(error) || error.code === 'ECONNABORTED';
  },
});

// 发起请求
axios.get('https://api.example.com/data', { timeout: 5000 })
  .then(response => {
    console.log('数据接收成功:', response.data);
  })
  .catch(error => {
    if (error.code === 'ECONNABORTED') {
      console.error('请求超时,所有重试均失败!');
    } else {
      console.error('请求失败:', error.message);
    }
  });

6.4 结合使用 Web Workers

场景:在处理大量数据或复杂计算时,使用 Web Workers 将超时检测逻辑从主线程分离,避免阻塞 UI。

代码示例

// worker.js
self.onmessage = function(e) {
  const { url, timeout } = e.data;
  
  fetch(url)
    .then(response => response.json())
    .then(data => {
      self.postMessage({ status: 'success', data });
    })
    .catch(error => {
      self.postMessage({ status: 'error', error: error.message });
    });

  // 超时处理
  setTimeout(() => {
    self.postMessage({ status: 'timeout' });
  }, timeout);
};

// main.js
const worker = new Worker('worker.js');

worker.postMessage({ url: 'https://api.example.com/data', timeout: 5000 });

worker.onmessage = function(e) {
  const { status, data, error } = e.data;
  
  if (status === 'success') {
    console.log('数据接收成功:', data);
  } else if (status === 'timeout') {
    console.error('请求超时!');
  } else if (status === 'error') {
    console.error('请求失败:', error);
  }
};

7. 总结

Axios 的超时设置是确保应用在网络不稳定或服务器响应缓慢时保持健壮性的关键配置。然而,若超时设置无效,可能会导致请求无限等待或错误处理不当,从而影响用户体验。通过理解 Axios 超时机制的工作原理,识别常见的配置和环境问题,并采用适当的解决方案和最佳实践,开发者可以有效地配置和调试 Axios 的超时行为。

关键措施包括

  • 正确配置超时选项:确保 timeout 设置在正确的位置,并以毫秒为单位。
  • 使用 Axios 实例:集中管理配置,避免配置遗漏。
  • 实现自动重试机制:提高请求的鲁棒性,处理偶发的网络问题。
  • 结合使用其他超时方法:如 AbortController,实现更细粒度的控制。
  • 优化拦截器逻辑:确保拦截器不会干扰超时行为。
  • 更新 Axios 和相关依赖:保持使用最新的稳定版本,避免已知的兼容性问题。
  • 避免代理或中间件干扰:确保网络环境支持 Axios 的超时设置。
  • 监控和调试:使用开发者工具和日志,实时监控请求的超时行为,及时发现和解决问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/905705.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

不懂知识图谱的你,正在失去转行做AI产品经理的机会

伴随着AI这块新的投资风口,新兴企业对AI人才的需求也是激增。所以,你准备好了么? 一、AI来了,你被OUT了,有人却已在快车道上了 给你讲个恐怖的故事:我今年,32岁了!三十岁左右是一生…

Generating /run/initramfs/rdsosreport.txt

Linux中遇到Generating /run/initramfs/rdsosreport.txt 第一步:首先输入 ls /dev/mapper 第二步:输入 xfs_repair /dev/mapper/centos-root -L 第三步:重启reboot 不说原因了,直接上解决方式: 第一步:首先…

纯CSS实现UI设计中常见的丝带效果(5)

原文传送门:纯CSS实现UI设计中常见的丝带效果 网页中的丝带效果在设计中扮演着多重角色,其作用可以归纳为以下几个方面: 视觉吸引与装饰 增强视觉吸引力:丝带效果以其独特的形态和色彩,能够迅速吸引用户的注意力&…

OpenCV系列教程六:信用卡数字识别、人脸检测、车牌/答题卡识别、OCR

文章目录 一、信用卡数字识别1.1 模板匹配1.2 匹配多个对象1.3 处理数字模板1.4 预处理卡片信息,得到4组数字块。1.5 遍历数字块,将卡片中每个数字与模板数字进行匹配 二、人脸检测2.1人脸检测算法原理2.2 OpenCV中的人脸检测流程 三、车牌识别3.1 安装t…

音视频入门基础:FLV专题(21)——FFmpeg源码中,获取FLV文件音频信息的实现(上)

由于本文篇幅较长,分为上、中、下三篇。 一、引言 通过FFmpeg命令可以获取到FLV文件的音频压缩编码格式、音频采样率、通道数、音频码率信息: ./ffmpeg -i XXX.flv 而由《音视频入门基础:FLV专题(9)——Script Tag简…

深度学习之降维和聚类

1 降维和聚类 1.1 图解为什么会产生维数灾难 ​ 假如数据集包含10张照片,照片中包含三角形和圆两种形状。现在来设计一个分类器进行训练,让这个分类器对其他的照片进行正确分类(假设三角形和圆的总数是无限大),简单的…

什么是 L0、L1、L2 和 L3 区块链层以及为什么需要它们

区块链的 L 层越来越多地出现在新闻中(例如,A16z 投资基金正在投资以太坊Optimism上的 L2 解决方案,或者 Orbs 的 L3 解决方案将其解决方案扩展到 TON 区块链)。 层的概念是区块链的一种分类,对于快速了解特定项目如何…

数据分析可视化:散点图矩阵与雷达图的生成

目录 一、经营数据绘制散点图矩阵1.代码解释2.代码说明3.注意事项 二、雷达图1.代码解释2.代码说明3. 注意事项4. 运行代码 总结 一、经营数据绘制散点图矩阵 import seaborn as sns import pandas as pd rc {font.sans-serif:Arial Unicode MS,axes.unicode_minus:False} sn…

硅谷甄选(9)SKU模块

SKU模块 8.1 SKU静态 <template><el-card><el-table border style"margin: 10px 0px"><el-table-column type"index" label"序号" width"80px"></el-table-column><el-table-columnlabel"名称…

ubuntu 异常 断电 日志 查看

sudo less /var/log/syslog 搜 Linux version

解决rabbitmq-plugins enable rabbitmq_delayed_message_exchange :plugins_not_found

问题&#xff1a;我是在docker-compose环境部署的 services:rabbitmq:image: rabbitmq:4.0-managementrestart: alwayscontainer_name: rabbitmqports:- 5672:5672- 15672:15672environment:RABBITMQ_DEFAULT_USER: rabbitRABBITMQ_DEFAULT_PASS: 123456volumes:- ./rabbitmq/…

HCIA(DHCP服务)

第三节 开启DHCP服务 创建地址池 调用全局服务 [R1]dhcp enable 开启DHCP服务 [R1]ip pool AA 创建地址池 [R1-ip-pool-AA]network 192.168.1.0 mask 24 写入网段 [R1-ip-pool-AA]gateway-list 192.168.1.1 写入网关 [R1-ip-pool-AA]dns-list 8.8.8.8 114.1…

GB/T 28046.2-2019 道路车辆 电气及电子设备的环境条件和试验 第2部分:电气负荷(6)

写在前面 本系列文章主要讲解道路车辆电气及电子设备的环境条件和试验GB/T 28046标准的相关知识&#xff0c;希望能帮助更多的同学认识和了解GB/T 28046标准。 若有相关问题&#xff0c;欢迎评论沟通&#xff0c;共同进步。(*^▽^*) 第2部分&#xff1a;电气负荷 附录C C.5…

ES8388 —— 带耳机放大器的低功耗立体声音频编解码器(3)

接前一篇文章&#xff1a;ES8388 —— 带耳机放大器的低功耗立体声音频编解码器&#xff08;2&#xff09; 二、详细描述 4. 时钟模式和采样频率 根据输入的串行音频数据采样频率&#xff0c;ES8388可以在两种速度模式下工作&#xff1a;单速或双速。表1列出了这两种模式下的…

ChatGPT 高级语音模式已登陆 Windows 和 Mac 平台,对话更自然

OpenAI ChatGPT 高级语音模式已登陆 Windows 和 Mac 平台&#xff0c;对话更自然&#xff0c;拟态更逼真 OpenAI 于10月31日正式宣布&#xff0c;ChatGPT 的高级语音模式&#xff08;Advanced Voice Mode&#xff0c;简称 AVM&#xff09;现已登陆 Windows 和 Mac 平台。基于最…

鸿道Intewell操作系统架构介绍之Intewell-Hyper I 虚拟化构型

鸿道Intewell-Hyper I 虚拟化构型是鸿道Intewell-V虚拟化架构下的构型体系&#xff01;鸿道Intewell-V是科东软件自主研发的实时虚拟化操作系统&#xff0c;包括鸿道Intewell-Hyper I 和鸿道Intewell-Hyper II。鸿道Intewell-V可以实现多个操作系统在同一物理硬件上并行运行&am…

Redis高级篇之bigKey理论介绍以及优化

文章目录 0 前言1.MoreKey案例2.BigKey案例2.1多大算BigKey2.1.1 string和二级结构2.2 Bigkey危害、产生与发现2.2.1 bigkey的危害2.2.2 如何产生2.2.3 如何发现 2.2.4 大key如何删除3.BigKey生产调优3.1 redis.conf配置文件 LAZY FREEING相关说明 结语 0 前言 bigKey是面试经常…

云计算平台上的DevOps实践

文章目录 什么是DevOps云计算平台上的DevOps优势自动化部署弹性伸缩地理分布 实施DevOps的关键组件版本控制系统持续集成/持续交付工具配置管理工具监控和日志管理 实践案例使用AWS CodePipeline进行持续集成/持续交付利用AWS Auto Scaling实现弹性使用AWS CloudFormation进行基…

【小白学机器学习29】 概率统计与图形 ( hist, bar, pie , box ,scatter ,line)

目录 1 频度/次数 1.1 频度统计表&#xff1a;频度分布表 1.2 频数分布图直方图 histogram / hist 1.3 对比&#xff0c;柱状图 bar graph /column chart 2 饼图 pie chart 2.1饼图特点 3 南丁格尔玫瑰图 4 茎叶图 stem-and-leaf display 5 箱型图 box plot 6 …

Zookeeper分布式锁实现

1、zk分布式锁的实现原理 Zookeeper 就是使用临时顺序节点特性实现分布式锁的&#xff0c;官网。 获取锁过程 &#xff08;创建临时节点&#xff0c;检查序号最小&#xff09;释放锁 &#xff08;删除临时节点&#xff0c;监听通知&#xff09; 1_获取锁过程 1、当第一个客…