shadowsocks源码剖析

VPS上嗨皮的跑了那么久shadowsock的server了, 但一直比较想搞明白具体是怎么实现的. 前段时间比较忙, 最近总算有点私人时间了, 速度的强读一发shadowsocks源码

什么是shadowsocks?

  • 不想再强行安利一发了, 毕竟开发者都被请去喝茶了
  • 只需要知道和G * F * W有关就好了
  • 如果上面你都不知道, 说明这篇文章与你无缘, 叉掉吧

所读源码基于shadowsocks-go 1.1.5, 为什么选择golang实现版本? 我难道会告诉你, Golang的吉祥物太萌了, 我已经决定好好安利golang了. 正经点的回复, golang的语法灵活不失简洁, 棒棒哒.

Tornado源码剖析

pdb调试

简单的介绍一下pdb的调试, 更详细的命令查看python pdbf官方文档

1
2
3
import pdb
// 使用以下语句希望debug的地方打断点
pdb.set_trace()
命令 说明
n 运行下一行代码
p 计算p后面的表达式(当前上下文中), 并打印表达式的值
s 进入函数
r 从函数中返回
b 动态设置断点
w 打印当前栈信息
q 退出pdb

Google protobuf(C++) 学习笔记

本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循署名-非商业用途-保持一致的创作共用协议.

Google Protocol Buffers简称 Protobuf, 是Google公司内部的混合语言数据标准. 它提供一种轻量, 高效的结构化数据存储结构.

简介

为什么学习protobuf?

想通过protobuf的序列化来做一个C++的微型RPC框架.
本文主要是学习protobuf的使用, 大量参考官方文档.

The Google File System

本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循署名-非商业用途-保持一致的创作共用协议.

GFS是一个共享的分布式文件系统

  • GFS提供了一个与位置无关的名字空间(namespace), 这使得数据可以为了负载均衡或灾难冗余等目的在不同位置间透明迁移
  • GFS并没有在文件系统层面提供任何Cache机制, 但借助了Linux底层cache机制.
  • GFS文件以分层目录的形式组织, 用路径名来表示, 文件的写入主要依赖追加(append)操作完成

How to Write Go Code

官方How to Write Go Code的阉割版 :-D

GOPATH

GOPATH环境变量指明当前工作区的位置, 这可能在你编写Go程序时唯一一个需要设置的环境变量

1
2
3
4
5
6
7
# 设置GOPATH
$ mkdir example
$ cd example
# 类Unix设置环境变量, 只对当前session有效, 如需长期生效需要设置如.zshrc的配置文件
$ export "GOPATH=$PWD"
# 验证是否设置成功
$ echo $GOPATH

6.824 Lab 1: MapReduce(2016)

本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循署名-非商业用途-保持一致的创作共用协议.

MapReduce框架简介

  1. 应用提供大量输入文件, 一个Map函数, 一个Reduce函数, nReduce个reduce tasks.
  2. RPC服务器启动, 等该worker注册(Register)RPC中. 任务状态为可执行时, 调度器(Schedule)决定如何把task分配给worker和如何容错.
  3. Master把每个输入文件作为一个Map任务, 每个任务至少调用一次doMap. 这些任务或者直接执行或者由DoTask RPC发射, 每个对doMap()的调用读取合适的文件, 对每个文件调用map, 对每个map文件最后产生nReduce个文件.
  4. Master对每个reduce人物至少调用一次doReduce(). doReduce()收集由map产生的nReduce文件(f-*-), 然后对这些文件运行reduce函数. 最终产生nReduce个结果文件.
  5. Master调用mr.merge(), 合并所有的结果文件为一个输出文件.
  6. Master发送Shutdown RPC关闭workers, 然后关闭RPC服务器.

Go goroutine同步

本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循署名-非商业用途-保持一致的创作共用协议.

出现问题场景: 一个函数run()中包含多个goroutine函数并发, 这些goroutine函数会生成中间文件, 被run()函数运行结束后的check()函数检查. 当goroutine并发时, 并不会阻塞run()的上下文, 可能导致的情况为run()函数执行完毕(但其中的goroutine并发函数没有执行完毕), 导致check()函数执行失败.

所以我们需要一种操作, 直到当前所有goroutine没有执行完毕, 才进行下一步操作

所以需要goroutine同步, go提供了sync包channel机制来解决goroutine之间的同步问题

Google MapReduce

简介

  • 开始喜欢看基于工程实践总结出来的paper, 而不是功利性的paper, 没有冗长难懂的数据公式和概率统计的paper.
  • 并行计算,分布式数据,处理故障的问题与与大量复杂的业务代码掩盖了原来的简单的大数据处理计算。
  • MapReduce通过函数式风格代码, 自动和并行的运行在集群中. 系统的运行考虑输入数据的划分, 机器间的程序调度, 处理其中出现的错误(容错), 管理机器间通信.
  • MapReduce抽象模型灵感来自于Lisp和其他函数式编程语言
  • MapReduce的主要贡献: 通过简单又不失强大的接口, 在大规模商用集群中自动并行和分布式的处理大规模计算. MapReduce简单易用, 隐藏了底层的并行, 容错, 局部优化和负载均衡. 很多大数据处理逻辑都可以通过MapReduce来表达.