Day10 - 读 Concurrency is not Parallelism - Rob Pike (五)

昨日有点累,想说打个盹一下,结果醒来就隔天了,铁人赛直接中断。

续上篇,Day9 - 读 Concurrency is not Parallelism - Rob Pike (四)

在上篇 Rob Pike 举了一个简单的 load balancer,在演讲的尾声,他提出了一个更真实的案例。
看下图,大概分成三个部分

  • N 个 requester 发出 request 给 load balancer
  • N 个 worker 在工作
  • load balancer 接到 request 并且指派 worker 工作

定义 Requester

  • fn 定义了这个 request 想做什麽,此范例是做某些运算并且回传 int
  • c 则是用来回传 fn 运算完的结果

模拟 requester 发出 request
可以看到 work 这个参数用来发出 request,result 用来等待运算的结果


定义 Worker

  • requests 是要做的工作 (注意:这里使用 buffered channel)
  • pending 代表有多少工作搁置
  • index 则是在 heap 里的位置,这是给 load balancer 排程时用的

Worker 工作罗,就做三件事

  • 拿到工作
  • 做完之後把结果传送给 requester (worker 做完的结果不会经过 load balancer。load balancer 只是一个媒介,把 request 送给当前比较适合的 woker,当 load balancer 把 requester 的 request 媒合到一个 worker 之後,就没 load balancer 的事情了)
  • 跟 load balancer 说我做完了

来设计 load balacer 吧

  • 一个 load balancer 有很多 worker,这里直接用 Pool 表示
  • 需要一个 done 的 channel 来知道哪一个 worker 做事做完了

load balancer 需要计算优先权,使用到了 Heap 资料结构,并使用 worker 的 pending 计算优先权


Load balancer 要做的事情概念很简单。 回想一下一开始的设计图:

  • 对於左边的 requester,load balancer 要接收 request,并且派送工作
  • 对於右边的 worker 而言,load balancer 要接收到 woker 做完的讯息,并且更新排程

load balancer 派发工作的实作:

  • 从 heap 里拿出一个事情最少的 worker
  • 把 request 丢给 woker
  • 把 worker 的 pending 加 1
  • 重新丢回 heap (重新计算优先权)

load balancer 接收到 woker 做完工作後的实作:

  • 把 worker 的 pending 减 1
  • 把 woker 重 heap 中移除
  • 重新丢回 heap (重新计算优先权)


这个例子学到了:

  • 一个复杂的 load balancer 问题,被分解成好几份简单的元件
  • 这个解法是很容易理解的、可扩展的 (你可以指定多少个 worker)、可正常运行的、没有显式 lock (也就是传统的 lock 工具)
  • 老话一句,至於要不要 parallel 就只是个选项而已。

这边 Rob Pike 又讲了一个小小的例子我就略过了,直接到结论:结论相当的简单而且微言大义,留给自己去体会罗。

读後心得

以往都是从 CPU 的观点去解读 concurrency 和 Parallelism,但 Rob Pike 从另一个观点切入 ,直接给出了 Programming as the composition of independently executing processes 的观点,使用 gopher 烧书的例子带你了解 concurrency 设计。最後直接带你一步一步设计一个 load balancer,将一个复杂的问题切割成简单的子问题,并且使用 go 的 concurrnecy 完成这个漂亮的设计。这场演讲,这个观点和结论,只能佩服 Rob Pike 这个大师级人物。


<<:  D5 allauth 测试

>>:  Kotlin 语言和你 SAY HELLO!!

Day12 - Kotlin的集合

Day12 - Kotlin的集合 我今天要讲的是Kotlin的集合,今天就稍微讲一下集合List,...

【从零开始的 C 语言笔记】第十篇-scanf 介绍 & 结合printf的应用 (2)

不怎麽重要的前言 上一篇我们介绍了scanf的用法,虽然可能会有点小混乱,但应该不至於太难理解? 接...

Day25. 发动魔法卡,融合 - Composite (下)

今天是 Composite 单元的最後一篇,既前两篇看了基本属性、建构方法後,最後一篇要来看 Com...

Day29 利用web发送讯息(上)

当我们网页建立了基本的authentcation,接着就能开始建立我们的功能,首先在web上的htm...

铁人赛 Day29 -- 使用 JQuery 制作简易的loading画面

前言 一个网站要让他更完整,势必就需要当使用者进入网站时,先进行读取,但由於技术成分不足,只好先做...