极验高并发验证服务背后的技术实现

极验目前的用户超过7万家网站,日均验证量1亿次,作为一家专注于验证安全服务的公司,极验所要面临的并发压力主要表现在以下几点:

  1. 日益增加的用户并发量。
  1. 验证请求是全动态过程,不能够进行缓存。
  1. 每一次请求都会造成数据库的读写。
  1. 处理请求需要耗费CPU大量的时间进行模型的计算。
  1. 作为抗击黑产的第一线,可能遭到黑产的攻击。

那么极验是如何做到,既保证用户的验证需求量,又尽量快速响应用户的验证请求,还能够扛得住黑产的攻击呢?极验主要从三个方面来解决高并发问题。

降低并发的开销

利用协程处理并发,我们熟知的协程相较于线程来说具有的优点是,能够跨平台跨体系架构,不需要线程上下文切换和原子操作锁定及同步的开销。这样就避免了操作系统调度线程造成的资源浪费。同时协程方便切换控制流,能够简化编程模型,避免异步回调代码的逻辑分割,使得程序的可读性好,有利于后台的维护。像极验这样高并发量同时需要高扩展性的验证服务企业来说,使用协程处理是降低并发开销最合适的方法。

  • 代码示例

其次极验利用OpenResty过滤非法请求,以及限制不同账户并发。OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了比较精良的 Lua 库、第三方模块以及大多数的依赖项。能够比较便捷地搭建处理超高并发、高扩展性的动态 Web 服务。

提升数据库性能

极验主要通过两个手段来提升数据库的性能:验证的临时数据采用基于分布式Redis和构建嵌入式数据库缓存,实现数据库零查询。

Proxy的Redis存储可能是目前比较常规的存储方法,通过代理将读写压力进行合理分配。codis-proxy基于GO和C语言,并发处理能力比较强。后端基于slot概念支持灵活,还具有对用户透明的扩容和缩容操作,简单便捷,集群管理工具丰富等优势。

但是对于极验来说这样的方式并不是那么合适,存在着以下几点极验必须要考虑的问题。

  1. 使用代理使得整个结构多了一层不安全因素,一旦代理层出现问题,那么后面的都无法正常运转。
  1. 代理本身并不具备良好的扩展性,无法自动的进行分配,在运维上有一定的难度。
  1. 加入代理层也会使得整个结构的响应速度相应减慢。

考虑到这些问题,我们选择采用自己的基于客户端的分布式解决方案,结构如下。

客户端通过一致性hash,写入当前机器与hash环上的下一台机器,实现数据冗余。读取时从当前机器读取,失败则从hash环上下一台机器读取。得益于相对简单的结构,扩容、故障恢复速度会快得多,同时运维成本更低。

在高并发量的情况下,数据库往往成为瓶颈,加上大量挂起等待的协程也会使得数据库的性能大大降低。像极验这样每天有大量的验证数据需要读取,提升数据库性能就显得十分重要。我们的解决方案是进行嵌入式缓存,所有查询完全遵循缓存中的数据,缓存定期与数据库同步。同时缓存直接嵌入服务进程内,实现几乎零开销查询。由于Python的GIL存在,我们利用mmap实现进程间共享内存。

我们在实现这个嵌入式缓存的过程中,完全按照我们业务中遇到的实际问题进行设计,所以可能对于其他业务不是很适用。具体来说,极验的数据库查询主要有三种特性:1.数据几乎只读不写,并且对于数据一致性要求不高。2.数据库查询开销相对计算逻辑比重较大。3.接口并发数长期保持在较高水平,用传统缓存方式的话一旦缓存被穿透(例如恶意伪造不存在的数据)系统将崩溃。基于上面三点特性,我们专门定制了最适合我们自己的缓存,并使得数据库完全不再是系统的瓶颈。

提高计算性能

提高计算性能极验主要采用以下两种方式:

主要性能消耗在数据处理逻辑以及神经网络参数计算

  • 利用Cython将计算密集代码编译成扩展模块供Python调用

  • 控制神经网络规模,同时优化计算效率

通过不断调整神经网络的参数和加大训练的迭代次数来保证足够精度下网络规模最小。

在预测时加入DropOut,让部分神经元不参与计算,减少计算量的同时一定程度避免过拟合。

利用小网络学习大网络所提取到的特征加上现代Cpu的SIMD指令集加速计算——使用优化过的Blas库例如OpenBlas等。这样一来,能够很好的控制神经网络的规模。

极验通过以上三个技术手段,来解决高并发问题。目前我们使用不到二十台阿里云服务器的情况下可以做到5w的并发,并且整个架构可以完全快速横向扩展。

时间: 2024-08-01 15:36:00

极验高并发验证服务背后的技术实现的相关文章

转---高并发Web服务的演变——节约系统内存和CPU

[问底]徐汉彬:高并发Web服务的演变——节约系统内存和CPU 发表于22小时前| 4223次阅读| 来源CSDN| 22 条评论| 作者徐汉彬 问底Web服务内存CPU并发徐汉彬 摘要:现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战.一味地通过增加机器来解决并发量的增长,成本是非常高昂的.结合技术优化方案,才是更有效的解决方法. [导读] 徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作,负责过日请求量过亿的Web系统升级与重构,目前在小

高并发Web服务的演变:节约系统内存和CPU

一.越来越多的并发连接数 现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战.以最简单粗暴的方式解决,就是增加Web系统的机器和升级硬件配置.虽然现在的硬件越来越便宜,但是一味地通过增加机器来解决并发量的增长,成本是非常高昂的.结合技术优化方案,才是更有效的解决方法. 并发连接数为什么呈指数增长?实际上,从这几年的用户基数上看,这个数量并没有出现指数增长,因此它并非主要原因.主要原因,还是web变得更复杂,交互更丰富所导致的. 1. 页面元素增

高并发WEB服务的演变

一.越来越多的并发连接数 现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战.以最简单粗暴的方式解决,就是增加 Web系统的机器和升级硬件配置.虽然现在的硬件越来越便宜,但是一味地通过增加机器来解决并发量的增长,成本是非常高昂的.结合技术优化方案,才是更有 效的解决方法. 并发连接数为什么呈指数增长?实际上,从这几年的用户基数上看,这个数量并没有出现指数增长,因此它并非主要原因.主要原因,还是web变得更复杂,交互更丰富所导致的. 1. 页面元

【问底】徐汉彬:高并发Web服务的演变——节约系统内存和CPU

摘要:现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战.一味地通过增加机器来解决并发量的增长,成本是非常高昂的.结合技术优化方案,才是更有效的解决方法. [导读] 徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作,负责过日请求量过亿的Web系统升级与重构,目前在小满科技创业,从事SaaS服务技术建设. 一.越来越多的并发连接数 现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战.以最简单粗暴

(转)高并发Web服务的演变——节约系统内存和CPU

一.越来越多的并发连接数 现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战.以最简单粗暴的方式解决,就是增加Web系统的机器和升级硬件配置.虽然现在的硬件越来越便宜,但是一味地通过增加机器来解决并发量的增长,成本是非常高昂的.结合技术优化方案,才是更有效的解决方法. 并发连接数为什么呈指数增长?实际上,从这几年的用户基数上看,这个数量并没有出现指数增长,因此它并非主要原因.主要原因,还是web变得更复杂,交互更丰富所导致的. 1. 页面元素增

luffy之极验短信验证(多条件登录)

多条件登录 JWT扩展的登录视图,在收到用户名与密码时,也是调用Django的认证系统中提供的authenticate()来检查用户名与密码是否正确. 我们可以通过修改Django认证系统的认证后端(主要是authenticate方法)来支持登录账号既可以是用户名也可以是手机号. 修改Django认证系统的认证后端需要继承django.contrib.auth.backends.ModelBackend,并重写authenticate方法. authenticate(self, request,

高并发Web服务的演变——节约系统内存和CPU

节约系统内存和CPU http://www.csdn.net/article/2015-02-12/2823952 Web系统大规模并发——电商秒杀与抢购 http://www.csdn.net/article/2014-11-28/2822858(曾经阿里电话面试和腾讯的后台开发都说过的问题,记住记住) 作者博客http://hansionxu.blog.163.com/blog/#m=0&t=1&c=fks_084075093082081069081085082095086082080

语言与语言的高并发底层设计

node.js.Scala.Clojure的高并发   程序始终是需要由 CPU 执行的,所以真正并行的计算程序数量不会超过 CPU 的核心数.那么,宣称的“高并发”是什么?所谓“高并发”通常是在讨论网络 I/O 的情况下出现的概念,通常而言,高并发意味着可以同时处理更多的网络请求数.提高网络请求并发量的方法是什么? 最基础的是使用 epoll / kqueue 代替 select / poll,在注册.获取事件的部分从 O(n) 的复杂度提高到 O(1) [1] .Node.js 应该是基于

高性能高并发服务器架构设计探究—以flamigo服务器代码为例

这篇文章我们将介绍服务器的开发,并从多个方面探究如何开发一款高性能高并发的服务器程序.所谓高性能就是服务器能流畅地处理各个客户端的连接并尽量低延迟地应答客户端的请求:所谓高并发,指的是服务器可以同时支持多的客户端连接,且这些客户端在连接期间内会不断与服务器有数据来往.这篇文章将从两个方面来介绍,一个是服务器的框架,即单个服务器程序的代码组织结构:另外一个是一组服务程序的如何组织与交互,即架构.注意:本文以下内容中的客户端是相对概念,指的是连接到当前讨论的服务程序的终端,所以这里的客户端既可能是我