热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

线上问题:由于CDNcache导致的小程序用户信息串号的问题回顾

CDNcache引起的小程序用户信息错乱的线上问题汇总问题描述在某个小程序中,高频请求场景下会导致用户登陆后出现串号的情况,即我自己的账号登陆显示别人的信息,问题严重影响到线上的用






CDN cache 引起的小程序用户信息错乱的线上问题汇总


问题描述

在某个小程序中,高频请求场景下会导致用户登陆后出现串号的情况,即我自己的账号登陆显示别人的信息,问题严重影响到线上的用户体验,下面讲一下我们这次心酸的排故之旅!
故障现象1:我们通过多个测试号的故障复现进行分析,发现每次出现错乱账号的信息大部分都是同一个人的信息,而且时间点都集中在晚上功能高频使用的时间段
故障现象2:通过后台日志分析,每次出现串号现象之前,串号的人的请求日志必现,却在故障发生后,发生的过程中,查不到该用户相关的请求信息(奇怪)
故障现象3:通过postman请求用户信息接口,同样出现真机模拟的串号问题

问题代码

@ApiOperation(value = "获取当前用户信息", httpMethod = "GET")
@GetMapping
public ConsumerUserRepresentation getUserInfo() {
return consumerUserApplicationService.getUserInfo();
}

问题思考

根据现象1推测:有可能是高并发引起的接口调用数据错乱
解决方式:在用户信息接口上我们添加了并发锁,尝试阻止并发请求,但是问题依旧。。。
根据现象2推测:有可能是没有通过后台返回数据,而直接查询缓存,但是后台代码并没有设置缓存机制,那么问题来了,如果是命中缓存,缓存数据从何而来???
根据现象3推测:排除是前端缓存原因导致的串号

问题解决

通过各种尝试,排除法,最终我们定位到缓存的来源---CDN cache 下面是postman模拟请求的数据对比:

X-Cache-Lookup:Hit From MemCache 表示命中CDN节点的内存
X-Cache-Lookup:Hit From Disktank 表示命中CDN节点的磁盘
X-Cache-Lookup:Hit From Upstream 表示没有命中CDN
未命中缓存,正常请求
![未命中CDN cache 走回源,请求接口]

命中缓存,取缓存数据,数据错乱
![命中CDN cache 数据发生错乱]

通过postman我们可以看到,正常数据和异常数据的请求头中标识了是否命中CDN cahce的标签,通过对比,我们最终判断出是通过CDN cache取到的缓存数据,那么请求什么会走cache,什么时候走cache,什么时候回源请求接口呢?以下是关于CDN cache的讨论,在此不做赘述。附上链接如下:
CDN概述
genie88.github.io/2015/11/03/talk-a...
CDN加速原理
www.huaweicloud.com/zhishi/cdn001....


修复

前端请求设置header,绕过缓存,回源




推荐阅读
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 在深入掌握Spring框架的事务管理之前,了解其背后的数据库事务基础至关重要。Spring的事务管理功能虽然强大且灵活,但其核心依赖于数据库自身的事务处理机制。因此,熟悉数据库事务的基本概念和特性是必不可少的。这包括事务的ACID属性、隔离级别以及常见的事务管理策略等。通过这些基础知识的学习,可以更好地理解和应用Spring中的事务管理配置。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 本文深入解析了Java 8并发编程中的`AtomicInteger`类,详细探讨了其源码实现和应用场景。`AtomicInteger`通过硬件级别的原子操作,确保了整型变量在多线程环境下的安全性和高效性,避免了传统加锁方式带来的性能开销。文章不仅剖析了`AtomicInteger`的内部机制,还结合实际案例展示了其在并发编程中的优势和使用技巧。 ... [详细]
  • 为何Serverless将成为未来十年的主导技术领域?
    为何Serverless将成为未来十年的主导技术领域? ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 深入解析 Synchronized 锁的升级机制及其在并发编程中的应用
    深入解析 Synchronized 锁的升级机制及其在并发编程中的应用 ... [详细]
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • JSDB.io是一个JavaScript库的鸠合网站,网络分类了数百个最好的JavaScript库,将Github中大部份JavaScript库都整顿到了一个网站中,便于Web开发 ... [详细]
author-avatar
古涵生
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有