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

系统架构

共 731 篇文章

IT 2014-04-13 22:36:23 / 累计浏览 5,114

从Code Review 谈如何做技术

这篇讲的是作者在微博上发起的一场关于“Code Review是否重要”的讨论,以及由此引发的对技术实践和工程师责任的深入思考。 作者观察到,Code Review在偏技术的团队推行较好,但在很多业务团队却难以落地,后者常以“工期紧、需求变”为由认为其价值不大。作者对此强烈反对,他认为程序员应有“做漂亮”而非仅仅“做出来”的工程修养,这正是“山寨”与“工业”的差别。文章厘清了几个常被混为一谈的问题:Code Review本身对提升代码可读性、可维护性和知识共享的好处毋庸置疑;而它“做不起来”往往源于人员能力、团队态度或项目管理问题,不应归咎于方法本身。 更关键的是,面对业务压力,作者用自己在聚石塔的经验指出,工程师不应疲于奔命,而应主动审视需求、定义产品边界、推动标准化,从而从根源上减少无效需求。他总结道,当你忙得像牲口时,恰恰需要停下来思考这种忙碌的根源。Code Review不是解决一切问题的银弹,但它代表了对代码质量和自身成长的一种坚持。

IT 2014-04-07 22:57:02 / 累计浏览 6,351

计算机网络协议赏析-HTTP

大家每天都在敲击的http://,可能是计算机网络里最“熟悉的陌生人”。这篇文章从这个视角切入,带我们重新认识这位应用层的明星协议。 它将HTTP与幕后的TCP/IP协议对比,点明HTTP作为用户直接面对的“台前大腕”的地位。作者没有停留在概念层面,而是清晰地拆解了HTTP工作的四个步骤:从TCP连接建立,到客户端发出请求报文,服务器返回响应报文,最后连接断开。 文章的核心价值在于将协议细节“可视化”。它详细展示了一次典型的HTTP请求和响应报文长什么样,并解释了每一行代码的作用——从请求方法、头部字段,到那个容易被忽略但至关重要的空行。同时,文章也系统梳理了那些常见的状态码:从200 OK到404 Not Found,再到500服务器错误,让读者真正读懂这些数字背后的含义。 除了基础,文章还延伸到了HTTP 1.0与1.1版本的演进,特别是“持久连接”这一关键改进,并提及了缓存控制等高级用法。整篇文章像一位耐心的向导,将抽象的协议规范转化为具体可感的报文结构,帮助读者建立起对HTTP工作原理的扎实理解。

IT 2014-04-07 22:35:21 / 累计浏览 9,373

抓取网页内容生成Kindle电子书

这篇讲的是如何把那些只能在线浏览的网页内容,变成可以在Kindle上随时随地阅读的电子书。作者从一个常见的痛点出发——Kindle虽好,但网上大量优质的在线文档、技术书籍却无法离线阅读。 文章的核心方案是借助开源的电子书管理工具Calibre。它提供的`ebook-convert`命令和`recipes`机制是关键:用户只需编写一个Python类脚本(即recipes),定义好抓取规则,就能自动将网页内容转换为mobi或epub格式。作者以《Git Pocket Guide》为例,详细演示了如何分析网页结构、编写`parse_index`方法来解析目录并组织章节内容,甚至自动处理图片。实现思路清晰,通过继承`BasicNewsRecipe`类并实现一个核心方法,就能完成定制化抓取,非常巧妙。 最终生成的电子书在Kindle上拥有完整的目录和图文排版,效果很好。作者还把自己的多个recipes整理在GitHub上供社区使用,让这套方法更具实用价值。

IT 2014-04-07 22:24:29 / 累计浏览 2,368

抽奖类活动项目的一些技术Tips

这篇文章分享了设计高并发抽奖活动系统时,如何通过关键技术点来抵御刷奖风险、保障活动稳定性的实战经验。 作者从互联网抽奖活动常面临专业刷奖团伙的真实背景出发,系统性地提出了五层防护建议。核心思路是保持系统简单可靠:接入层用缓存(如Redis)限制IP和用户抽奖频率,避免直接冲击数据库;代码层采用最简单的算法做初筛,将最终发奖逻辑下沉至数据库层;数据层则采用“每日奖池”模式,强调使用有符号整型并利用事务与行锁(如 FOR UPDATE)确保奖品数量扣减的准确与并发安全。 此外,文章还给出了非常务实的运营建议,比如选择白天发放奖品、细化每个时间点的投放量,以及保留充足的活动规则解释空间。整体来看,这套从接入、逻辑、数据到测试的完整实践,对保障线上抽奖类活动的健壮性与公平性具有很高的参考价值,能帮助开发者避免很多“坑”。

IT 2014-03-20 23:08:58 / 累计浏览 6,694

微信二维码登录的原理

这篇文章讲的是微信PC端二维码登录背后的实现机制。它从用户视角出发,解析了扫描二维码时实际发生的交互过程。 文章首先指出,微信PC端登录时会生成一个唯一UID并绘制为二维码。当用户用手机微信扫描后,这个UID会与手机端的身份令牌(token)绑定并上传服务器。接着,网页端会通过JavaScript发起持续的轮询请求,查询该UID的登录状态。 其中,文章展示了具体的轮询代码逻辑:网页每500毫秒请求一次服务器。根据返回的状态码决定下一步——例如,返回201表示已成功获取授权,而408则表示超时需要重试。这种基于轮询的异步验证机制,巧妙解决了跨设备状态同步的问题。 作者最后还提到,这种二维码授权模式在其他场景也有应用,比如手机控制智能电视盒。整篇文章通过代码和流程解析,将看似简单的扫码登录背后的“生成-绑定-轮询-验证”链路清晰地呈现出来,帮助读者理解其安全性和可靠性的技术基础。

IT 2014-03-19 23:01:03 / 累计浏览 2,894

IO不再神秘

这篇讲的是IO编程的核心模型。作者从高可用服务器设计和Node.js的流行切入,旨在厘清经常被混淆的IO概念。 文章系统梳理了四种IO模型:同步阻塞、同步非阻塞、基于就绪事件的异步非阻塞,以及基于完成事件的异步非阻塞。作者详细解释了每种模型的工作原理、上下文切换开销,以及在不同连接场景下的性能表现,比如同步阻塞模型在长连接高并发下易导致线程资源耗尽。 除了模型对比,文章还深入到操作系统层面,对比了Linux的epoll、BSD的kqueue、Windows的IOCP等不同实现机制,并着重讲解了Reactor模式这一主流NIO设计范式的核心组件与流程。最后,文章提及了Java NIO/NIO2对这些模型的抽象与支持。 整体而言,文章将理论模型、操作系统实现与设计模式串联起来,清晰地描绘了IO从阻塞到非阻塞、从同步到异步的演进逻辑,有助于理解高性能网络编程的底层基石。

IT 2013-10-29 23:02:33 / 累计浏览 3,937

Web 开发程序员谈网游服务器开发

这篇讲的是作者在参加一次网游开发团队交流后的思考。他敏锐地捕捉到,传统网游服务器开发因逻辑与存储高度绑定,往往忽视了动态扩展与容灾能力,而这些恰恰是Web开发领域的强项。 作者的核心观点是,网游服务器可以借鉴Web架构的“服务无状态化”原则。关键在于将服务拆分为“逻辑(指令)”和“存储(状态)”两部分。一旦逻辑层本身无状态,就能像典型的Web应用(如PHP + MySQL)一样,实现服务器的弹性增减。即使面对“用户切换服务器后状态丢失”这类网游特有疑问,通过分离设计和将存储层集群化,同样能构建出高可扩展、高容灾的系统。 这个视角为游戏后台架构提供了一条清晰的优化路径:用Web成熟的工程思想,去解耦游戏服务器的紧耦合状态。

IT 2013-10-21 22:31:29 / 累计浏览 5,514

移动APP开发过程

这篇讲的是移动APP开发的完整流程。作者将从构思到上线的漫长旅程,梳理成了九个关键步骤,像一份实用的路线图。 文章强调,一切应从清晰定义“为谁解决什么问题”开始,比如为业余摄影者提供便捷的分享工具。核心原则是“好的设计是一个解决方案,而不是一堆功能的堆砌”,要为最核心的80%用户设计,并持续与真实用户交流。 流程中穿插了诸多生动建议:不要迷恋第一个设计,不妨尝试画出10种草图方案;原型阶段牢记“Fail early to succeed sooner”;甚至要有勇气将“还行”的设计推倒重来。最终,发布并非终点,基于用户反馈的迭代才刚刚开始。 整个清单将设计思维贯穿始终,提醒开发者投入大量时间进行前期设计和用户验证,远比直接投入编码更能规避后期重构的风险。

IT 2013-10-18 12:30:20 / 累计浏览 3,692

移动互联网系统架构十大陷阱

这篇讲的是移动互联网系统架构中常见的陷阱,作者54chen基于三年一线开发经验,梳理了十个具体问题及其解决方案。比如,早期移动网络连通性差,应用频繁掉线,根因在于运营商网络不稳定,解法是选择有“背景”的机房以确保访问。HTML5在弱网环境下性能糟糕,即使现在也存在瓶颈,建议暂缓使用。DNS解析失败会导致请求不可达,客户端可缓存多个域名和IP作为备用。运营商HTTP拦截会擅自插入广告,开发者需在header中明确声明内容类型。 App设计上要克制按钮数量,避免功能泛滥,确保核心操作一键可达。传统web引导到app的转化极其困难,不应依赖。数据同步如sqlite与mysql不一致是大麻烦,最好用统一同步机制隔离业务逻辑,或将数据逻辑完全交给客户端处理。下载渠道必须通畅,上CDN时需注意缓存限制,防止下载速度陡降。更新频率要平衡,内部开发可天天迭代,对外发布则控制在月度或季更新。此外

IT 2013-09-26 22:33:06 / 累计浏览 3,391

图片服务架构学习之ZIMG

这篇讲的是一个名为ZIMG的开源图片服务架构,作者从中小型网站面临的大流量、高并发和海量存储这三重压力出发,详细拆解了这套用C语言编写、追求极致性能的系统是如何设计的。 它的核心思路在于将图片服务完全独立,并把处理逻辑(基于libevhtp)、图片操作(基于ImageMagick)与存储(memcached+硬盘)整合在一个轻量级进程里,以减少组件间的开销。文章深入到了代码实现层面,揭示了几个巧妙之处:用图片的MD5哈希值作为全局唯一标识,避免了复杂的数据库查询;采用两级子目录(根据MD5前六位哈希)来组织存储,单机理论容量可达200TB;并且内置了智能的多级缓存策略,能快速响应热点图片的裁剪、变换等请求。同时,系统通过自动压缩图片(宣称可减少约67%体积)、尽可能在内存中完成操作来削减I/O,体现了其“用CPU换I/O”的优化哲学。 文章最后也指出,这种单机部署、高内聚的方案,在成本与性能之间做了务实权衡,特别适合需要快速搭建一个高效、自主可控图片服务的场景。

IT 2013-09-25 22:55:33 / 累计浏览 7,353

Storm:最火的流式处理框架

这篇讲的是Storm这个实时流处理框架为何能走红,以及它到底能解决什么问题。作者从Hadoop批处理延迟大的痛点切入,引出了Storm诞生的背景——专为低延迟的实时计算而生。文章拆解了Storm的核心卖点:它是一个分布式、高容错的系统,通过Topology(由Spout和Bolt构成)来处理数据流,并依赖Zookeeper进行状态管理,部署和横向扩展都相对简单。 摘要还梳理了Storm的实际应用情况,比如被淘宝、百度、Twitter等大公司用于实时用户画像分析或网站性能监控,以及它如何在迭代中加入Trident等新特性来解决重复计数等实际问题。最后,文章将Storm与Spark Streaming、HStreaming等竞争对手做了简单对比,并指出Storm虽然不是一个“开箱即用”的完整方案,但一旦解决好消息队列和状态管理等前置问题,其简单可扩展的架构优势就会显现出来。

IT 2013-09-23 23:09:27 / 累计浏览 5,535

Netty和Jetty的Java NIO 网络框架模型分析

这篇深度对比了 Netty 与 Jetty 这两个流行 Java 网络框架的底层 NIO 模型。作者从两者处理新连接请求的入口设计切入,揭示了它们截然不同的实现思路。 Netty 采用了专门的 Acceptor Reactor(由 Boss 线程负责),它只专注于监听和接收新的连接。一旦连接建立,便会根据连接序号对事件分离器(默认数量为 CPU 核心数的两倍)取模,将其分配给对应的 NioWorker 线程进行后续的读写监听。这种模型将“接收”与“处理”显式分离,但要求耗时操作必须异步提交,否则会阻塞整个事件循环。 相比之下,Jetty 的设计更接近经典的半同步/半异步模式。它在一个线程中通过同步的 `accept()` 方法阻塞等待新连接,就绪后生成变更事件注册到多路分离器,同样采用轮询策略分配负载。其代码结构往往被认为更直观。 作者最后提出了一个值得深思的问题:Netty 这种为“接收”单独设立线程池的方式,是否更利于处理短连接场景;而 Jetty 同步等待的传统模式,是否对长连接(如 HTTP)更友好?这背后的性能差异,还需要更精细的并发测试来验证。

IT 2013-09-15 22:40:29 / 累计浏览 4,173

Spark:一个高效的分布式计算系统

这篇讲的是Spark这个基于内存的分布式计算框架,作者从Spark与Hadoop的对比出发,深入介绍了其核心优势和关键特性。文章指出,Spark通过将中间结果保存在内存中,避免了Hadoop MapReduce频繁读写HDFS的瓶颈,从而在迭代运算密集的数据挖掘与机器学习任务中效率显著提升。 其核心创新在于RDD(弹性分布式数据集)的抽象,它使得开发者能以操作本地集合的方式来处理分布式数据,支持丰富多样的转换和行动操作,编程模型比Hadoop的Map和Reduce更加灵活。文章还剖析了RDD的存储、分区、容错机制(通过血缘信息和检查点)及其11种存储级别,这些共同构成了Spark高效、可靠的基础。 此外,文章梳理了Spark的生态系统,包括兼容Hive的Shark、用于流处理的Spark Streaming以及图计算框架Bagel,并列举了其多种运行模式与在业界的早期应用。总体而言,Spark并非Hadoop的替代品,而是一个更通用、更适合迭代计算的补充,它直接读写HDFS并支持在YARN上运行,为处理海量数据提供了新的高效选择。

IT 2013-09-05 23:22:19 / 累计浏览 2,691

苹果信息推送服务(Apple Push Notification Service)使用总结

这篇讲的是如何在 iOS 应用中接入并实现苹果官方推送服务(APNS)。作者从 APNS 的核心概念出发,明确了它免费、但不可靠且有大小限制的特点,并梳理了其依赖硬件 token 的工作流程。 文章的重点在于配置和实现。它详细拆解了从申请开发者证书、配置 App ID 与 Provisioning Profile,到使用 OpenSSL 命令合并生成最终推送证书的每一步,特别指出了证书环节容易踩坑。随后,通过具体的 Objective-C 代码示例,演示了如何在客户端注册通知、获取设备 token,以及处理应用在不同状态下收到的推送消息。最后还附上了用 PHP 编写的简易推送测试脚本,形成了一个从配置到验证的完整闭环。 如果你正为 iOS 项目接入推送功能发愁,尤其是对复杂的证书配置步骤感到头疼,这篇实操指南能提供清晰的路线图和避坑参考。

IT 2013-08-26 23:03:44 / 累计浏览 2,952

Impala:新一代开源大数据分析引擎

这篇讲的是Cloudera推出的Impala,一个旨在解决Hive查询速度瓶颈的开源大数据分析引擎。文章详细拆解了Impala如何借鉴Google Dremel的思想,采用列式存储(Parquet格式)和多层查询树架构,摆脱MapReduce的批处理束缚,从而在交互式查询上实现数量级的性能提升。 作者将Impala与同期的Shark、Apache Drill进行了横向对比。Impala的优势在于相对成熟的工程实现和快速的查询响应,但其容错机制较弱,且开源生态初期主要绑定Cloudera自家发行版。相比之下,基于Spark的Shark在内存计算和容错性上更有优势,而Apache Drill则更具平台开放性,尽管当时开发进度稍慢。文章通过性能对比图表指出,尽管Impala和Shark都远超Hive,但与Amazon Redshift等商业MPP数据库仍有差距。 文章的最终观点是,大数据分析的未来不在于某一技术的独胜,而在于Hadoop生态(如YARN)将兼容并包,让不同引擎各司其职——Impala这类系统擅长秒级交互查询,而MapReduce则继续处理大规模批处理任务。这场技术竞争正推动大数据分析变得更成熟、易用和普惠。

IT 2013-08-21 13:29:15 / 累计浏览 1,788

在线状态服务在网站系统中的应用

这篇讲的是如何为一个百万级同时在线、日均亿级PV的网站构建高效的在线状态服务。作者从前篇Facebook聊天架构分析中提取出“在线状态服务器”这一通用模块,指出在普通网站中,它主要维护用户活跃列表,通常通过客户端定时发送心跳包来实现。 挑战在于,当用户量巨大时,服务需要承受极高的心跳包请求压力。文章对比了三种实现思路:最常见的PHP+MySQL方案会因数据库成为瓶颈;改用Redis虽能缓解存储压力,但PHP本身处理能力有限;最终,作者提出用C/C++开发专用HTTP服务器,整合精简协议处理与高速内存数据结构,结合libevent等库,有望在单机上轻松达到每秒万级请求的处理能力。 文章从实际性能瓶颈出发,逐步推导出一个针对性的技术方案,不仅分析了不同技术栈的优劣,也给出了具体的性能预期。文末作者还邀请有兴趣的开发者一起交流实现。

IT 2013-08-21 13:24:10 / 累计浏览 2,213

[译文]关于移动Web性能的5个神话

Sencha的CEO Michael Mullany撰文回应了此前引发热议的“移动Web应用为何慢”一文,他指出该文数据虽基本正确,但解读存在偏差且忽略了更关键的图形性能。文章系统驳斥了五个关于移动Web性能的常见误解。 首先,移动Web性能瓶颈主要在于浏览器渲染优化、DOM操作和GPU加速,而非JavaScript本身。其次,过去四年超过50%的JavaScript性能提升源于软件优化,而非单纯依赖硬件升级。再者,移动浏览器性能远未停滞,不同浏览器在各自领域存在10倍以上的差距,优化空间巨大。同时,未来的硬件迭代将通过更快GPU、内存带宽和多线程并行化持续带来性能飞跃。最后,现代浏览器采用的增量垃圾收集机制已大幅改善停顿问题,垃圾回收不再是无法逾越的性能杀手。 作者结合iOS和Android设备长达四年的性能测试数据,展示了JavaScript与DOM操作性能的显著提升,这些进步远超摩尔定律预期。文章强调,优秀的开发者使用现代Web框架能够构建出体验流畅的移动应用,性能的持续进化让开发者对移动Web的未来充满信心。

IT 2013-08-21 13:13:54 / 累计浏览 2,934

关键词推荐技术介绍

这篇文章深入讲解了关键词推荐技术在竞价广告系统中的核心作用。作者从赞助商搜索广告的选词困境出发,对比了Google、百度和阿里巴巴等主流平台的关键词推荐工具,阐明其共同目标:帮助广告主扩展选词思路,挖掘高价值词,从而提升产品曝光并精准获客。 文章重点剖析了推荐系统的两种主流方法:基于种子词推荐和基于产品(offer)推荐。尤其详细拆解了阿里巴巴国际站P4P背后的“先知平台”技术实现。该平台巧妙运用了自然语言处理、信息检索及分布式计算架构,通过线下挖掘与线上实时计算相结合的方式,从海量查询日志中高效匹配出与产品相关的关键词,并保证相关性与系统响应速度。 整体来看,这篇文章清晰展现了关键词推荐如何串联起广告主、平台与用户三方,并通过具体案例和架构图,将抽象的技术原理讲得直观易懂,为理解搜索广告的底层引擎提供了一个很好的切入点。

IT 2013-08-13 13:09:09 / 累计浏览 2,654

个性化实时计算系统及其应用探索

这篇来自阿里技术团队的文章,分享了他们如何应对电商场景下用户兴趣实时变化的挑战。作者从淘宝搜索个性化的实际需求出发,介绍了团队设计的个性化实时计算系统PORA。 PORA是一个基于HBase与Storm的实时流计算系统,其核心在于从日志通道订阅用户行为,并通过三个Storm组件(解析、计算、更新)快速完成数据处理与存储,端到端延迟约300毫秒。这种“离线计算、实时服务”的架构,使得应用方能便捷地获取到用户最新的兴趣偏好。 文章重点阐述了系统在搜索重排序等场景的应用:在商品的相关性排序基础上,融入用户的性别与价格偏好进行个性化调整。实验数据表明,该方案上线后使整体成交金额提升了约2%,其中客单价的提升尤为明显。但作者也客观地指出,由于能获取明确性别画像的用户和Query占比有限,点击率与转化率的提升尚未达到预期。 最后,文章探讨了未来的优化方向,包括深化更多偏好维度的挖掘,以及通过动态调整个性化商品的展现比例与混合排序来提升用户体验。

IT 2013-08-13 13:04:08 / 累计浏览 5,671

谈谈Facebook的聊天系统架构

这篇讲的是Facebook在2009年公开的聊天系统核心架构。作者从一份内部PDF中的架构图出发,清晰地拆解了支撑数亿用户实时聊天的四个关键模块及其设计考量。 整个系统分为Web Tier(用PHP处理业务逻辑)、Chatlogger(C++开发的消息存储层)、Presence(C++编写的在线状态服务)以及Channel Cluster(基于Erlang和Mochiweb开发的服务器推送通道)。作者着重分析了每个模块的选型逻辑:Chatlogger需要应对海量历史数据,因此依赖Cassandra/HBase;Presence将用户在线状态全部存于内存以追求极致性能;Channel Cluster则通过保持长连接和本地缓存在线列表,实现了高效的实时推送,并减轻了Presence的压力。 文章不仅解释了“是什么”,还点明了“为什么”——例如为什么Presence不用PHP+Redis,为什么Comet服务器需要做二次开发。作者最后总结道,这个架构设计本身已经非常清晰透彻,但在实际应用中,仅靠整合现有开源组件远远不够,必须根据自身技术栈进行深度定制和二次开发,才能应对真正的规模化挑战。