如何在发型不乱的前提下应对单日十亿计Web请求

本文介绍AppLovin如何构建能够高效处理大规模数据请求的基础设施。文章详细解释了他们如何利用自定义组件和技术堆栈实现成本效益极高的扩展,并保持系统的灵活性以适应快速变化的市场需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:http://developer.51cto.com/art/201502/464640.htm

就在不久之前,AppLovin移动广告平台的单一广告请求数量突破了200亿大关——相当于每一秒钟处理50万项事务——其如火如荼的发展态势帮助众多品牌在激励现有客户的同时、从市场中拉拢到了新的买家。那么AppLovin是如何打造出这样一套有能力应对数百亿请求、但又无需对硬件及运维人员进行显著扩张的基础设施的呢?

在今天的文章中,我们将共同了解该公司如何发现并选择采用各类最佳实践,从而通过技术堆栈进化实现业务规模拓展。

极具成本效率的扩展思路

让我们首先从规模谈起。对于我们这些在AppLovin工作的家伙来说,极具成本效率的规模扩展方案意味着能够在大幅提升负载处理能力的同时、避免硬件或者人员的线性增长。如果我们只能通过采购双倍的服务器设备或者将人员数量提高一倍来实现请求处理能力倍增,那么这样的方案根本没什么实际意义。由于我们在构建基础设施时充分考虑到效率拓展需求,因此才能够在过去一年中将服务器的请求处理数量增加到此前的二十倍。

 

 

另一项值得注意的重点在于,对于大规模分布式系统而言,市面上并没有现成的解决方案可供借鉴。这类系统的构建工作必须使用自定义组件。无论归属于哪个行业,技术团队在建立分布式系统时都需要对选定的组件进行认真评估。除此之外,每一次出现工作负载爆炸式增长的时候,这些组件也需要及时作出调整。

针对这些调整制定规划意味着基础设施自身必须拥有出色的灵活性。我们从业务建立之初就充分意识到,移动广告领域可以说瞬息万变,而我们则需要打造一套能够与之相匹配且相适应的灵活基础设施。我们希望自己的这套基础设施能够允许员工针对各类市场需求实现对应的创新活动。举例来说,如果我们需要进行细节调整,那么只需在现有基础设施之上直接实施即可、而无需对设施整体进行重新设计。这就是我们工作的核心指导思想。

这套方案也切实带来了回报。我们最近刚刚将单月信息流量提升了一倍,而让这一切变成现实的正是我们这套灵活性出众的基础设施。

适应性强且具备可扩展能力的实时基础设施

考虑到上述构建要求,我们所打造的基础设施堆栈中包含Web服务器、一套实时缓存层、数据库、分布式消息服务以及大规模并行计算系统。

作为前端的是成百上千台Web服务器。这些服务器设备用于应答每天来自海量用户的数十亿请求。当每一条请求传入时,我们需要立刻作出一系列决定,包括是否对其作出应答、为其支付多少成本以及提供哪条广告作为宣传内容——整个决定过程大约耗时50毫秒。

接下来我们要做的是将用户配置信息纳入缓存,整套数据库包含数十亿拥有手机设备的用户。这些信息需要在很段的时间周期内进入可用状态,从而实现Web服务器的响应并决定是否为特定广告请求提供支持。简而言之,我们需要的是一套分布式缓存层,旨在以实时方式为全部传入请求提供所需数据。这套缓存层中使用包括Aerospike、Redis以及Memchached在内的多套系统。

除此之外,另有大量分析、报告、数据仓库以及数据科学功能集需要接入到不同类型的数据库当中。从宏观规模角度看,这些功能必须具备分布式能力。为了实现这种分布式机制,我们采用分布式消息或者发布/订阅消息服务。分布式消息发送机制为我们带来了以下几项关键优势:

·我们能够从任何位置获取需要的信息。

·我们能够利用日志文件作为事务单元,从而处理在一秒钟内处理数以十万计请求。

·我们能够为任何服务订阅方案提供其需要的信息。

上述消息必须被发布到全球世界内的任何位置。其目标位置可能是一套惠普Vertica数据仓库、MySQL数据库、Apache Hadoop系统或者一套Apache Storm实时处理系统。分布式消息发送机制可以说是所有实时架构的核心组成部分。

最后,我们需要利用分布式计算体系实现数据处理。拥有分布式计算体系意味着对Hadoop或者Apache Spark等技术方案的运用——这类并行处理系统能够查看全部数据并通过扩展处理规模庞大的数据负载。

以上列出的所有部件都通过一套分布式日志架构实现对接。这类基于日志架构的基本设计思路在于,它能够接纳多种数据源,利用日志文件作为事务单元并获取来自全部数据源的信息。举例来说,一台广告服务器可能会记录下“我是否提供了广告内容?用户是否点击过广告内容?我是否感知到事务处理?”这一切都将被写入日志当中,而大量日志信息则汇聚成消息系统。这些日志不断传输、接受处理,最后的汇总数据则被写入数据库。全部此类数据都能够为日志记录系统所调用,并以订阅方式交付给任何需要这些数据的服务。

这种架构类型之所以能够实现创新,是因为我们完全可以将任何组件插入到系统当中。大家可能需要在特定位置插入Aerospike实时数据库,也可能希望在其它位置使用Vertica。我们必须有能力将全部输入信息交付给全部不同类型的处理工具。拥有这样一套基于日志的架构能够帮助我们通过日志将所有数据源同集中式日志记录系统对接起来,并最终成为实时订阅系统的实现基础。

评估技术选项

对我们这套平台的评估工作能够充分展示,为什么拥有具备高度灵活性的基础设施是如此重要。

我们最初其实选择了利用PHP语言进行平台构建。这是一种效率极高的开发方式,而且也很容易找到大量熟悉此类开发任务的编程人员。同样的道理也适用于MySQL,而考虑到MongoDB作为NoSQL数据库领域重要成员的崇高地位,我们决定将二者并行使用。当然,作为一家初创企业,我们在起步阶段在Amazon Web Services上构建起平台的核心主体。但最后,我们利用RabbitMQ来实现自己的发布/订阅消息机制。

随着时间的推移,我们已经开始将数据迁移到由Aerospike、Redis、Apache Cassandra、Vertica以及Hadoop系统所共同构成的综合体系当中。我们完成了由PHP向C++的转换,而且将消息发布任务由RabbiMQ转换到一套定制化Java系统当中。与此同时,我们还成功削减了其它系统的使用数量,将其规模严格控制在我们相对易于理解、而工程技术团队又明白该如何处理的程度上。

新软件的引进无疑是个成本昂贵的命题。无论是开源软件还是专有许可软件,如果大家作出了尝试但却没能收到预期中的效果,那么整个工作就又得退回几个月之前。因此我们认真对每款产品进行了评估,希望能预先了解其是否物有所值。

我们采取的第一项举措是审视行业中的其它厂商在使用哪些产品,这些产品又能给我们的现有用例带来哪些改进。举例来说,当评估Aerospike时,来自另一家广告技术企业的工作人员就向我们介绍了他的经验。我们之后又与四、五家其它Aerospike客户进行了沟通,并提出“你们的用例跟我们的是否存在相似之处?你们喜欢Aerospike的实际表现吗?你们对Aerospike还有哪些不满?”等问题。在此之后,我们还非常关心“如果我将其引入自己的业务体系,是否会还出现什么意想不到的计划外状况?”

另一项评估元素则源自开发人员的偏好倾向。这一点在开源项目当中表现得尤为突出,不过在商业产品范畴内也极具指导意义。与此相关的问题包括:“是否已经有开发人员编写、使用以及为其创建文档?这款产品是否拥有我们想要的发展轨迹?我身边的朋友中是否有人正在使用这套系统?如果这是一套开源系统,那我是否需要独力解决自己面临的问题?”

举例来说,我们目前正在对Apache Storm与Apache Spark进行全面比较。这两个项目都能够作为实时计算处理系统的实用性解决手段,那么哪一种更受开发人员的青睐呢?在其它因素旗鼓相当的情况下,这一点就显得非常重要了。

接下来是适应性水平。换句话来说:这套方案能否顺畅融入我的系统?举例而言,如果我们目前所使用的是PHP、Python或者C++,那么这款新软件能否以原生方式集成到对应语言当中?我们又是否能够编写出切实与该组件内API相对接的工具?

除此之外,我们还要深入考量产品出现故障的可能性。特别是在我们的实际案例当中,企业的多座数据中心分布在全球各个位置,最重要的就是在故障出现时及时了解实际情况。某些产品在遭遇意外时不会发出警报作为提醒,这在我们眼中就显得非常危险。

最后一个需要考虑的问题在于平台的潜在风险——投入大量资源构建起的方案有可能在后续使用过程中给企业带来恐怖的额外成本。举例来说,如果一家企业并没有以.Net为核心构建业务体系的经验,那么选择任何一套与.Net相关的技术平台都将毫无意义。如果这套技术方案基于Java所打造,那么我们是否拥有对其加以妥善维护的必要资源?如果我们采用的是Amazon Web Services或者Google Compute Engine,那么是否有信心在未来三年内继续将全部业务依赖于这些云平台的发展趋势?

一家企业所采用的技术方案在潜在客户、合作伙伴或者投资者眼中往往会被视为优势或者劣势因素。总而言之,平台的实施目标在于贴合业务的运营目标,这也应该成为指导我们选择的根本性原则。

英文:http://www.infoworld.com/article/2868513/database/how-to-serve-billion-web-requests-per-day.html

你的身份是软件架构师。 我将提供有关应用程序或系统功能需求的一些详细信息,而您的工作是推荐一些可行的技术架构方案。 这可能涉及分析业务需求、软件技术架构分析以及将新系统的功能实现可行性。我的需求是以下是针对AI伴侣APP的功能架构设 一、核心功能架构图 ┌───────────────────────┐ │ 表现层(UI/UX) │ │ ┌───────────────┐ │ │ │ 对话交互层 │ │ │ ├───────────────┤ │ │ │ 角色编辑器 │ │ │ ├───────────────┤ │ │ │ 共创剧情面板 │ │ │ └───────────────┘ │ ├───────────────────────┤ │ 业务逻辑层(核心引擎) │ │ ┌───────────────┐ │ │ │ 对话引擎 │ │─── NLP处理、情绪分析 │ ├───────────────┤ │ │ │ 角色系统 │ │─── 形象生成、性格建模 │ ├───────────────┤ │ │ │ 共创剧情引擎 │ │─── 故事树管理、实时协作 │ ├───────────────┤ │ │ │ 情感陪伴系统 │ │─── 记忆存储、动态回应 │ └───────────────┘ │ ├───────────────────────┤ │ 数据与服务层 │ │ ┌───────────────┐ │ │ │ 数据库集群 │ │─── PostgreSQL(对话历史) │ ├───────────────┤ │ │ │ 缓存系统 │ │─── Redis(高频数据) │ ├───────────────┤ │ │ │ 第三方API │ │─── GPT-4、Stable Diffusion │ └───────────────┘ │ └───────────────────────┘   二、功能模块详细设 1. 智能对话引擎 - 技术实现: - 采用Transformer模型(如GPT-4微调)实现多轮对话,支持上下文记忆(Context Window 4096 tokens)。 - 对话状态管理:使用JSON格式存储当前对话场景、情绪值、故事节点ID等,通过Redis缓存加速访问。 - 核心子系统: - NLP处理管道:分词→实体识别→意图分类→情绪分析(VADER+BERT混合模型)。 - 语音交互:Google Speech-to-Text + ElevenLabs TTS,支持流式传输。 2. 角色定制系统 - 形象生成: - 2D Live形象:通过DeepAI API实现实时面部表情生成,支持眨眼、微笑等微表情。 - 参数化建模:将发型、服装等属性映射为数值参数(如HairStyle=123, Color=0xFF6B6B),通过WebGL渲染。 - 性格建模: - 建立性格向量空间(Personality Vector),包含外向性、神经质等5维度,影响对话策略与回应模板。 3. 多模态交互层 - 输入整合: - 文字→NLP解析,语音→ASR转文本,动作→手势识别(如Flutter手势库)。 - 表情包处理:通过正则表达式匹配(如 :) →调用Lottie动画库渲染笑脸)。 - 输出响应: - 动态生成2D形象动作(如点头、挥手),同步播放TTS语音,支持多线程渲染。 4. 情感陪伴系统 - 情绪管理: - 实时情绪评分:基于关键词匹配(权重0.4)+ 语义分析(权重0.6)生成情绪值(-100~100)。 - 回应策略引擎:根据情绪值查表选择回应模板(如Sad→"共情话术"+"治愈剧情触发")。 - 记忆存储: - 长期记忆:PostgreSQL存储用户喜好、重要日期等结构化数据。 - 短期记忆:Redis缓存最近20次对话的关键信息(如"用户刚提到考试压力")。 5. 共创剧情引擎 - 故事树结构: - 节点模型:定义剧情节点(Node)包含ID、父节点、触发条件(如情绪>80)、分支选项(User Choice/AI Generate)。 - 可视化编辑:使用Sigma.js绘制故事树,支持拖拽重组节点,通过WebSocket同步至后端。 - 实时协作: - 冲突解决:采用OT算法合并多人编辑,通过操作日志(Operation Log)回滚冲突。 - AI生成分支:基于用户输入的关键词(如"森林"),调用GPT-4生成候选分支(概率加权选择)。 6. 虚拟世界构建 - 场景生成: - 2D场景:用户输入描述(如"樱花树下的咖啡馆")→Stable Diffusion生成背景图→WebGL渲染动态元素(飘落的花瓣)。 - 3D场景:集成WebXR API实现AR约会场景(如虚拟餐厅的3D建模)。 - 角色互动: - 定义互动事件(Event)包含触发条件(如进入场景)、动作(如"AI角色递咖啡")、对话分支。 三、技术架构关键点 1. 分层通信协议 - 表现层→逻辑层:RESTful API + WebSocket(JSON格式消息)。 - 逻辑层→数据层:gRPC微服务通信(如对话引擎调用角色系统接口)。 2. 性能优化策略 - 对话响应:缓存高频对话模板(Redis),冷启动请求通过消息队列(Kafka)异步处理。 - AI生成:对Stable Diffusion模型进行量化(FP16→INT8),部署NVIDIA Triton推理服务器。 3. 扩展性设 - 插件化架构:支持第三方开发者通过SDK扩展剧情模板、对话策略。 - 多租户支持:通过数据库分库分表(Sharding)支持百万级用户同时在线。 四、关键技术风险 1. 多模态同步:需保证语音、文字、动作指令的时序一致性,避免逻辑冲突。 2. 共创剧情失控:需设AI生成内容的白名单机,无敏感话题限制 3. 大规模并发:WebSocket集群需支持万级长连接,采用Nginx+Lua实现负载均衡。 五、架构演进路线 1. 阶段1(MVP):单实例部署,对话引擎与剧情引擎耦合实现核心功能。 2. 阶段2(扩展):拆分微服务,引入Kubernetes管理集群,增加Redis集群缓存。 3. 阶段3(智能化):集成LLM进行持续学习,优化情绪识别与剧情生成精度。
03-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值