IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者
首页 / 龙浩的blog
IT 2012-09-16 23:18:32 / 累计浏览 4,540

分布式知识的总结(V1.0)

这篇讲的是分布式系统领域那些零散却至关重要的知识,如何被系统性地梳理成一张清晰的“全景地图”。作者从CAP、BASE这类基础理论出发,一路梳理到分布式事务、一致性算法、服务治理等具体实践中的核心议题。 文章不仅罗列了知识点,更侧重于厘清不同概念和方案之间的对比与取舍。比如,在探讨分布式事务时,它没有停留在理论,而是对比了2PC、TCC、Saga等模式在一致性、性能和复杂度上的关键差异,并指明了它们各自最适用的业务场景。这种从原理到选型建议的贯穿,使得这篇总结超越了简单罗列。 对于正在应对分布式复杂性的工程师而言,这更像是一份实用的指南和速查手册。它帮助你在面对具体问题时,能快速回顾相关的核心概念与主流方案的优劣,从而做出更合理的设计决策。文末对分布式知识未来的演进方向也给出了自己的思考,为这份V1.0的总结留下了开放的接口。

本机暂存
IT 2012-06-07 00:16:32 / 累计浏览 3,520

DDOS攻击解决过程

这篇讲的是一次真实的服务器安全事件:运维团队发现某天凌晨的流量异常激增,导致核心API服务响应延迟甚至超时,业务几乎瘫痪。 作者从紧急排查切入,通过分析监控日志和网络流量,迅速锁定了这是一次DDoS攻击。文章详细拆解了攻击的混合特征——不仅有大流量的UDP洪泛,还有消耗连接数的HTTP慢速攻击,让防御系统一度陷入两难。 解决过程体现了分层应对的思路:首先紧急联系云服务商启用高防IP进行流量清洗,挡住第一波冲击;随后在应用层配置WAF规则,精确拦截恶意慢速请求;同时优化了服务器自身的连接超时设置。整个处理耗时约三小时,服务最终完全恢复。 文章最后复盘了防御短板,比如预案不足导致初期响应仓促,并提出了建立分级预警、定期演练攻击场景等长期加固建议。

本机暂存
IT 2012-04-07 15:09:27 / 累计浏览 3,620

Linux kernel 性能压力下的优化实践(V0.1)

这篇讲的是Linux内核在高压场景下,如何通过一系列调优来提升性能。作者从一次线上服务的CPU使用率波动事件切入,发现常规的监控工具难以准确定位瓶颈。随后,文章详细拆解了针对进程调度(CFS)、内存回收(kswapd)以及网络协议栈(TCP)的几项关键调整,例如通过修改sysctl参数来减少锁竞争、调整内核预读窗口优化磁盘I/O,并给出了优化前后的部分数据对比。 有趣的是,作者在文末坦率地附上了发布后收到的微博质疑链接。这场讨论的核心在于,部分优化参数的修改是否具有普适性,以及在生产环境中直接应用的潜在风险。文章与其说是一份“标准答案”,不如说是一次公开的实践复盘,它展现了理论调优与现实生产环境复杂性的碰撞。 对于读者而言,这篇文章的价值不仅在于提供了几条具体的排查思路和可试的调优选项,更在于它示范了如何面对技术方案的争议——将结论交由社区审视,在讨论中修正认知,这本身也是技术迭代的一部分。

本机暂存
IT 2012-04-07 14:43:40 / 累计浏览 2,340

Google Guava V11 中的Cache操作

这篇讲的是 Java 生态中广受欢迎的本地内存缓存组件 Google Guava Cache,并聚焦于 V11 版本带来的核心操作与新特性。作者从实际应用场景出发,清晰地拆解了 Guava Cache 的主要功能点:它不仅仅是一个简单的键值存储,更提供了基于容量、时间、引用等多种灵活的驱逐策略,确保缓存既能高效利用内存,又能保持数据的“新鲜度”。 文章特别提到了 V11 版本中引入的重要增强,比如新增的 `RecordStats` 统计功能,能让你轻松监控缓存的命中率、加载耗时等关键指标,这对于性能调优至关重要。同时,也对 CacheBuilder 的构建方式做了细致讲解,展示了如何通过流畅的 API 链式配置出满足业务需求的缓存实例。 对于开发者而言,这篇文章的价值在于它不仅解释了“是什么”,更侧重于“怎么用”和“为什么好”。它帮助读者理解,Guava Cache 如何以极低的集成成本,为单机应用提供高性能、细粒度控制的缓存能力,尤其适用于需要快速访问且允许短暂不一致的场景。如果你正在设计本地缓存方案,文章中对策略选型的讨论会提供直接的参考。

本机暂存
IT 2012-03-12 23:39:12 / 累计浏览 2,800

Spring的RMI , Http Invoker, Hessian测试结果

这篇讲的是作者对 Spring 生态中三种经典远程调用方案——RMI、Http Invoker 和 Hessian——进行的一次横向性能与功能测评。文章没有停留在概念讲解,而是直接给出了配置细节和测试环境搭建过程,实打实地跑出了数据。 核心对比聚焦在几个关键维度上:传输效率、序列化方式、防火墙穿透能力以及使用的便捷性。测试结果清晰地揭示了它们的差异:RMI 性能出色但受限于 Java 生态且对网络配置敏感;Http Invoker 依赖 HTTP 协议,穿透性好且配置相对简单,但性能稍有折损;Hessian 作为自有的二进制协议,在跨语言支持和效率上取得了不错的平衡,但额外引入了依赖。 作者的分析并非简单评判优劣,而是指出了它们各自的最佳应用场景。例如,对于纯 Java 内网服务且追求极致性能的场景,RMI 仍是有力选项;若服务需要穿越复杂的防火墙环境,或调用方技术栈不统一,Http Invoker 或 Hessian 则更为合适。这些基于实测的结论,为技术选型提供了非常具体的参考依据。

本机暂存
IT 2012-03-04 17:43:27 / 累计浏览 3,540

Tumblr架构 – 页面浏览量150亿/月并且比Twitter更难拓展

这篇讲的是 Tumblr 如何在每月 150 亿页面浏览量的超高负载下运转,以及为何它的扩展难度被形容为比 Twitter 更大。文章从 Tumblr 庞大的业务规模和技术选型出发,深入剖析了其架构的核心矛盾。 作者指出,Tumblr 早期大量依赖 PHP 和 MySQL,这在应对爆发性增长时遇到了严峻挑战。文章具体分析了它们如何处理动态与静态内容的分离,如何引入 Cassandra、Voldemort 等 NoSQL 技术来分担 MySQL 的压力,以及如何通过缓存、异步任务队列等手段构建起一个混合的、逐渐演进的复杂系统。 文章的核心观点并非单纯介绍技术栈,而是揭示了“快速开发”与“架构债务”之间的经典权衡。Tumblr 的案例表明,在业务高速增长期,许多决策是“正确的紧急应对”,却为长期扩展埋下了伏笔,使得后续的每一次大规模重构都异常艰难。 这些来自一线的实战经验,为所有面临类似增长曲线的技术团队提供了一面镜子:如何在速度、资源与未来可持续性之间找到那个动态平衡点。

本机暂存
IT 2011-11-24 00:00:57 / 累计浏览 1,640

通过Sonar来提高类的内聚性

这篇文章聚焦于面向对象设计中“高内聚”这一核心原则。作者从开发者在实践中常遇到的困惑切入:如何准确判断一个类的内聚性是否足够高?传统上,我们依赖主观经验和代码审查,但缺乏客观的量化标准。 为此,文章引入了代码质量平台Sonar作为解决方案。它详细说明了Sonar如何通过其内置的LCOM(Lack of Cohesion of Methods,方法内聚缺乏度)等指标,来具体计算和评估一个类中数据与方法的关联紧密程度。这意味着,你可以获得一个清晰的分数或评级,而不仅仅是模糊的“感觉这个类职责有点多”。 最关键的部分在于,文章不仅介绍了工具,更分享了实践路径。它结合了Sonar的分析结果,指出了如何根据指标去重构:例如,将操作不同数据字段的方法拆分到不同的类中。这种“指标驱动”的改进方式,让提升内聚性从一个抽象目标变成了一个可执行的步骤。对于希望系统化提升代码质量的技术团队而言,这提供了一套可落地的评估与改进思路。

本机暂存
IT 2011-11-23 23:56:28 / 累计浏览 5,320

Nginx 还是 Varnish?

这篇讲的是,在Web架构中,选择Nginx还是Varnish做HTTP加速和缓存层,这个经典的“甜蜜烦恼”。作者从实际部署场景出发,拆解了这两款顶级工具的核心差异。 核心对比在于它们的角色定位:Nginx更像一个全能型的反向代理和负载均衡器,同时兼具出色的静态文件服务和基本的缓存能力,适合作为架构的“入口门卫”。而Varnish则是一个“偏科生”,它牺牲了部分通用性,专注于将HTTP加速和缓存做到极致,其VCL(Varnish Configuration Language)提供了对缓存策略像素级的灵活控制。 两者的关键差异直接决定了它们的适用场景。如果需要一个稳定的流量网关,并希望用单一组件解决静态服务、代理和简单缓存等问题,Nginx是更直接、更一体化的选择。而如果业务场景对页面缓存性能有极高要求,流量模式复杂,需要编写极其精细的缓存规则(例如根据URL、Cookie或设备类型做差异化缓存),那么Varnish的专用性和性能优势会更明显。 文章也暗示了两者并非互斥,在许多生产环境中,它们常被组合使用:让Varnish作为前端缓存猛将,Nginx在后面处理静态资源和动态请求的代理分流。这种搭配既发挥了Varnish的缓存性能,又利用了Nginx的生态和多功能性。最终选型,还是要回到你具体的业务流量、缓存策略复杂度以及运维团队的技术栈偏好上来判断。

本机暂存
IT 2011-11-13 21:23:52 / 累计浏览 2,780

结对编程实践

这篇讲的是结对编程在实际项目中的应用与价值。 作者从一个常见的开发痛点出发:很多程序员习惯抱怨“代码太烂”,却难以具体指出何处需要改进。他坦诚自己也有类似问题,并提出了一个核心观点——个人写出好代码往往是偶然,写得不好却是常态,因此必须借助团队的力量来发现问题。 在项目业务编码临近尾声时,作者没有选择停滞,而是与业务开发人员结对,从测试代码入手展开质量改善工作。他们通过结对协作,相互审查与讨论,共同定位代码中的坏味道,并以此为契机优化业务流程。这不仅仅是一次代码层面的重构,更是一种团队协作模式的实践,将质量改进融入日常开发节奏中。 文章没有停留在理论层面,而是展示了如何将结对编程落地为具体的“代码体检”与协作改进流程,为团队在项目后期如何持续提升代码质量提供了可操作的思路。这种从测试代码切入、以协作为驱动的实践方式,对日常开发中的质量保障有直接的借鉴意义。

本机暂存
IT 2011-10-17 22:40:21 / 累计浏览 2,920

用YAML构建数据测试DAO层

这篇讲的是如何给枯燥低效的DAO层测试“减负”。作者从开发者日常的痛点出发:测试DAO层时,总得手动拼装数据、调用方法、再肉眼核对数据库状态,这套流程繁琐又容易出错。 文章提出了一种更优雅的思路:将测试数据用YAML格式集中管理。通过预先定义好符合结构的测试数据配置,测试时程序可以自动加载这些数据并执行验证,从而用配置化、可复现的方式替代重复的人工操作。 核心方案在于将测试数据与测试逻辑解耦。YAML文件清晰描述了测试场景下的数据状态,让测试用例本身更聚焦于行为的验证。这种方法不仅能显著提升测试编写与执行的效率,也使得测试数据更易于维护和复用,确实能达到事半功倍的效果。

本机暂存
IT 2011-10-17 22:40:15 / 累计浏览 4,760

Varnish VS Nginx测试报告

这篇技术博客直接深入了 Varnish 和 Nginx 在性能测试中的正面对决。文章并非泛泛而谈,而是从具体的配置环境出发,对两者在高并发下的响应速度、吞吐量以及资源消耗进行了细致测量。 测试结果清晰地揭示了二者的核心差异:Varnish 在处理纯静态缓存时,因其高效的内存管理和 HTTP 协议优化,表现出了惊人的冷启动效率和极高的缓存命中率;而 Nginx 则凭借其更为平衡的资源占用(尤其是更低的 CPU 消耗)和强大的动态内容处理能力,在复杂的应用场景下展现出更高的通用性与稳定性。 文章特别分析了在长时间压力测试下两者的内存表现,Varnish 的优势窗口与 Nginx 的平稳曲线形成了对比。结论并非简单地判定孰优孰劣,而是指出:对于需要极致缓存性能的 CDN 或静态资源分发场景,Varnish 是利器;而对于需要兼顾动态代理、负载均衡和静态缓存的 Web 服务器或反向代理角色,Nginx 往往是更务实的选择。这篇报告为不同技术选型提供了清晰、数据驱动的参考。

本机暂存
IT 2011-09-25 22:50:39 / 累计浏览 4,020

编程珠玑:对DAO层的一点修改

这篇讲的是作者对DAO层数据传递方式的一次优化调整。起因是原先的Domain对象设计并未考虑序列化需求,为了方便数据库查询,直接让领域对象继承了一个BaseDomain基类。这种做法在早期虽然简单直接——只需将动态参数放入一个Map对象,就能在iBatis的映射文件中通过`map.xx`的形式方便取用——但也让Domain层与持久化技术产生了不必要的耦合。 作者的解决方案是,将参数的传递职责从Domain对象中解耦出来,更清晰地分离了领域模型与数据传输的界限。这意味着对DAO层的数据封装逻辑进行了一次“瘦身”,让Domain对象回归其领域表达的本职,而动态参数的封装则由更合适的载体来完成。这种修改不仅使代码结构更清晰,也为后续可能需要的序列化或跨层数据传递扫清了障碍,体现了在简单实现与良好架构之间做出的权衡与演进。

本机暂存
IT 2011-04-02 14:16:12 / 累计浏览 8,320

Java heap dump触发和分析

这篇文章聚焦Java应用内存泄漏排查的关键一步——heap dump的获取与解析。作者指出,当需要定位堆内存被何种对象占满时,常规的jstat监控已力不从心,此时获取一份精确的堆内存快照(Heap Dump)就成了分析的核心。 文章系统梳理了触发dump的几种实战方法:可以直接使用jmap命令行工具,或通过jconsole的图形界面操作;更稳妥的方案是在应用启动时配置JVM参数`-XX:+HeapDumpOnOutOfMemoryError`,让它在OOM发生时自动生成现场。文中也提及了hprof,但明确指出其严重拖慢JVM性能,仅适用于调试环境。 在分析环节,作者对比了三款主流工具。IBM HeapAnalyzer能够直观列举堆内存使用状况,定位泄漏源头。JDK自带的jhat则将堆对象转为HTML页面展示,并支持OQL查询语言进行深度探查。而Eclipse Memory Analyzer (MAT) 作为一款功能强大的图形化工具,集成了从获取到分析的完整流程,适合快速诊断。文章最后还补充了一个实用细节:对于NIO等框架直接向操作系统申请的堆外内存,需通过`-XX:MaxDirectMemorySize`参数单独配置与监控。

本机暂存
IT 2011-02-17 23:15:34 / 累计浏览 3,480

项目中:覆巢之下,岂有完卵

这篇讲的是作者在大公司做项目时的一次深刻认知转变。起初,他认同一种流行说法:大项目即便整体失败,也能从中拆解出若干小项目,继续创造价值。毕竟软件组件似乎可以抽象复用。然而,当他亲身完成同事带的项目后,用亲身实践彻底否定了这一点。 他用一句古话“覆巢之下,岂有完卵”精准概括了残酷现实。文章直指大项目失败往往并非技术局部的问题,而是涉及资源、节奏、团队士气甚至方向的全面崩塌。在这种“覆巢”之下,试图“完卵”般保全某个子项目几乎不可能——资源被抽调,上下文断裂,人心涣散,原先认为可复用的部分早已失去生存的土壤。这个从期待到幻灭的过程,揭示了大型项目管理中一个常被忽略的整体性风险。它提醒我们,在评估系统风险时,必须超越简单的组件拆解思维,看到项目作为一个生命体的不可分割性。

本机暂存