Google MapReduce 总结

这篇文章是本人在按照 MIT 6.824 的课程安排学习 Google MapReduce 并完成对应 Lab 的基础之上总结而成。本文会详细介绍 Google MapReduce 的原理,但考虑到 Lab1 较为简单,本文不会提及 Lab1 的相关内容。部分有关 Google MapReduce 和具体代码实现的细节不会在本文中提及,读者可自行查阅 Google MapReduce 的论文原文以及本人的 MIT 6.824 Lab 代码仓库

阅读更多

Go Runtime 浅析

在 GDC Sigma 小组为期两个月的实习已告一段落,本人也十分有幸能在实习期间在团队内部完成了三次 Go 语言相关的分享。由于个人的不足,很遗憾没能向组员分享更多深入的内容,但尽管内容粗浅,这三次分享仍在组内起到了很好的科普作用,收获了组员的一致好评。受组员委托,我将把这三次分享上与 Go 运行时有关的内容整理成文,希望更多的人能从中受益。

本文将完整描述本人在三次组内 Go 分享中提及的与 Go 运行时有关的内容。分享初期关于 Go 语言入门的内容将不在此处赘述。

阅读更多

吃了兴奋剂的 Go Channel

为什么?

Channel 是 Go 语言的主要同步和通信原语,它们必须速度快且可扩展。

目标:

  • 令单线程(无竞争)的 Channel 操作更快
  • 令有竞争带缓存(生产者消费者)的 Channel 操作更快
  • 令无阻塞失败操作(如检查 Channel 是否已关闭)更快
  • 令信号量 Channel(chan struct{})更快
  • select 语句更快

非目标:

  • 令 Channel 完全无锁(这会导致实现的复杂度大幅提升且在普通使用场景下变得泵满)
  • 令有竞争的同步 Channel 操作更快。

本文接下来的内容会详细介绍这个设计的细节。

阅读更多

并发、Goroutine 与 GOMAXPROCS

每当有新人加入 Go-Miami 小组的时候,他们总会提到他们有多想学习更多有关 Go 并发模型的东西。似乎并发就像这个语言的大新闻一样。不过,在我第一次听说 Go 时确实如此 – 实际上正是 Rob Pike 的 Go 并发模式这个视频让我确信我需要去学这门语言。

要想理解为什么用 Go 编写并发程序会更加容易而且更难出错,我们首先得了解一个并发程序是什么样的,以及它可能会出现哪些问题。我不会在这篇文章中讨论 CSP(Communicating Sequential Processes,通信顺序进程),尽管它确实是 Go 的 Channel 实现的基础。这篇文章主要讲述一个并发程序会是什么样的、Goroutine 在这之中起着什么样的作用、以及 GOMAXPROCS 环境变量和运行时函数会如何影响 Go 运行时和我们编写的程序的行为。

阅读更多

解决 Windows10 笔记本关上后仍会掉电的问题

一开始我只是想在谷歌上搜索一下,为啥我的 Win10 笔记本在盖上盖子以后放入背包中,每次拿出来之后电量都会有所下降,结果就一下子看到了很多很神奇的东西,包括 Win10 的几种节能状态,以及如何设置关闭盖子的行为。且听我一一道来。

阅读更多

MongoDB Sharding

上一篇博文中,我详细讲解了 MongoDB Replica Set 相关的概念。作为 MongoDB 分布式解决方案之一,
Replica Set 主要用于提高 MongoDB 集群的可用性,但不难发现,同一个 Replica Set 中的 PrimarySecondary
往往承受着大致相同的写压力,因此 Replica Set 实际上并不能用来提高集群的处理能力。

在这篇博文中,我将详细介绍另一种 MongoDB 分布式解决方案 —— Sharding 的相关概念,并介绍如何利用 Sharding 来对数据库进行水平拓展。

阅读更多

MongoDB Replica Set

本篇文章将脱离基本的 MongoDB 数据存储和操作,立足于 MongoDB 提供的高可用方案。MongoDB 的高可用方案包括 Replica Set 和 Sharding,这篇文章将介绍 MongoDB 的 Replica Set。

阅读更多