• RocketMQ - 初探

    五月,我回到杭州实习,做了一点微小的工作,为接下来的正式入职做了一定程度的预热。期间对公司内部的中间件有了些许实践,但也仅仅是浅尝辄止,想想有些心悸,所以决定针对 RocketMQ 做点源码剖析的工作。为什么选择 RocketMQ?理由有五:(1)RocketMQ 是公司开源的一款高性能、高吞吐量的分布式消息中间件(内部代号 MetaQ),方便写文章;(2)理解 Message Queue,知其然知其所以然;(3)理解分布式消息中间件如何实现高性能的网络通信及异常处理(网络传输存在第三种状...

  • Why wait/notify must be called in a synchronized block

    在 Java 并发编程中,调用 Object wait/notify 方法的代码段必须要被包含在 synchronized 块中,接着即是耳熟能详的:调用 wait 方法时,先释放锁,然后线程进入阻塞状态,直至被 notify,然后重新尝试获得锁。看似一气呵成的一顿猛如虎的操作,其个中缘由到底是什么?有些我们看起来理所当然的东西,难道真的是理所当然的吗?本篇文章即谈谈,为什么调用 wait/notify 方法的代码段必须要被包含在 synchronized 块中。先从 官方文档 入手,官方...

  • 我对Raft的理解 - Two

    我们已对 Raft Leader 选举进行了理解,Leader 一旦被选举出来,对外提供服务,对内协调日志复制。日志复制是 Raft 共识算法最核心的部分,我们逐步递进的去理解 Raft 是如何通过添加限制条件来保证日志能够被正确的复制。Slide 11每个节点都维护了一份私有的日志的拷贝,节点存在宕机的风险,为了保证宕机后能够恢复日志,日志需要持久化存储在类似磁盘等介质中。日志由一组日志项组成,每个日志项(Log Entry)包含三部分:Index、Term 和 Command。Inde...

  • 我对Raft的理解 - One

    重新阅读了 Raft 论文,结合 John Ousterhout 在斯坦福大学的课程视频,对 Raft 重新梳理了一遍,并决定用文字记录下来。Raft 是一个共识算法,何为共识算法?通俗的说,共识算法的目的就是要实现分布式环境下各个节点上数据达成一致。那么节点的数据为什么会出现不一致?原因有很多,例如节点宕机、网络延迟、数据包乱序等等。但是要注意的是,Raft 并不考虑存在恶意的节点的情况,也就是说,不存在主动篡改数据的节点。所以可以理解为:允许节点宕机,但是只要节点没有宕机,那么它就是正...

  • 2017年度总结与2018年度计划

    今年事情比较多,重要的事情有两件,一是还有 6 个月就要毕业,这意味着留给我在学校里纯粹打磨技术的时间已经不多了;二是确定了自己的职业生涯将会从阿里开始,这意味着什么我暂时还不确定。去年此时,我认为自己一定会去试水一大堆公司,但是实际上我只投了寥寥几个,整个过程比我预想的要顺利,我想究其原因自然离不开这几年几乎不间断的积累,但是也有运气的成分在。上半年读了不少 paper 和技术书籍。在阅读的过程中,我喜欢在学习到一个新的知识点后,尽可能的通过一段程序去验证,那么理解的程度很可能会从「 意...

  • 如何实现一个Web Server

    最近重构了去年造的一个轮子 Vino。Vino 旨在实现一个轻量并且能够保证性能的 Web Server,仅关注 Web Server 的本质部分。在重构过程中,Vino 借鉴了许多优秀开源项目的思想,如 Nginx、Mongoose 和 Webbench。因此,对比上一个版本的 Vino,现在的 Vino 不仅性能得到提升,而且设计也更为优雅、健壮 :D。本文将会对 Vino 目前所具备的关键特性进行阐述,并总结开发过程中的一点心得。单线程 + Non-BlockingVino 整体采用...

  • CUDA Lab: Sum of Squares & Matrix Multiplication

    CUDA(Compute Unified Device Architecture)是显卡厂商 NVIDIA 推出的运算平台,是一种通用的并行计算架构,该架构使 GPU 能够解决复杂的计算问题。我们可以使用 GPU 来并行例如神经网络、图像处理等在 CPU 上运行起来比较耗时的程序,通过 GPU 并行计算可以大大提高算法的运行速度。本实验包含两部分。 第一部分(Sum of Squares):计算数组元素的平方和,并通过不断的优化来提高程序的性能,以此来学习和理解 CUDA 编程需要注意之...

  • 初探Webx之约定胜于配置

    实习期间接触到了早有耳闻的Webx,于是很自然的按照官方文档运行了一个 Demo ,粗略的阅读了一下代码,发现并不能很快的梳理清Web请求的处理逻辑,以及视图层和控制层之间的关联关系。execute()为什么会被调用?doChinese()为什么会被调用?这是我当时的两个疑问,为了解答这些疑问,需要理解Web请求在Webx中经历的处理流程,为此我阅读了Webx部分源码,并以此文作为小结。在分析之前,我们需要强调Webx的一个重要设计理念——约定胜于配置。“约定”即规则,规则是预先定义的,工...