技术
Go Error最佳实践
在Go项目中,错误error的管理非常重要,如何处理好error值,如何正确打印error,如何将接口error合适地返回给前端,这些都是需要思考和设计的。本文想聊一聊Go error记录的实践,值得讨论的点有: error如何合理记录。很多时候,我们都是在每一层接口调用时判断error并每一层打印...
2024-12-17
异步任务处理框架设计
Read More
我们的产品添加了一个需求:用户通过手机采集了自己的脑电数据,我们产品提供脑电分析的功能,分析完成后,会在手机APP中展示分析后的结果。部分分析结果如下图所示: 这个功能的实现需要多个流程组合完成: 手机App采集到脑电数据,存储为edf文件 App将edf文件传输到核心云平台存储,存储于OSS 脑电...
2024-12-12
大型项目管理经验分享
Read More
最近在看《SRE Google运维解密》这本书,里面谈到了很多谷歌项目中的软件项目管理的经验和方法论,这些理论在我经历过的项目基本都有过具体实践,因此这本书阅读起来有种相见恨晚的感觉。本文会结合我在QQ音乐、全民K歌、梦幻端游这些大型成熟项目工作中积累的一些实际案例和经验,对比着《SRE Googl...
2024-11-27
HTTPS下的安全传输
Read More
在软件架构设计中,系统安全是一个很大且很重要的话题。我们聊到的架构安全,至少包含以下问题的解决方案: 认证:系统如何正确分辨操作用户的真实身份? 授权:系统如何控制用户能进行哪些操作? 凭证:系统如何保证它和用户之间的承诺是准确的、完整且不可抵赖的? 保密:系统如何保证内部敏感数据无法被窃取和滥用?...
2024-10-17
Rancher异常排查和解决(cattle-cluster-agent内存泄漏)
Read More
现象 近期部署新服务时,经常导致一些节点因为内存爆炸直接挂掉,导致很多部署在该节点的Pod重启,影响较大,而且近期频繁出现。当前rancher版本为v2.7.3。 排查 我们通过Prometheus排查相关node,pod的资源使用情况,首先排除了导致node挂掉的不是我们新部署的服务,因为新部署的...
2024-09-29
服务容错策略
Read More
容错性设计是架构设计中的一个核心原则,在微服务框架下,调用链路复杂导致,一旦某一个服务崩溃了,导致所有使用到这个服务的其他服务都会无法正常工作,一个点的错误经过层层传递,最终会波及调用链上的与此相关的所有服务。因此,服务容错性设计在架构设计中就显得十分重要了。 容错策略 常见的容错策略有以下几种: ...
2024-09-05
跨域问题
Read More
跨域问题在Web开发过程中很常见,如果浏览器没有同源策略来约束跨域请求,那么整个web安全将得不到保证。本文从跨域请求的安全性分析、浏览器同源策略、CORS处理跨域问题三个方面来谈谈web开发中的跨域问题。 跨域是什么 需要明确一点,跨域问题针对浏览器的,这是浏览器施加的安全限制。浏览器由于同源策略...
2024-08-14
身份认证技术之2FA、TOTP、WebAuthn
Read More
大家有时候会混淆认证和授权两者的在系统的里的作用,他们的职责是这样的:认证(Authencitation)解决了系统回答用户“你是谁”的问题,而授权(Authorization)回答了用户“你能干什么”的问题。“用户登录”这个最基本的操作就是一个身份认证的问题,通过系统认证之后,用户对系统发起的请求...
2024-08-09
基于全球加速GA的跨境业务加速方案
Read More
我们国内的产品需要分销到海外,因此有不少位于美国的用户会访问使用我们的接口。经过测试,美国用户请求我们的接口(我们的服务器部署在国内)会有高达3秒的延时,这对于产品的使用来说完全不能接受。为了解决这个问题,我们提出了两个方案来解决: 使用AWS在美国重新搭建一套服务器集群,美国的用户的请求都会请求到...
2024-08-01
接口幂等性和ABA问题
Read More
考虑以下这个真实场景:用户在浏览器页面点击“提交订单”按钮,浏览器向订单系统发送一条创建订单的请求,订单系统收到请求后向数据库插入一条新订单信息,此时订单创建成功。假设用户在点击“提交订单”时不小心点击了几次,结果是会创建多个订单吗?那必然不会。其实即使用户没有多次点击提交订单,接口重复调用的情况还...
2024-07-18
从安全角度下看用户密码管理
Read More
用户密码是一个烫手的山芋,如何处理这个东西确实很费脑筋。当用户在你的产品注册时,他的密码你就有责任保护好,但是,用户每次登录时都会用到密码,此时密码这个危险的东西就会在客户端、网络、服务器三方之间流动,我们怎么能保证密码在频繁的传递中不会被泄露呢? 我们在设计用户注册登录系统时,有几个基本共识是要有...
2024-06-15
fftw非线程安全的一些解决思路
Read More
实际工程中要用到快速傅里叶变换fft,我们一般会使用知名的fft库FFTW,因为FFTW在计算性能和稳定性上都有很大的优势,以下是fft库的benchmark: 从性能测试的结果来看,fftw3这个库性能非常好,遥遥领先其他fft库,所以也是最受欢迎的fft库。但是fftw有个很致命的缺点:非线程安...
2024-05-08
异构计算中的流水线调度
Read More
我们理解一下使用流水线调度比不用流水线调度能高多少效率。 在计算机结构体系上,如果我们的计算任务都是用CPU进行计算,那么怎么样的效率最高?让每个CPU都专门做好自己那块计算就好,减少CPU切换,直接做好一件事再做一件事。假如一个任务包含三个子任务(预处理、计算、后处理),要高效地完成一次任务,那么...
2024-02-03
查证主键设置UUID导致insert慢的问题
Read More
我们这边有个登录接口,在压测下表现不是很好,压测结果有时高有时低。听压测的同事反馈,有个奇怪的现象:偶尔慢一会,然后过一会又会上去,压测的结果就好像画门一样,高一段,然后低一段,最高可以去到300/s,最低去到100/s。 基于这个现象,开始排查具体的卡顿点,大概率猜测是数据库相关操作导致了这个登录...
2024-01-30
大文件分块上传和断点续传
Read More
方案介绍 分块上传流程讲解: 客户端根据文件大下判断是否需要切片,建议是大于1M的文件,都可以走切片上传。 假设文件大小是180MB,那么前端将文件切为180MB/1MB=180个切片,并对这些切片进行编号,0-179。 调用上传预准备接口,带上参数:完整文件的md5。 服务器根据md5查询文件数据...
2023-12-06
缓存一致性的探讨
Read More
缓存一致性是分布式系统中一个常见的问题,根据业务场景的不同,我们针对这个问题会有不同的技术方案。缓存一致性问题指的是数据库(MySQL或者Mongodb等)和分布式缓存(Redis)的数据一致问题,在互联网后台中,Redis作为缓存组件会存储DB的数据,我们的服务请求数据时首先从Redis上取,如果...
2023-07-26
goroutine调度原理
Read More
goroutine即Go中的协程,是Go语言最大的特色之一,这篇文章将介绍goroutine的调度原理。 协程相对于线程的优势 协程可以理解为一种轻量级线程,与线程相比,协程不受操作系统的调度,其调度由用户层管理,即运行在用户态的Go协程调度器负责协程调度。线程虽说已经很轻量级,但是其有一个重大的缺...
2023-06-16
OAuth2.0授权码模式详解
Read More
OAuth 2.0一词中的“Auth“表示“授权Authorization,字母 “O” 表示 “开放Open”,连在一起就表示“开放授权”。这也是为什么我们使用OAuth的场景,通常发生在开放平台的环境下。 OAuth 2.0提供了4种模式: 资源拥有者凭据许可(Resource Owner Pa...
2023-03-01
网络游戏的移动和视野管理
Read More
移动的管理 网络游戏中,玩家的移动涉及到数据同步的问题,也就是说,客户端A的玩家角色移动时,客户端会向服务器上传一个走路包,服务器收到这个走路包后,会对本次玩家移动进行校验,比如校验一下本次移动的距离是否合理、是否遇到阻挡点或者处于限制状态导致不能移动等,如果校验通过则把把玩家A的新坐标存储起来,并...
2022-11-25
游戏网络同步算法
Read More
网络同步是网络游戏中一个重要的技术问题,这里先给出一个学术性的定义:同步是指两个或两个以上随时间变化的量的变化过程中保持一定的相对关系。 下面以一个游戏例子来解释网络同步的作用: 假设游戏中A,B两个玩家移动,并同时向对方发出射击指令,如果没有合适的同步机制, 那么可能出现的情况有: A屏幕显示B已...
2022-10-20
游戏在弱网下的网络时延优化
Read More
游戏在弱网情况下会变得体验很差,玩家的直观感受就是我的操作怎么没有反应,整个游戏世界都是一卡一顿的。这个就是因为网络问题导致了游戏体验变差。 那什么是弱网环境?弱网环境就是指网络不好的环境,尤其是移动网络下,因为移动网络下,我们经常会进出电梯或者去到一些信号不好的区域,又或者wifi和移动网络处于切...
2022-10-05
游戏版本分支管理策略
Read More
我们游戏团队使用gitlab作为代码仓库,采取git来做分支版本管理,我们采用Git Flow来进行分支管理和版本管理。 我们游戏约定每周二8点会进行全服关机维护,维护时间一般为1小时,在维护期间内会进行关服、代码分支切换、数据检查备份、移服合服等工作。维护期间很重要的一个内容就是代码分支切换,把本...
2022-02-19
OOM Killer机制分析
Read More
近日上班工作群有人说,隔壁游戏组突然一连挂了好几台服务器,很突然暂时没分析出宕机的原因。确实很诡异,因为服务器接连挂掉的情况并不常见。我们组一下子也紧张起来,因为我们两个组用的是同一个游戏服务器引擎,隔壁出事了,也预示着我们也有类似的风险。不过没多久,隔壁组宕机的原因定位到了,有位开发在执行扫档脚本...
2021-06-28
谈谈socket缓冲区
Read More
每个socket被创建后,无论使用的是TCP协议还是UDP协议,都会创建自己的接收缓冲区和发送缓冲区。当我们调用write()/send() 向网络发送数据时,系统并不会 马上向网络传输数据,而是首先将数据拷贝到发送缓冲区,由系统负责择时发送数据。根据我们选用的网络协议以及阻塞模式,系统会有不同的处...
2021-06-27
网络性能优化策略
Read More
Linux网络性能优化实际优化的是Linux内核或者系统调用的几个参数,我们可以从应用程序、套接字、传输层、网络层以及链路层等几个角度,分别来看网络性能优化的基本思路。 网络性能指标 带宽:带宽,表示链路的最大传输速率,单位通常为 b/s (比特/秒)。 吞吐量:表示单位时间内成功传输的数据量,单位...
2021-06-25
系统的惰性分配和overcommit
Read More
Linux下的内存管理其实都绕不开文章题目的4个词语:缺页、swap、惰性分配和overcommit,而操作系统的内存管理的难点在于: 物理内存不够该怎么做? 内存分配怎么才能做到高效? 本文想谈的是,内存不足时Linux操作系统是怎么高效分配内存资源的。 Linux 内核给每个进程都提供了一个独立...
2021-05-22
Read More