一个很少遇到的网络状态码 -- 499

这篇具有很好参考价值的文章主要介绍了一个很少遇到的网络状态码 -- 499。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、问题背景

前段时间运维拦截到了一些 499 网络状态码报警,我对该问题进行了简单排查,本文对该状态码做简单的一个介绍。

二、问题探寻

2.1 问题探寻-过程

[499 - CLIENT CLOSED REQUEST] A non-standard status code introduced by nginx for the case when a client closes the connection while nginx is processing the request.

查阅得知,499 是 nginx 引入的非标准状态代码,用于在 nginx 服务器在处理请求时客户端关闭连接的情况。作为 4xx 开头状态码,表明的是这个请求的过程中是客户端发生了错误。

查阅代码得知,是在某个业务场景,用户点击的服务不同,需要调用接口查询价格,在查询价格的接口下存在这个错误报警。

一个很少遇到的网络状态码 -- 499

再切换服务的时候,在上一个请求接口没有返回前,发起新的接口请求并取消上一个请求,这个逻辑是符合预期的。(当然防抖要加上)

尽管在客户端侧只能看到一个被 cancel 的请求,但是这个请求在 nginx 拦截到的状态码是 499。

既然是符合预期的场景,那么其实不该告警,于是联系运维去掉关于该状态码低频状态下的告警。

2.1 问题探寻-取消 ajax 请求

顺便我们看看怎么取消 ajax 请求

const controller = new AbortController();

axios.get('/foo/bar', {
   signal: controller.signal
}).then(function(response) {
   //...
});
// cancel the request
controller.abort()
复制代码

自 v0.22 后 ajax 换成以上的方法,因此我也换成这种写法进行介绍。

把以上方法进行一些封装。

// cancel-request.js
import qs from 'qs'
export default class CancelRequest {
  constructor() {
    this.pendingRequest = new Map()
  }
  // 根据请求信息生成唯一标识 key
  geterateReqKey(config) {
    const { url, method, params, data } = config
    return [url, method, qs.stringify(params), qs.stringify(data)].join('&')
  }
  // 把当前请求信息添加到pendingRequest对象中
  addPendingRequest(config, CancelToken) {
  	if (!config.cancelDuplicated) return
    const requestKey = this.geterateReqKey(config)
    if (!config.signal) {
    	const controller = new AbortController()
    	
    	if (!this.pendingRequest.has(requestKey)) {
    		// 把请求取消方法作为 map 值存起来
    		this.pendingRequest.set(requestKey, controller)
    	}
    	config.signal = controller.signal
    }
  }
  // 检查是否存在重复请求,若存在则取消前一次请求
  removePendingRequest(config) {
  	if (!config.cancelDuplicated) return
    const requestKey = this.geterateReqKey(config)
    if (this.pendingRequest.has(requestKey)) {
      const controller = this.pendingRequest.get(requestKey)
      // 取消请求
      controller.abort()
      // 删除map中对应的属性
      this.removeRequestKey(config)
    }
  }
  // 从pendingRequest中删除对应的key
  removeRequestKey(config) {
    const requestKey = this.geterateReqKey(config)
    this.pendingRequest.delete(requestKey)
  }
}
复制代码
// request.js
import axios from 'axios';
import CancelRequest from './cancel-request.js'
// 实例化
let cancelRequest = new CancelRequest()
const instance = axios.create({
  // ...
});

// 请求拦截器
instance.interceptors.request.use(config => {
  // 在请求开始之前检查先前的请求,如果是重复请求,删除之前的
  cancelRequest.removePendingRequest(config);
  // 如果不存在就将当前请求添加到pendingRequest
  cancelRequest.addPendingRequest(config);
    return config;
}, err => {
    Promise.reject(err);
});
// 响应拦截器
instance.interceptors.response.use(res => {
  // 移除成功请求记录
    cancelRequest.removeRequestKey(res.config)
    return res.data;
}, err => {
  // 失败时也需要移除
    cancelRequest.removeRequestKey(err.config || {} )
    Promise.reject(err);
});
export default instance;
复制代码

我们将 cancelDuplicated 作为是否开启取消重复请求的开关,于是,在业务接口处,我们采用

import { request } from '@/utils/request'
export const exampleRequest = (params) => {
  return request('apicode', params,{
  	cancelDuplicated: true
  })
}
复制代码

就可以开启该配置。文章来源地址https://www.toymoban.com/news/detail-478104.html

到了这里,关于一个很少遇到的网络状态码 -- 499的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 遇到了一个跨域问题

    我的前端运行时 所在的端口是  localhost:7000, 后端所在的端口是 localhost:8080 我想 在前端像后端发送请求,获取数据。但是浏览器报错,因为不同源。 因此,解决方案如下: 在 Vue.js 应用程序中,你可以使用代理(Proxy)来解决跨域问题。代理允许你将请求发送到另一个域名

    2024年02月08日
    浏览(31)
  • 为什么网络安全缺口很大,招聘却很少?

    2020年我国网络空间安全人才数量缺口超过了140万,就业人数却只有10多万,缺口高达了93%。这里就有人会问了: 1、网络安全行业为什么这么缺人? 2、明明人才那么稀缺,为什么招聘时招安全的人员却没有那么多呢? 首先来回答第一个问题,从政策背景、市场需求、行业现

    2023年04月22日
    浏览(46)
  • 为什么网络安全缺口很大,而招聘却很少?

    2020年我国网络空间安全人才数量缺口超过了140万,就业人数却只有10多万,缺口高达了93%。这里就有人会问了: 1、网络安全行业为什么这么缺人? 2、明明人才那么稀缺,为什么招聘时招安全的人员却没有那么多呢? 首先来回答第一个问题,从政策背景、市场需求、行业现

    2023年04月14日
    浏览(75)
  • 为什么网络安全人口很稀缺,招聘人数却很少?

    2020年我国网络空间安全人才数量缺口超过了140万,就业人数却只有10多万,缺口高达了93%。这里就有人会问了: 1、网络安全行业为什么这么缺人? 2、明明人才那么稀缺,为什么招聘时招安全的人员却没有那么多呢? 首先来回答第一个问题,从政策背景、市场需求、行业现

    2024年02月08日
    浏览(47)
  • 部署Stable diffusion遇到的一个问题解决

    前两天自己在服务器上搞了一下stable diffusion,碰到过一个问题,当时搜了半天没找到好的方法,后来我想了下给解决了,觉得还是来记录一下,如果其他人也正巧遇到的话看到这个可以方便解决,当然,是对于linux环境下来说的,不过我觉得windows应该也一样通用 问题大概是

    2023年04月16日
    浏览(42)
  • 记一个有关 Vuetify 组件遇到的一些问题

    Vuetify 官网地址 所有Vuetify 组件 — Vuetify Combobox 组合框 — Vuetify   items数据使用对象数组时,默认选中的是整个对象,要对数据进行处理   variableList是一个对象数组,设置了item-value无效,需要在数据变化时实时取需要的字段值 Text field 输入框 — Vuetify 要实现下方文本框标题

    2024年01月16日
    浏览(40)
  • ForkJoinPool在生产环境中使用遇到的一个问题

    在我们的项目中有这么一个场景,需要消费 kafka 中的消息,并生成对应的工单数据。早些时候程序运行的好好的,但是有一天, 我们升级了容器的配置 ,结果导致部分消息无法消费。而消费者的代码是使用 CompletableFuture.runAsync(() - {while (true){ ..... }}) 来实现的。 即: 需要消

    2024年03月24日
    浏览(33)
  • Net6中遇到的一个很奇葩的问题

    先来看一段代码,是控制台应用程序 执行,然后在输出窗口得到 没毛病吧。 再来看第二段代码,是winform应用程序 其中Form1为新建的窗体类。除了VS自己生成的代码以外,我一个字符都没改。 执行,然后在输出窗口得到 并且,Form1窗口也没有正常弹出。 显然在第二次调用T

    2024年02月08日
    浏览(33)
  • geemap学习笔记049:下载Landsat数据时遇到的一个问题

    最近在下载Landsat 8 地面反射率数据(Surface Reflectance)时,遇到了一个问题,无论是使用 geemap.ee_export_image_to_drive() 函数还是 geemap.download_ee_image() 函数下载的数据,易康都打不开,显示 Error loading image data: Layer 0 of file G: data.tif has an unsupported data type. G: data.tif ,如下图。利用

    2024年01月17日
    浏览(34)
  • git:一个本地仓库绑定多个远程的方法以及遇到的问题

    绑定方法见知乎大佬:本地Git仓库关联多个远程仓库的两种方法 一般情况下,没人这么搞! 但是公司迁移git仓库阶段,xx云环境上的gitlab要有操作记录,不然影响整体评分,这就不得一个本地仓库关联了原来的仓库+新的xx云环境的仓库 我才用的是上述文章里的第二种方式:

    2024年02月09日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包