Go并发设计模式之 Active Object

设计模式曾经很火,尤其是1995年的时候Erich Gamma, Richard Helm, Ralph Johnson 和 John Vlissides (GoF)推出的《设计模式》一书,可谓经典。这本书总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。书中分类描述了23种经典实用的设计模式,这些实际模式依然在现在的实际开发中被广泛实用。

当然,这23种设计模式并不能涵盖所有的模式场景,同时,书中也没有对其它领域的一些设计模式进行归纳总结和介绍,比如并发场景,数据库设计、前端设计、架构模式等等,这个问题GoF中也已经进行了说明。二十几年过去了,期间也陆陆续续的出了一些介绍模式的书,有些是对GoF的23中设计模式的具体语言的介绍、阐述等等,也有一些设计模式的书,介绍了企业开发中的其它领域的设计模式,有一些书还是非常值得一读的。

我会写一系列介绍并发设计模式的文章,主要介绍实用Go语言去实现这些并发设计模式,但是我不想遵循介绍设计模式的模版,而是结合很多流行的Go的项目和库,从实践的角度去介绍这些并发设计模式。这种介绍方式一是可以让读者更容易的去理解设计模式,而不是拿一些老掉牙、根本不会使用的例子来介绍,二来可以坚定读者的信心,因为这些并发设计模式已经在流行的项目中使用了,得到了实际的检验。

作为开篇一章,我介绍的是 Active Object设计模式,为什么拿它作为第一篇呢,因为它的首字母是A,最大。

阅读全文

[译]利用 gopackage 进行包的捕获、注入和分析

原文: Packet Capture, Injection, and Analysis with Gopacket by John Leon。

最近准备使用 gopackage 写个工具,搜索了相关的资料,这篇文章是值的推荐的一篇介绍 gopackage的文档,所以动手翻译了一下。

gopacket包为用C编写的libpcap提供了一个go包装器(译者按: 不仅如此,现在gopackage有多种捕获包的binding方式,比如PF_RING,AF_PACKET等),但它不仅仅是一个简单的包装器。它提供了额外的功能,并利用了Go之类的接口,这使得它非常强大。

作者在写这篇文章的时候,在Denver GopherCon 2016 大会上分享了相关的技术,有兴趣的同学可以观看: GopherCon 2016: John Leon - Packet Capture, Analysis, and Injection with Go

阅读全文

[译]配置 sql.DB 获得更好的性能

原文: Configuring sql.DB for Better Performance

网上有很多教程介绍sql.DB, 以及如何使用它来执行SQL数据库查询和语句, 但是大部分都没有介绍SetMaxOpenConns()SetMaxIdleConns()SetConnmaxLifetime()方法。事实上你可以使用这些方法来配置sql.DB的行为并改善其性能。

在这篇文章中,我想准确地解释这些设置的作用,并演示它们可能产生的(正面和负面)影响。

阅读全文

[译]Go性能分析工具工具和手段

翻译自 Basics of benchmarking, profiling and tracing with Go,作者对Go性能分析的工具和手段做了一个很好的总结。

这篇文档提供了Go提供的测量性能和收集运行时信息的工具的概览。它不是一个关于基准测试、性能分析和跟踪的详细教程。

所以这篇文档也可以看成是一篇备忘录。

在大多数情况下,您可以通过运行提供的示例源代码自行尝试。作为一种现场演示或研讨会,很容易使用这些工具进行试验和体验。

主要内容包括:

  • Benchmarking(基准测试):专注于一段特定的代码, 允许测量时间 和/或 内存信息。
  • Profiling(分析):在程序执行期间(或测试的时候)通过聚合采样收集的数据。分析是没有时间线的(和tracing不一样)。
  • Tracing(跟踪):通过程序执行期间(或测试的时候)收集发生的事件数据。跟踪是有时间线的。

基准测试:专注于一段特定的代码,允许测量时间和/或内存信息。
分析:在程序(或测试)执行期间通过采样收集的聚合数据。分析没有时间线。
跟踪:通过程序(或测试)执行期间发生的事件收集的数据。跟踪有时间线。

分析和跟踪技术可以应用于基准测试。

阅读全文

Gopher 2019 Go并发编程的分享

昨天参加了 Gopher China 2019 大会,分享了《Go并发编程实践》的主题,在这一篇博客中总结一下。

从春节前开始我就有意识的收集和整理Go并发编程的相关知识,以前也有相关的博文进行过分享,本来是想以电子书的方式进行分享,正好Asta Xie邀请在Gopher China 2019上做一个分享,就毫不犹豫的答应了。

谈起Go并发编程的分享,每年各地的Go相关的大会都会有,基本上都会针对某一个专题进行介绍,或者针对Go并发编程的哲学进行分享。所以我给自己定了两个方向: 一个是结合业务讲一些Go并发编程在企业实际开发中的实践,另外一个是对Go并发编程做一个全面的总结。

我选择了后一个,也是最难的一个。一是内容非常多,而且不结合业务,只讨论编程语言相关的知识,因为涉及到细节,多少会有些枯燥,尤其是针对主要关注于业务同学,但是对于热心于Go编程语言的开发者来说,能有人对Go并发进行一个深入而全面的总结,对于自己回顾和整理Go并发编程的技能,多多少少会有所帮助的,所以我愿意进行一次尝试。

最初开始整理了很多的知识点,内容太多了,我忍痛删去了Go并发编程设计模式一节,第一版120多页的ppt发给Asta之后,Asta感觉还是太多,又忍痛删去了分布式并发原语这一节,最后整理了81页的PPT。我是实在不想删减了,再删减,就变成了《Go标准sync库在实践中的几个坑》,就偏离了我最初的分享的目的:全面总结Go并发编程知识,而退化成第一个选择:找一个直接点结合业务进行分享。编写PPT原则就是每一页都是干货。

80页的PPT想在45分钟内顺利的讲完,并且不讲业务只讲Go语言的特性,非常的困难,我预想到会拖堂,实际也完美做到了,所以后面的介绍比较的匆忙了,这些都在预想的流程之内,也是希望大家拿到ppt之后有个回顾,将来遇到并发的问题至少能在ppt找到答案。当然如果你不想看冗长的ppt和代码的话,这篇文章或许能对你的理解能够更顺畅一些,也希望对未能参加会议的朋友能有所帮助。

阅读全文

[译]使用 Go 语言读写Redis协议

原文: Reading and Writing Redis Protocol in Go
翻译整理: smallnest, 译文连接: 使用 Go 语言读写Redis协议。 转载请保留原文出处和译文译者和出处。

这篇文章使用两个简单的Reader和Writer实现了redis客户端的读写协议,通过这两个实现可以容易地学习Redis协议是如何工作的。

如果你想寻找一个全功能的、产品级的Redis client, 推荐你看看 Gary Burd的 redigo

开始之前,建议你先阅读一下 Redis协议的介绍。

官方的协议可以在其网站上找到: protocol。 Redis的协议叫做 RESP (REdis Serialization Protocol),客户端和服务器端通过基于文本的协议进行通讯。

所有的服务器和客户端之间的通讯都使用以下5中基本类型:

  • 简单字符串: 服务器用来返回简单的结果,比如"OK"或者"PONG"
  • bulk string: 大部分单值命令的返回结果,比如 GET, LPOP, and HGET
  • 整数: 查询长度的命令的返回结果
  • 数组: 可以包含其它RESP对象,设置数组,用来发送命令给服务器,也用来返回多个值的命令
  • Error: 服务器返回错误信息

RESP的第一个字节表示数据的类型:

  • 简单字符串: 第一个字节是 "+", 比如 "+OK\r\n"
  • bulk string: 第一个字节是 "\$", 比如 "$6\r\nfoobar\r\n"
  • 整数: 第一个字节是 ":", 比如 ":1000\r\n"
  • 数组: 第一个字节是 "", 比如 "2\r\n\$3\r\nfoo\r\n\$3\r\nbar\r\n"
  • Error: 第一个字节是 "-", 比如 "-Error message\r\n"

基本了解Redis的协议之后,我们就可以实现它的读写器了。

阅读全文

Go 生态圈的 K/V 数据库 benchmark

Go生态圈有好几个K/V数据库,我们经常用它来做我们的存储引擎,但是这些数据库引擎的性能如何呢?本文试图用性能而不是功能的数据考察这些数据库,我测试了几种场景: 并发写、并发读、单一写并发读、并发删除,得出了一些有趣的数据。

测试在两台机器上测试的,一台机械硬盘,一台固态硬盘,使用256字节作为value值的大小,9个字节作为key的大小,测试简单的读写删除操作,并没有测试批量读写操作。 每个测试case测试1分钟。

代码: kvbench

阅读全文

百万 Go TCP 连接的思考3: 正常连接下的吞吐率和延迟

这一篇文章介绍了I/O密集型服务器和计算密集型的服务器的两种场景,对多epoller服务器和goroutine-per-connection服务器两种服务器进行测试,连接数分别是5000、2000、1000、500、200和100。

第一篇 百万 Go TCP 连接的思考: epoll方式减少资源占用
第二篇 百万 Go TCP 连接的思考2: 百万连接的吞吐率和延迟
第三篇 百万 Go TCP 连接的思考: 正常连接下的吞吐率和延迟

相关代码已发布到github上: 1m-go-tcp-server

阅读全文

百万 Go TCP 连接的思考2: 百万连接的吞吐率和延迟

上一篇epoll方式减少资源占用 介绍了测试环境以及epoll方式实现百万连接的TCP服务器。这篇文章介绍百万连接服务器的几种实现方式,以及它们的吞吐率和延迟。

这几种服务器的实现包括:epollmultiple epollerpreforkworkerpool

第一篇 百万 Go TCP 连接的思考: epoll方式减少资源占用
第二篇 百万 Go TCP 连接的思考2: 百万连接的吞吐率和延迟
第三篇 百万 Go TCP 连接的思考: 正常连接下的吞吐率和延迟

相关代码已发布到github上: 1m-go-tcp-server

阅读全文