IT技术博客大学习 共学习 共进步

系统架构

共 731 篇文章

IT 2013-08-12 13:35:58 / 累计浏览 2,129

天猫导航的内部机制揭秘

这篇讲的是天猫搜索结果页上方那个看似简单的导航栏,其背后的智能推荐机制。 文章从一个常见场景切入:当用户搜索意图不明确时,导航区的类目和属性推荐就成了帮助他们找到商品的关键。作者务达揭示,这些导航项并非静态存储,而是通过算法动态生成和排序的。 具体来说,导航分为类目导航和属性导航,其推荐逻辑依赖于离线生成的词表。核心算法基于每个(Query,搜索类目)对的点击、成交和商品数数据,进行线性加权排序,决定展现哪些类目/属性以及它们的排列顺序。例如,属性推荐就细分为根类目、公共类目和叶子类目下的属性,当某个属性分数占比极高时,会直接进行“属性预选”展示。 整套系统每天承载着约3000万PV的展现量,是天猫搜索导购链路中的重要一环。文章将智能导航的架构、排序算法以及具体的展现逻辑梳理得清晰透彻,揭开了这个常见却容易被忽视的功能背后的技术面纱。

IT 2013-08-12 13:35:08 / 累计浏览 4,292

淘宝搜索中Query下拉推荐技术

这篇讲的是淘宝搜索下拉推荐系统如何从基础算法演进到更智能的方案。下拉推荐能帮用户快速明确搜索意图,是提升搜索体验的关键。 文章从最基础的基于查询词历史PV的推荐策略说起,指出其存在长尾覆盖不足、推荐结果语义重复以及低质或作弊查询容易被推高排序等问题。为解决这些问题,作者介绍了两轮核心迭代:第一步,引入“查询词静态分”这一综合质量指标,它融合了流量、点击、交易转化等多维度数据,用它来排序,能让交易质量高的查询词获得更多机会,有效打压了作弊查询。第二步,则进一步建立了搜索词与候选查询词的动态联系,通过CTR预估模型来预测用户对推荐词的点击率,模型综合考虑了搜索词与候选词的内容相关性、类目匹配度以及结果页特征等,让排序更具个性化和预见性。 文章最后还提到了拼音搜索、拼写纠错、作弊清理及个性化等进阶方向,展现了淘宝搜索推荐系统从简单排序到多维度、动态智能化的完整演进路径。

IT 2013-08-12 13:32:35 / 累计浏览 4,498

Learning to rank在淘宝的应用

这篇讲的是淘宝搜索排序系统如何从传统手工调参进化到机器学习自动化调整的实践。作者从排序优化的核心难点切入:传统方法依赖人工特征调优和反复AB测试,效率低且难达最优。为此,团队在已有特征体系上应用了Learning to Rank技术,项目内部命名为Jazz。 其核心方案是采用pairwise方法来构建训练数据,但做法很有淘宝特色:没有像常规那样做耗时耗力的人工标注,而是直接利用用户的点击和购买行为数据自动生成商品对。同时,为了保证排序稳定性,还混合了部分原始排序的样本进行分层抽样。模型训练后,通过计算NDCG指标在线下评估效果,显著缩短了测试周期。 文章详细拆解了从数据生产、模型训练到效果评估的全流程架构,并坦诚分析了pairwise方法在具体实施中遇到的挑战,比如与传统论文中描述不同的样本构建思路。这种将工业级实践与算法原理结合的分享,清晰地展示了机器学习技术如何解决真实业务中的复杂排序问题。

IT 2013-08-08 23:30:13 / 累计浏览 2,333

从概念的角度审视一淘商品搜索的Online系统架构

这篇技术文章从概念角度剖析了一淘商品搜索系统中的信息组织架构,直指当前设计的不足与优化方向。作者指出,随着商品数量增长,类目、产品节点(SPU/SKU)等层级信息在现有系统中存在割裂,特别是产品节点的类目关系和父子层级在Online系统中未被有效利用,导致搜索结果页(SRP)展示和导航逻辑存在缺陷。 文章引入了两个核心概念:AP(访问点/聚合点)与TAG(属性)。AP用于路径导航(如类目、SPU),TAG用于结果筛选(如颜色、尺寸),两者可动态转化。作者认为,当前依赖离线统计的QP决策机制存在局限,而通过构建并利用一棵完整的“AP树”,系统可以进行实时在线统计,从而更智能地决定产品的展示层次、结构化组合(Combo)以及跳转逻辑,大幅降低人工干预成本,提升用户导航体验。 其核心方案是统一CatId、SpuId、SkuId的数值空间,构建更完整的层级树,并增强模块的数据更新能力。这一架构不仅旨在解决当前节点展现别扭、导航路径单一的问题,还为关联推荐、公共信息提取等更丰富的产品功能打开了空间。

IT 2013-07-31 13:24:10 / 累计浏览 1,869

数据的游戏:冰与火

这篇讲的是一位在Amazon和淘宝都有过实践的数据挖掘新人,在不到10个月里总结出的“冰与火”心得。作者开篇就点明,数据世界象征着权力与征服,但通往“王座”的道路布满荆棘。 文章的核心观点很明确:他从Amazon经验中提炼出数据团队的三大角色——苦累却至关重要的数据清洗员、技术含量最高的研究科学家、以及相对次要的软件开发工程师。作者强调“Garbage In, Garbage Out”,再牛的算法也敌不过一堆垃圾数据。 通过两个生动的案例,作者阐明了数据质量的重要性。一是像Amazon那样建立严格的商品ID(ASIN)作为数据标准;二是清洗海量但格式混乱、真假混杂的用户地址数据。他指出,数据不分大小,只分好坏,从80%的准确度提升到90%,所需成本远超过从60%到80%。 作者进一步讨论了业务场景对数据挖掘的制约。推荐系统在音乐和电商场景下逻辑截然不同,对书籍和服装的需求预测难度也有天壤之别。他提醒,数据挖掘远非人工智能,在特定业务场景下,资深从业者的经验甚至比机器学习更准。 最终,作者认为数据分析结果不能止步于统计呈现,必须能指导下一步行动。他抛出了数据挖掘中质量、场景与结果这三个关键问题,虽未给出标准答案,却为从业者揭示了被算法光环所掩盖的实践本质。

IT 2013-07-29 22:55:30 / 累计浏览 4,113

Impala与Hive的比较

这篇文章深入对比了Hadoop生态中两款重要的SQL查询工具:Impala与Hive。它们虽然共享HDFS/HBase存储和相同的元数据,但设计目标截然不同。 核心差异在于查询引擎的架构。Hive将查询转换为一连串的MapReduce任务,采用“推”式数据流和依赖外存的中间结果落盘,适合长时间、稳定的批处理作业。而Impala受Google Dremel启发,彻底绕开了MapReduce,其分布式查询引擎直接生成执行计划树,并以“拉”式流传输中间数据、最大化使用内存,大幅降低了延迟,专为交互式分析设计。 文章详细拆解了Impala的组件与查询流程,并指出其多项优化技术,比如使用LLVM进行运行时代码生成、利用SSE4.2指令集以及更优的I/O调度。不过,Impala在容错和处理超大数据集时存在限制。因此,一个高效的实践是:先用Hive进行耗时的数据清洗与转换,再让分析师在处理后的数据集上利用Impala进行快速、反复的探索与验证。

IT 2013-07-28 15:38:48 / 累计浏览 3,471

YARN ResourceManager调度器的分析

这篇深度剖析了YARN ResourceManager中三种核心调度器:FifoScheduler、CapacityScheduler与FairScheduler的设计逻辑与差异。文章从ResourceManager作为资源调度中心的架构出发,详细拆解了调度器的事件处理机制与异步分配模型——即调度器如何通过响应节点心跳、应用提交等六类事件,在内存中维护队列、应用与Container的关系,并最终完成资源匹配。 文章的核心价值在于清晰的对比分析。FifoScheduler结构最简单,适合小规模场景;CapacityScheduler通过树状队列与容量限制,旨在最大化集群整体吞吐与利用率;而FairScheduler则侧重于多用户间的资源公平共享,支持动态队列创建与资源抢占。除了基础模型,作者还深入解读了本地优化与延迟调度机制:调度器会优先匹配与数据本地性一致的Container,若不匹配则“延迟”等待机会,以此平衡网络开销与调度效率。 文末提供了与调度器紧密相关的集群参数配置解读,帮助读者将理论理解落地。对于需要根据实际业务需求(如多租户隔离、公平性或高吞吐)选型与调优YARN调度器的工程师而言,这是一篇逻辑清晰、细节扎实的参考。

IT 2013-07-28 15:36:38 / 累计浏览 2,670

UCMQ简介

这篇技术分享的主角是UCMQ,一个由UC Web开源的轻量级HTTP消息队列。作者坦诚,项目的初衷是改进类似HTTPSQS的方案,解决其底层TC存储因数据膨胀导致的内存与性能瓶颈。 UCMQ的核心设计思路是“去TC化”。它摒弃了传统的TC存储,转而采用更高效的日志文件存储方式。其关键在于数据被顺序写入内存映射的文件中,且缓存区域随读写指针移动,这种设计既大幅节省了内存开销,又保证了出色的读写性能。在特性上,它支持标准HTTP协议与长连接,单实例支持多队列动态管理,并能实时监控队列状态。 性能测试数据直观展示了其效果:在配备多核CPU和千兆网卡的环境下,无论是长连接还是短连接,其入队列、出队列速度均能稳定超过10000次/秒。文中也详细介绍了其包含控制模块、网络驱动、队列管理和存储模块的内部架构。尽管作者谦虚地称之为“拙劣的开端”,但文中扎实的架构图解与性能数据,已清晰勾勒出这款高性能HTTP MQ的轮廓。

IT 2013-07-28 15:33:22 / 累计浏览 8,631

使用渐进式JPEG来提升用户体验

这篇讲的是JPEG图片两种常见的存储方式之间的对比:标准型(Baseline)和渐进式(Progressive)。二者图像数据完全相同,核心区别在于解码显示的方式:标准型如同从上到下逐行扫描,图片一行行清晰显现;而渐进式则包含多次扫描,加载时会先呈现一个模糊的轮廓,随后逐渐变得清晰锐利。 这种差异直接影响用户体验,尤其在网络速度较慢时。渐进式JPEG能让用户在图片完全加载前就大致看到内容,心理上减少等待的焦虑感,这对于图片密集或用户网络环境不稳定的场景是明显的优化。不过,文章也提到,对于采用“瀑布流”布局的网站,传统标准型可能是更稳妥的选择。 另外,渐进式图片的体积并不比标准型大,有时甚至更小,但其解码过程会消耗稍多一点的CPU和内存资源,不过这在当今的设备上通常不成问题。文章的后半部分相当实用,直接给出了在Photoshop、Linux命令行、PHP、Python等多种环境下,如何将一张图片转换为渐进式JPEG的具体代码和命令。

IT 2013-07-28 15:32:30 / 累计浏览 3,971

淘宝图片服务的学习

这篇讲的是淘宝如何用自研的TFS,解决承载90%以上流量的图片存储难题。 淘宝图片流量占比超过90%,且绝大多数是需要频繁读写的小文件。2007年前,依赖的商用存储系统无法应对如此海量的小文件和高并发访问,暴露出扩容成本高、性能瓶颈和单点故障等硬伤。为此,淘宝决定自主研发。 核心方案是淘宝文件系统TFS。它最大的特点是将元数据(如大小、位置信息)直接编码到图片的文件名中,抛弃了传统目录树,从而极大地简化了元数据结构,解放了管理节点的性能。从1.0到2.0版本,TFS不断演进,从使用EXT3到自建块设备文件系统,从RAID5到单进程管理单盘,通过一系列深度优化,最终支撑起了规模达1.8PB、存放286亿文件的图片集群,并实现了高性能与平滑扩容。 文章通过具体数据和架构演进,清晰地展示了淘宝从依赖商业软件到走出一条针对海量小文件存储的自研道路的全过程,对任何面临海量小文件存储挑战的团队来说,TFS从实践中打磨出的设计思路都值得参考。

IT 2013-07-15 13:14:05 / 累计浏览 2,948

解决进程间共享内存,由于某个进程异常退出导致死锁问题

这篇讲的是在进程间共享内存编程中,因某个进程异常退出而导致死锁的经典坑。作者从一个线上服务重启后的超时问题出发,层层排查,最终定位到根源:一个读进程在持有读写锁时突然崩溃,导致锁的计数器(`nr_readers`)没有递减,写进程因此永远等不到锁,共享内存数据无法更新,最终引发服务故障。 作者不仅用测试代码复现了这一问题,更深入探讨了如何解决。读写锁在这种场景下缺乏自动恢复机制。一个巧妙的出路是改用互斥锁,并设置其`PTHREAD_MUTEX_ROBUST_NP`属性(Robust锁)。当持锁进程死亡时,锁不会永久阻塞,而是返回`EOWNERDEAD`,后续线程调用`pthread_mutex_consistent_np`即可修复锁状态,使其恢复正常。此外,作者还提醒,通过共享内存交换数据时,务必增加完成标记,以确保数据在进程崩溃时不会处于不完整的中间状态。 文章从实际故障切入,完整呈现了“发现问题-分析根因-测试验证-寻求方案”的解决链条,特别是对Robust锁的应用,为处理跨进程的异常状态恢复提供了非常实用的思路。

IT 2013-07-07 22:21:02 / 累计浏览 2,751

集群资源调度系统简介与galaxy资源调度系统简介

这篇讲的是集群资源调度系统,它为什么重要,以及内部的一个具体实践。 随着公司集群规模扩大,资源利用率低和部署运维复杂成了迫切需要解决的问题。文章从IaaS的角度切入,指出资源调度系统的核心价值在于实现资源共享、弹性管理与自动化运维。作者从谷歌Omega论文出发,梳理了三代调度架构的演进:从结构简单但扩展性差的中央式调度器,到支持大规模集群和多框架混部的双层调度器(以Mesos为代表),再到通过全局共享状态和乐观锁提升并发性能的第三代架构。文中以Mesos的“Resource Offer”机制为例,清晰展示了资源如何分配给具体应用。 文章后半部分将视角转向内部实践。为了支撑“万”级别流计算任务并解决现有引擎在大集群、多租户下的瓶颈,galaxy平台设计了一套轻量级的双层调度系统,目标是实现多集群间的资源共享与任务隔离。这篇不仅梳理了技术脉络,也展示了如何从通用架构中汲取灵感,解决实际业务中的资源调度挑战。

IT 2013-07-07 21:43:12 / 累计浏览 7,115

中间件和稳定性平台

这篇文章全景式地展示了阿里技术体系中,保障大规模分布式系统稳定运行的核心中间件与平台。它不是一个孤立方案的介绍,而是一张完整的技术地图。 文章从配置、消息、服务、数据到性能监控,分层介绍了多个关键组件。例如,用Diamond实现配置的动态推送与超高可用,用Notify(推模型)和Meta(拉模型)满足不同的消息需求,用HSF统一RPC调用,并依靠eagleeye进行链路跟踪。数据层则通过TDDL实现SQL路由,用精卫、愚公等工具解决数据迁移与扩容难题。最后,持续稳定性平台CSP与TProfiler、Hotspot等工具共同构成了保障系统高可用的“运维三件套”。 整篇文章的价值在于,它清晰地勾勒出了一套应对高并发、大数据挑战的、经过生产验证的全家桶方案。对于希望理解超大规模互联网系统底层基础设施的读者来说,这提供了一个非常直接且具体的参照系。

IT 2013-07-07 18:00:54 / 累计浏览 4,792

如何设计一个优秀的API

这篇讲的是如何设计出经得起时间考验的优秀API。作者从两年API维护经验出发,直面了一个核心痛点:API一旦发布,修改成本极高,会直接影响用户信任与业务。因此,好的API设计至关重要。 文章提出了优秀API的几个关键特质:对用户而言要易学习、易使用且难误用;对开发者则要易阅读、易开发。要达到这些目标,作者总结了九条核心设计方法,比如面向用例设计、采用良好思路(如方法优于属性)、避免“必须漂亮”或“必须简单”等极端意见、进行有效评审、保证向后兼容以及把握API的生命周期。 其中,关于“向后兼容”的多层次实现和为API设定“分级”管理以实现平滑演进的观点,给出了非常具象的指导。文章最后还列举了Flickr、Ebay等实践良好的API案例作为参考。对于任何需要设计或维护接口的开发者来说,这篇基于实战的避坑与进阶指南都值得一读。

IT 2013-07-07 17:55:03 / 累计浏览 3,836

回调还是消息队列

这篇文章从作者封装Hive socket库时遇到的一个具体问题切入:如何处理底层`poll` API产生的事件。直接注入回调函数虽然直接,但容易引发异常、重入等不可控问题,且会加剧C/Lua边界的性能负担。 作者提出的方案是将事件及数据一次性返回给Lua层处理。为优化此方案可能带来的GC压力,他采用了一个预先传入的消息队列(一个空的Lua table)作为接收结构。在C层,通过高效的`rawseti`操作将消息逐条写入这个结构,并巧妙地利用一个缓存池来复用存储每条消息参数的小table,从而在系统稳定后避免了临时构建大型Lua表。 文章最后,作者还附上了一段极简的Lua消息队列实现代码,展示了其优雅的实现思路。整体而言,文章分享了一个从具体问题出发,在性能与可控性间权衡并最终优化实现的技术决策过程。

IT 2013-07-07 17:53:01 / 累计浏览 4,483

IoC/DIP其实是一种管理思想

这篇讲的是,作者如何从一个简单的技术概念出发,最终揭示其背后更普适的管理智慧。文章以“开关控制灯泡”的经典例子,解释了控制反转(IoC)和依赖倒置(DIP)的核心:让灯泡这类设备去依赖开关定义的标准电源接口,而非让开关去适配每一个具体的灯泡。 但作者并未止步于此。他将视角拉远,展示了这一思想在商业与管理中的广泛应用:银行在买卖双方间提供担保交易模型,是将对彼此的直接依赖反转到对标准接口的依赖;海尔通过制定分销商标准,让渠道反过来适应自己,而非疲于应对多变玩法。这些案例清晰地勾勒出,IoC/DIP超越了代码层面的设计模式,成为一种破解复杂协作、降低耦合的管理框架。 在文章后半部分,作者将这一思想具体带入技术团队的日常挑战中。无论是前端团队制定组件标准让后端接入,还是云平台要求底层资源遵循统一管控模型,抑或是订单系统通过插件化与工作流引擎来应对业务个性化需求,其内核都是一致的:**制定清晰的标准接口,将控制权和依赖方向进行“反转”**,让协作方基于共同认可的协议进行对接,而非陷入无止尽的需求适配与代码耦合中。 最后,作者借Amazon的SOA实践和个人项目经验再次强调,在跨团队工作中,克制过度的控制欲,学会通过制定标准来倒置依赖,不仅是一种高效的技术方案,更是一种组织协作的智慧。它能将混乱的依赖关系转化为有序的、可扩展的协作结构。

IT 2013-06-19 23:36:50 / 累计浏览 8,276

浏览器的渲染原理简介

这篇讲的是浏览器如何把代码变成屏幕上可见页面的全过程。作者从那篇著名的《How Browsers Work》出发,指出其虽好但过于冗长,且对日常工作的直接帮助有限。于是他提炼出了一个更精简、更实用的版本,目标是让读者在通勤或休息的碎片时间里就能读完,并立刻能用上。 文章的核心是梳理浏览器渲染的几大步骤:解析HTML生成DOM树、解析CSS生成规则树,再由这两者构建出用于实际绘制的渲染树。作者特别拆解了DOM与CSS的解析逻辑,并点出CSS匹配的性能关键在于选择器的写法。最后,他重点区分了Reflow(重排)与Repaint(重绘)——前者因几何尺寸变化而成本高昂,在移动端尤其“痛苦”,后者则相对轻量。文章还直观地列出了哪些常见操作会触发高成本的Reflow,为前端性能优化提供了明确依据。 整个叙述直白且紧扣实战,比如缓存DOM样式引用、理解`display:none`与`visibility:hidden`的不同影响等细节,都能帮助开发者更深入地理解页面性能问题的根源。

IT 2013-06-08 23:37:17 / 累计浏览 7,938

腾讯敏捷开发及快速迭代

这篇讲的是腾讯如何从2006年开始,在研发规模膨胀的背景下,将敏捷开发从理念落地为一套独特的、适合自身的实践体系——TAPD。 文章梳理了腾讯从引入ThoughtWorks培训、试点到全面推广敏捷的完整历程,并坦诚分享了过程中遇到的挑战:产品线多元、团队规模差异大、长周期项目(如QQ客户端)的适配问题,以及大量新人融入的难题。正是这些挑战,催生了腾讯混合吸收XP、Scrum和FDD精髓的“并行迭代”模式。 在具体实践上,文章细节很多。产品侧采用类似FDD的“特性驱动”,由产品经理滚动定义需求;项目管理借鉴Scrum,但强调每日晨会、规划游戏和时间盒的灵活运用;开发侧则落实了持续集成、自动化测试和“全员测试”文化。最具腾讯特色的创新点包括使用“故事墙”可视化进度、推行“自运转团队”以减轻项目经理负担,以及大规模应用“灰度发布”来安全快速地验证产品。 整篇文章展示了一个大型互联网公司如何将敏捷“本土化”,在规范化与灵活性之间找到平衡,最终服务于快速迭代的产品目标。

IT 2013-06-03 23:00:04 / 累计浏览 3,912

页缓存概述

这篇讲的是Linux内核中一个关键性能优化组件——页缓存的工作原理与实现。作者将它比作硬件缓存的软件实现,核心思想是利用快速的主存来缓存慢速的磁盘数据,以此大幅减少I/O等待。 文章首先解释了页缓存的读写机制:读取时先查缓存,若未命中则加载并可能长期驻留;写入时则直接修改缓存中的“脏页”,并不立即写回磁盘,而是采用延迟写回的策略来合并多次修改。 实现上,内核面临两大挑战:如何快速找到特定缓存页,以及如何统一管理来自不同源(如文件、设备)的数据。文章深入剖析了address_space结构如何巧妙地解决这两个问题。它内部维护一棵radix优先搜索树,将所有属于同一所有者的缓存页组织起来,支持高效的查找、插入和删除。同时,通过a_ops钩子函数集,为不同数据源定义了统一的操作接口(如readpage、writepage),让上层逻辑与底层具体设备解耦。 最后,文章列出了内核提供的基本操作函数,如查找、分配、添加和移除缓存页,构成了操作页缓存的程序接口。整体来看,这篇文章从概念到实现,清晰地梳理了Linux内存管理中这一精巧的中间层设计。

IT 2013-06-02 20:23:05 / 累计浏览 4,216

记一次tps提升,做的配置变更

这篇讲的是作者如何将一个php应用的TPS从120稳定提升至810的实战过程。 文章开篇直面问题:系统TPS低下、响应慢、并发能力差。作者从应用代码入手,借助xhprof定位瓶颈,优化了如避免高频内核调用、用memcached缓存数据等细节。随后,思路扩展到整个服务栈的配置调优。 在php层面,通过禁用不必要的模块、重新编译、配置php-fpm等方式节约资源。Web服务器Nginx侧,则涉及worker进程数、epoll模型、keep-alive、gzip压缩及静态资源处理等关键配置。更深层的,作者对操作系统进行了“瘦身”:精简守护进程、调整文件描述符限制、优化磁盘挂载参数。 整个过程的转折点在于对内核参数的精细调整。通过sysctl优化TCP连接、缓冲区等设置后,系统不仅TPS达标,性能曲线也趋于稳定。作者总结道,提升TPS的核心在于缩短单个请求的响应时间,并可通过strace等工具分析,从减少上下文切换和系统调用入手,最终实现更少资源开销下的更高吞吐。