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

系统架构

共 731 篇文章

IT 2016-02-06 10:45:18 / 累计浏览 5,799

osx平台上lol英雄联盟launcher启动器的分析实现

这篇讲的是,一位LOL玩家因为只有Mac电脑却玩不了国服、只能忍受外服高延迟,从而萌生了自己动手破解OSX客户端连接国服想法的技术实践。 作者通过对比分析发现,腾讯运营的国服与Riot运营的国际服在启动流程上存在关键差异:国服是先登录再选区,而国际服是先选区再登录。核心突破口就在于,国服的登录认证信息是作为CLI参数(如gameSignature)传递给LolClient.exe的。这意味着,只要能在OSX上模拟出这一自动登录过程,就有可能连上国服。 为实现这一点,作者在Windows上深入剖析了国服启动器(lol.launcher_tencent.exe)的进程行为。他发现该进程监听了本地8393等多个TCP端口,并通过抓包分析,明确了它与LolClient.exe之间的本地通信协议。整个分析过程从目录结构对比、启动参数截获,到进程树与本地通信的逆向,层层递进。 最终结论是,理论上只要在OSX上实现一个功能等价的Launcher,替代Windows版启动器的角色,就能驱动OSX版客户端完成国服登录并进入游戏。文章完整展示了一次从需求出发、通过逆向分析定位核心机制并得出可行方案的技术探索路径。

IT 2016-01-27 00:01:32 / 累计浏览 4,350

微博分布式存储作业实现方法

这篇讲的是微博如何在单表60亿条数据的极端场景下,设计分布式存储系统。作者从新兵训练营的实际练习题出发,拆解了社交场景下“查最近微博”和“翻阅用户全部微博”两大核心访问需求,以及由此带来的扩展性、成本与高可用设计挑战。 文章详细讨论了基于用户ID(UID)的范围分片与哈希分片策略,并对比了各自的利弊。重点分享了如何通过“冷热数据分离”来平衡成本与性能:近期数据(如最近10天)采用UID结合权重哈希的方式,均匀分散高并发读取压力;历史数据则按时间维度(如半年)分库,便于管理与冷存储。针对复杂的分页跳转查询,还提出了增加二级索引表等具体的索引设计思路。 文中展示了多个投稿案例,包括一种通过ZooKeeper动态调整分片策略、以灵活应对流量突变的方案。整体思路清晰,从约束条件到具体技术选型层层递进,为处理超大规模社交数据的存储与查询提供了切实可行的架构参考。

IT 2015-07-23 13:43:49 / 累计浏览 6,575

如何设计用户登录

这篇讲的是如何设计一个灵活可扩展的用户登录系统。作者从最常见的用户名+密码登录入手,指出当需要集成微博、QQ等第三方登录时,传统做法——在Users表中不断新增列来存储OAuth信息——会导致表结构日益臃肿,维护成本很高。 核心解决方案是将“用户资料”与“认证信息”进行分离。具体来说,将Users表精简为只存放用户个人资料(Profile);而将登录认证(Authentication)过程独立出来。本地密码登录维护一个LocalAuth表,而微博、QQ等第三方OAuth登录则统一到一个OAuth表中,通过`oauth_name`字段区分不同来源。 这种设计的好处显而易见:添加新的登录方式(如SAML)只需新增记录或表,无需改动用户主表;一个用户可以绑定多种登录方式;同时,由于Users表不再存放口令等敏感数据,系统安全性也得到了提升。

IT 2015-07-17 13:24:44 / 累计浏览 4,470

聊聊移动端跨平台开发的各种技术

这篇讲的是移动端跨平台开发技术的全景分析。作者从React Native的流行切入,将现有的解决方案梳理为四大流派:Web(Hybrid)、代码转换、编译和虚拟机,并深入剖析了各自的原理、优劣与适用场景。 在Web流中,文章跳出了“DOM性能差”的常见误解,指出其根本瓶颈在于早期Android WebView实现粗糙、CSS计算复杂以及上层API限制了底层优化能力。而代码转换流则介绍了如J2ObjC等工具如何在不改变官方技术栈的前提下,实现iOS与Android间高达70%的代码复用(以Google Inbox为例),同时也分析了不同转换方向与目标语言工具的成熟度差异。 作者并未止步于技术罗列,而是结合具体项目(如React-Canvas、HTML-GL)和历史案例,点明了各种路径的现实挑战。例如,Web流在享受CSS丰富表现力的同时,面临着功能滞后于原生API的困境;而代码转换的效率则高度依赖工具链的完成度。整篇文章为开发者在“一次编写,处处运行”的理想与平台差异化的现实之间,提供了清晰的技术路线图与决策参考。

IT 2015-05-29 20:06:50 / 累计浏览 17,341

微信扫码登录网页实现原理

这篇文章从作者的一次腾讯面试经历出发,深入剖析了微信扫码登录网页版的核心技术原理。作者通过浏览器工具抓包,逐步拆解了整个流程:首先,网页会生成一个包含唯一临时ID(uid)的二维码;同时,前端会通过创建一个长连接(长轮询)来持续监听该uid的扫描状态。如果扫码超时(约27秒),服务器会返回408状态码;一旦手机端扫码,即上报uid与手机令牌的绑定关系,长轮询便会收到201状态码,网页随即跳转至确认页面。最终用户在手机确认后,服务器才会下发授权令牌,完成整个登录交互。 文章的巧妙之处在于,它清晰地揭示了微信如何利用“长轮询”实时性好、轮询次数少的特点,高效同步了网页与手机端的状态。同时,通过临时uid、网络断开后令牌失效等机制,在便利性与安全性之间取得了不错的平衡。作者结合实际的网络请求代码片段和状态码截图,让这个看似复杂的流程变得直观易懂。

IT 2015-05-11 22:58:20 / 累计浏览 2,471

软件开发中的最佳实践是什么?

这篇讲的是“最佳实践”这个在软件开发领域被频繁使用、却又充满歧义的术语。作者从自身发布的教程出发,犀利地指出,这个词在不同语境下至少有三种截然不同的面貌。 他将其梳理为一个“连续统一体”:最理想的状态是实践经验证优于其他所有方法;更常见的是被标准机构或行业广泛接受的“标准化实践”;而最要警惕的,则是用它作为挡箭牌、让个人主张显得更权威的“愤世嫉俗”用法。 作者进而列举了敏捷、自动化测试、持续集成、设计模式、代码审查等一系列常被奉为圭臬的行业实践。他抛出了关键问题:在共同认可的行业智慧与盲目追随之间,界线何在?一个实践如何从“因为别人说好”,进阶到经过客观评估、证明对特定团队和组织确实有效? 文章的真正目的,是提供一套启发式框架,帮助开发者穿越技术热情与组织实际效益之间的张力。它鼓励读者超越口号,基于可衡量的数据和事实去审辨,最终弄清楚哪些所谓的“最佳实践”,才是对你真正有益的实践。

IT 2015-03-26 13:34:46 / 累计浏览 3,930

Hermes:来自腾讯的实时检索分析平台

这篇讲的是腾讯数据平台部推出的实时检索分析平台Hermes。它瞄准的是一个非常具体的痛点:当数据量达到千亿级别、维度上万时,如何还能做到秒级响应的多维交互式分析。 Hermes为营销分析、系统运维监控、长期趋势分析以及探索性分析等场景提供了一套完整方案。它的核心思路在于,针对海量数据重新设计了存储和计算引擎。例如,通过嵌套列存储、位图计算、前缀压缩等技术,有效规避了传统数据库和早期搜索引擎在超大规模索引下内存消耗大、扩容困难、恢复慢的问题。文章特别将Hermes与Solr、ElasticSearch做了定位对比:后者更擅长小规模数据的全文检索,而Hermes则为亿级到万亿级的数据仓库提供索引支持与即席分析能力,旨在成为数据仓库的高效分析层。 本质上,Hermes是在大数据领域,为“即查即所见”的敏捷分析体验提供的一个经过生产验证的基础设施选型参考。

IT 2015-02-26 14:07:49 / 累计浏览 2,433

使用逻辑时钟重述paxos协议

Paxos协议以其晦涩难懂而闻名,但这篇技术博客提供了一个清新的视角:用逻辑时钟来重述它。作者认为,一旦从带时钟同步的RPC协议出发,复杂的共识流程就变得直观起来。 文章首先构建了一个基于逻辑时钟的通信框架。它引入一个全局计数器(globalClock)来产生全局递增的时间戳,规定所有网络消息必须携带时间戳,且接收方拒绝处理“过时”的请求。这个简单的同步机制,为后续的协议设计打下了确定性基础。 在此基础上,Paxos的两个阶段被清晰地映射为两类带时钟的请求。Proposer在Prepare阶段(设置时钟、广播提案号)和Accept阶段(发送具体提案)中,都遵循“时钟必须严格递增”的规则。Acceptor则依据收到的消息时间戳与本地时钟的比较,来决定是接受还是拒绝。这样一来,协议中复杂的冲突避免和提案推进,被转化为了对时钟值的比较和递增操作。 更进一步,文章指出可以摆脱中心化的全局时钟服务。每台机器的本地时钟可由一个二元组(轮次编号roundNumber, 服务器ID)构成。通过定义先比较轮次再比较ID的规则,保证了分布式环境下时间戳的全局唯一性和单调性,使得整个协议更加贴近实际部署场景。 总而言之,这种重述方式将分布式共识中抽象的“提案编号”竞争,转化为对逻辑时钟值的单调递增和比较操作,让Paxos协议的内在逻辑——即如何利用确定的全局顺序来避免冲突、达成一致——变得异常清晰。

IT 2015-02-26 14:05:46 / 累计浏览 3,570

Java跨语言调用实现方案

这篇文章探讨了在大型分布式Java系统中,如何在不改变原有POJO发布方式的前提下,实现跨语言RPC调用。作者指出,随着业务扩展,上层可能采用PHP、Ruby等技术,而底层服务又可能需要用C++、Python来追求更高性能,这就对现有的、基于Java的RPC框架(如Spring Remoting)提出了跨语言兼容的挑战。 文章首先梳理了业界三大主流方案:Google Protocol Buffers、Facebook Thrift 和 Apache Hadoop Avro。作者分析了各自的优劣:Protocol Buffers 的序列化格式高效但RPC能力弱,生成代码有侵入性;Thrift 提供了完整的服务栈和强大的接口支持,但与现有Java RPC体系不兼容;Avro 的动态类型机制灵活,但学习成本较高。 最终,作者提出了一种“扬长避短”的混合解决方案:核心采用Protocol Buffers的序列化格式和代码生成能力,服务接口定义借鉴Thrift的模式,并兼容现有的RPC传输层;同时,利用Avro的Schema机制来实现对原有POJO对象的无缝序列化与反序列化。这套方案旨在保留现有Java RPC架构的同时,优雅地打通多语言互操作。文章还留下了具体实现细节,为后续分享埋下了伏笔。

IT 2015-02-14 14:11:58 / 累计浏览 1,834

理想数据库客户端的准则

这篇讲的是,一位开发者从实际项目(Gittask)中遇到的数据库客户端“抽象漏洞”出发,思考了理想的数据库客户端应具备哪些特质。 作者认为,当前客户端普遍存在不足,理想的客户端应遵循三大准则:首先是“无损序列化与反序列化”,客户端应负责保持数据结构的完整性,确保存取的类型完全一致,避免开发者陷入繁琐的类型转换。其次是支持“混合持久化”,客户端应能统一接入不同后端数据库,让开发者可以为不同任务选择最合适的数据库。最后是实现“跨数据库的原子事务”,当操作涉及多个数据库时,客户端应保证操作的原子性,任何环节失败都能整体回滚,避免数据处于不一致状态。 文章还进一步探讨了,这种客户端应将复杂数据库操作抽象为 get、put、del 等基础操作,同时允许扩展调用特定数据库的独特功能。作者借此批判了ORM是抽象漏洞的观点,并提倡用独立的数据校验库配合此类客户端来构建模型。 这套准则指向一个更强大、更通用的数据库交互层,旨在减轻开发者心智负担,让多数据库架构的开发与维护变得更可靠、更简洁。

IT 2015-02-03 22:10:54 / 累计浏览 2,934

Email精粹

这篇讲的是电子邮件背后的传输机制——当你点击“发送”后,那封简单的文本文件是如何穿越网络最终抵达收件箱的。 文章从邮件的原始结构切入:它本质上只是一段带有特定格式“headers”的纯文本。接着,作者用一段真实的SMTP交互日志,清晰展示了邮件客户端如何与邮件服务器“对话”,一步步完成投递。这里有个关键细节:SMTP协议中的`MAIL FROM`和`RCPT TO`命令,可以与你看到的邮件正文头信息(From/To)完全不同,这正是BCC(密送)能隐藏收件人的底层原因。 那么,发送邮件的服务器如何找到目标邮箱的服务器?文章解释了DNS中的MX记录的作用,并通过`dig`命令实例加以演示。邮件在服务器间每跳转一次,都会添加一条`Received`头信息,由此可以完整追溯一封邮件的旅程。 文章也讨论了SMTP协议的先天不足——它源自一个更“单纯”的年代,缺乏验证机制,这为垃圾邮件和邮件伪造提供了便利。为此,作者简要介绍了SPF、DKIM、DMARC等现代邮件认证技术,它们共同构成了验证发件人身份、提升邮件可信度的体系。整体而言,这是一篇由表及里、揭开电子邮件技术面纱的扎实科普。

IT 2015-01-21 23:36:18 / 累计浏览 2,010

用MeCab打造一套实用的中文分词系统

这篇讲的是如何将原本为日文设计的高性能分词器 MeCab,成功改造为一个实用的中文分词系统。作者从 MeCab 基于条件随机场(CRF)的核心优势和中文资料匮乏的现状出发,分享了一次成功的“跨界”实践。 文章的核心方案是,参考一篇关键的日文博客和官方文档的训练指南,结合微软研究院的 backoff2005 中文语料来完成训练。作者详细记录了从准备符合 MeCab 格式的种子词典(例如,词典条目为 `义演,0,0,0,0,0,0`)到利用脚本进行参数估计的完整流程。文中提到,最终得到的系统不仅速度快(实测近 2MB/s),还支持 N-best 输出和用户词典定制等实用功能。 这篇文章的价值在于,它并非停留在理论介绍,而是提供了一条可操作的路径。通过作者在 Mac 环境下的亲测记录,读者可以了解如何利用一个强大的现有框架,为自己的中文 NLP 任务快速搭建起一个高性能的基础工具。

IT 2015-01-13 23:03:06 / 累计浏览 2,939

State Threads 回调终结者

这篇讲的是如何用 State Threads (ST) 这个仅3000行C代码的轻量级库,来终结高性能服务器开发中令人头疼的异步回调噩梦。作者从此前介绍的协程库 Protothreads 出发,引出了这个更适合服务器领域的“宝藏”项目。 文章的核心在于将 ST 与传统的事件驱动状态机(EDSM)进行对比。传统 EDSM 依赖异步回调,开发者需要将线性的处理逻辑拆解成一堆回调函数,心智负担沉重。而 ST 的巧妙之处在于,它在 EDSM 的内核之上,为每个网络连接抽象出一个“线程”概念。这个线程并非操作系统线程,而是由 ST 自己在用户空间调度的轻量级执行体。 ST 的调度器通过模拟 setjmp/longjmp 来切换这些“线程”的上下文,整个过程没有系统调用开销。只有当所有“线程”都在等待 I/O 时,才会触发一次真正的 select()/poll() 系统调用。这样,开发者可以用接近写多线程同步代码的直观方式(线性思维)来编写高性能网络程序,同时又享受事件驱动模型带来的低开销与高可扩展性,避免了回调割裂逻辑的复杂性。 文章还梳理了 ST 从网景、SGI 到 Yahoo! 的发展历史,并讨论了其 MPL/GPL 双许可证的兼容性细节。尽管这个库已稳定多年未再更新,但其“结合多线程编程简洁性与事件驱动性能”的设计思想,至今仍对理解服务器编程模型有重要启发。

IT 2015-01-11 23:51:00 / 累计浏览 2,798

从未降级的搜索技术-Hippo在线服务调度系统

这篇讲的是,在搜索团队经历了一次手忙脚乱的双11“搬机器”救援后,如何从零开始构建一个真正服务于在线系统的调度平台——Hippo。 故事要从一次教训说起。当年双11,团队为天猫和主搜分别预留了14倍和1倍的资源余量。然而流量突变,主搜压力远超预期,天猫却只涨了4倍。工程师们被迫手动迁移机器来救场,改配置、发数据、起进程,折腾一个半小时才勉强应对。更无奈的是,这种紧急操作往往还未必能准确命中流量高峰。每年大促都像一场无法预演的战役,让运维和开发都身心俱疲。 为了解决这些痛点——资源僵化、扩容迟缓、手动部署风险高,团队调研了当时主流的调度系统。但发现Yarn对于C++在线服务显得笨重,而FUXI和Mesos在资源回收上采用强制策略,可能影响在线服务的稳定性,这与搜索系统“高可用、资源分配稳定”的核心要求相悖。因此,他们决定自研一个专注在线服务的平台。 Hippo采用了两层架构:Master层负责核心的资源管理与调度,而具体的AM层则允许各应用定制自己的调度逻辑。它的设计核心在于保证在线服务的平稳运行:资源回收策略更为柔性,并针对海量数据(如40G索引、多GB模型)的快速分发和部署做了特别优化。这篇文章详细拆解了系统从需求诞生到架构落地的全过程,展示了一个为复杂在线场景量身定制的调度系统是如何思考的。

IT 2015-01-11 23:49:09 / 累计浏览 2,587

聊聊多线程程序的load balance

这篇讲的是,如何在一个常见的“接收者-工作线程池”模型中,主动优化负载均衡以提升性能。作者从一个大家熟悉的设计出发:一个 receiver 线程接收请求,放入队列,通过条件变量唤醒任意一个 worker 处理。他敏锐地指出,完全依赖内核的调度和负载均衡可能带来问题。 核心问题有两个:如果 worker 线程远多于 CPU 核心数,唤醒时几乎无法均匀分配到不同 CPU,导致某些核过载而某些核空闲,形成“伪并发”。其次,即使 worker 数量合理,内核的负载均衡也未必能确保将任务分配到不同的物理核心(避免争抢共享缓存和计算资源)。 对此,作者提出了应用层的“微调”方案。一方面,将 worker 线程数控制在接近或略小于 CPU 核心数。另一方面,更关键的是,通过线程绑定(affinity)固定 worker 在特定 CPU 上,并设计一个分级的条件变量唤醒机制。这能确保新任务被优先分配给空闲或低负载物理核心上的 worker,从而主动实现更优的负载分布。 文章通过精心设计的实验验证了结论。例如,将 worker 线程数从 240 降至 24 后,CPU 利用率从 2200% 提升至接近 2400%。启用绑定线程和分级唤醒后,处理 12 个并发任务时性能得到进一步提升。作者也发现,对于依赖内存缓存的任务(如 mmap 读文件),让 worker 集中在相邻 CPU 上反而可能提升性能,这体现了负载均衡策略需具体场景具体分析。 作者通过细致的对比实验表明,这些在应用层主动进行的微调,有时能取得比等待内核调度更优的效果。

IT 2015-01-11 23:45:41 / 累计浏览 3,493

从未降级的搜索技术-天猫SKU搜索

这篇技术文章详细拆解了天猫搜索从“商品级”跨越到“SKU级”的完整演进历程。作者直面传统搜索的痛点:当用户想买特定规格(如64G白色iphone6)时,旧引擎只能按商品维度返回结果,导致价格展示不准确、过滤和排序形同虚设。 文章核心聚焦于如何实现既能支持SKU粒度精准检索,又不造成海量数据冗余的难题。最终提出的“主表(商品)+子表(SKU)”二维架构是解决方案的关键:引擎能同时处理两个维度的查询,并形成“一主带多子”的结果结构,让过滤、排序等环节都能基于真实的SKU信息工作。 通过CSPU聚合、精准排序等具体场景的实现,该技术上线后在多个类目带来了可度量的收益,例如沙发类目平均IPvUV价值增长8.50%。这不仅是一次架构升级,更是将“尺码个性化”等精细体验从想法变为现实的基石。

IT 2015-01-05 23:24:30 / 累计浏览 2,852

如何做Xcode工程的工程化管理

这篇讲的是如何系统化地管理Xcode工程,解决多人协作时常见的混乱与低效问题。作者从项目代码冲突频繁、依赖管理繁琐、多环境打包易出错等实际痛点出发,分享了一套实战经验。 核心方案分为几个层面:对于大型团队,建议用子Project或Workspace搭配多个Project来划分功能模块,这能有效降低单一project.pbxproj文件的冲突概率。第三方库统一交由CocoaPods管理,显著减少了维护成本。针对多渠道、多测试环境的需求,利用Build Configuration来区分配置,并配合创建与之对应的Scheme来管理打包和执行流程。最后,通过编写xcodebuild命令行脚本,可以一次性完成多个渠道包的构建,大幅提升效率。 整套方法围绕“降低冲突、规范流程、自动化打包”展开,作者强调了共享Scheme和命令行打包在团队协作中的实用性。这些措施将工程管理从依赖个人自觉提升到了流程化的层面,有助于在复杂项目中保持秩序。

IT 2015-01-04 23:34:32 / 累计浏览 3,010

打造高性能高可靠的块存储系统

作者从为云计算提供底层支撑的角度出发,分享了如何构建一个高性能、高可靠的块存储系统。文章指出,为了解决云主机创建缓慢、物理硬件维护困难以及OpenStack原生架构中存储资源内耗等问题,他们选择了基于Ceph来搭建统一的分布式块存储。 方案的核心是将OpenStack的计算(Nova)、镜像(Glance)和云硬盘(Cinder)三大服务的后端存储统一到Ceph。这带来了显著的收益:虚拟机创建时间从分钟级大幅缩短至10秒以内,并支持了快速热迁移。同时,系统提供了灵活的云硬盘类型(性能型与容量型),单盘性能可达6000 IOPS、延迟低于2ms,并通过三副本机制实现了高达10个9的持久性。 文章还详细介绍了他们在软硬件选型(如全面转向SSD)、最小部署架构(12节点起步)以及集群平滑扩展方面的实践经验。通过这一系列改造,他们成功打造了一个既满足云主机快速供给,又能承载高性能数据库需求的存储基础设施。

IT 2015-01-04 23:20:13 / 累计浏览 4,899

Kubernetes – Google分布式容器技术初体验

这篇讲的是作者对Google开源容器集群管理系统Kubernetes的初步体验。文章从分布式服务框架的配置管理、调度等核心需求出发,审视了Kubernetes如何解决这些痛点。 作者重点分享了几个关键概念的实际感受。比如,作为基本部署单元的Pod,以及通过Replication Controller实现自动化的实例管理与故障恢复——定义好副本数后,系统能自动维持服务实例的总量稳定。针对分布式系统的服务发现难题,Kubernetes的Service通过一个固定的虚拟IP来代理一组Pod,并解耦了具体的配置服务。 不过,体验过程并非一帆风顺。作者指出,目前Kubernetes版本迭代快、文档滞后,推荐新手直接使用GCE(谷歌计算引擎)环境以减少障碍。同时,他也客观指出了现有实现的一些局限,比如Service发现依赖环境变量、大规模服务下的iptables性能挑战,以及生产环境所需的高可用性仍有待验证。 总体来看,文章清晰地勾勒出了Kubernetes令人兴奋的设计理念与自动化能力,同时也坦诚地探讨了其当前阶段面临的环境易变性与成熟度挑战,为有意尝试的开发者提供了一份非常务实的体验报告。

IT 2015-01-04 23:13:34 / 累计浏览 2,728

大规模Hadoop集群在腾讯数据仓库TDW的实践

这篇讲的是腾讯数据仓库TDW如何将多个小集群合并为单个超大规模Hadoop集群的实战。作者从集群碎片化导致的数据共享困难、资源利用率低以及运维成本高等痛点出发,剖析了从400台节点扩展到4000台时遇到的核心挑战——Hadoop的单点瓶颈。 为解决JobTracker的调度瓶颈,他们借鉴YARN和Corona,将计算引擎重构为三层架构。关键优化包括将单路心跳拆分为任务和资源两路心跳,引入细粒度的资源管理概念,并将调度模式从基于心跳的拉取变为ClusterManager主动下推。这使平均调度时间从80ms降至1ms,极大提升了扩展性与效率。 针对存储层的NameNode单点风险,TDW设计了“一主两热备”的高可用方案,通过日志同步保证热备节点能随时接管,将计划内服务停止时间从近2小时大幅缩短。 整个改造在未大幅变动外围调度系统的前提下,成功支撑了数千节点规模的单集群,体现了在工程复杂度与系统收益间的务实权衡。