从锦囊妙计想到的09–分布式中事件和计数

——分布式计数任务的相关问题

前情回顾

前面一个08中通过一个厨房满足不了要求后, 然后把一个厨房完成不了的任务, 扩展到若干个厨房, 然后派人去分发命令让他们开始做事情, 然后当到达一定时间或者一定条件后, 在派人去传达命令结束任务。 最后这些分布在不同厨房的任务结果 汇总起来。但是这些结果的一个问题是, 最后的数量不够准确。

总数 = 生产的速度(或者工作速度) ×  工作时间

在写的详细点 :

总数 = 生产的速度×(结束时间t2 - 开始时间t1)

由于生产的速度, 无法一直保持稳定, 例如人们在开始工作时, 效率高, 斗争饱满, 自然快, 随着时间的推移, 累了, 烦了, 因此效率就低了。 还有另外一些因素, 例如一开始大家业务不熟悉, 但是到了后来业务逐步熟悉了, 因此可能也就快了。

但是到底, 那个因素更多, 这些因素能否相互抵消, 没办法确定, 最后可能造成数量不准确。

对于分布式系统还有如下公式

总数= 节点1总数(就是相当于厨房1) + 节点2总数(厨房2总数) + ... + 节点n总数(厨房n总数)

在详细点:

总数 = 节点1的速度 × 节点1工作时间 + 节点2速度 × 节点2工作时间 + ... + 节点n速度 × 节点n工作时间

更详细点

总数 = 节点1的速度×(节点1结束时间t12 - 节点1开始时间t11) + 节点2的速度 × (节点2的结束时间t22 - t21) + ... +

节点n的速度 × (节点n的结束时间tn2 - 节点n的开始时间tn1)

通过最后的公式我们可以看到, 每个节点速度 可能不一样, 每个节点的 开始时间, 结束时间 都可能有偏差

然后, 这些最后的偏差累计到一起, 非常可能造成最后的总数不正确。

应用场景

既然上的方法有问题, 为什么会说这个例子?  其实任何事情都有好处和缺点,因此如何应用一个东西才是问题的本质。

我们首先要了解一个方法的好处和缺点, 然后在根据需要进行判断是否满足需求。

这个开始 -- 结束这个类型的任务, 典型应用场景, 是不需要精确数量限制的地方有很多的应用, 若是有明确数量限制的 就要考虑了, 前面08中以及前面的公式都分析了这个方式  可能不准确的地方。

应用场景, 有很多, 这里准备列举一个计算机中的应用例子, 如下。

通常计算机程序都是很复杂的, 因此程序如何工作, 什么时刻,什么地点, 都做了什么, 这样当有问题 时, 就可以了解程序当时的是 如何工作的, 这样就可以排除问题。  那么上述问题需要记录下来, 否则一旦发生问题就无从查起, 因此绝大多数计算机程序都会把大量的工作情况信息等记录下来, 供以后排除问题用。 这个工作由于经常进行, 就像普通人记日记似的,  因此通常都叫做日志(更综合的一些日记吧)

由于计算机很多, 因此每个计算机都要记录自己的日志, 然后提供以后进行分析。 当日志多了的时候就需要进行一件事情, 就是把日志压缩, 或者删除一些不要的事情, 但是删除日志或者压缩是要花时间的, 并且影响计算机的正常工作, 因此这个工作都通常在晚上进行, 这个时候没人使用计算机了, 但是计算机还开着, 因此干这个事情最合适了。

因此有如下场景发生:

半夜3点, 张飞一声大喊全体计算机开始压缩(对日志的一种降低占用空间的处理办法, 压缩完毕,可以删除原文件, 压缩后的文件比原来的文件小, 这样好存储。   举个例子, 我们夏天存储羽绒服的一个办法   就是把羽绒服给抽真空, 抽完真空后 体积大的 缩小了, 占用空间小,   羽绒服在没有抽真空前(叫做原始文件), 抽完真空后叫压缩后文件), 然后传令兵, 玩命奔跑到各个厨房(就是不同的计算机),下达命令, 然后各个厨房全力进行了相关的 压缩工作。

早上5点, 张飞一看时间差不多了, 然后又大喊一声, 停止压缩了, 然后传令兵又开始奔跑了, 到了各个厨房, 通知停止压缩, 然后各个厨房停下了相关的工作。

分析:  为什么这次  可以了?   压缩日志的事情, 不需要有明确的数量, 并且是越多越好, 没明确数量, 就适合这个开始 - 结束的事情了 (其实是   事件通知类型的,以后在说)

上面是 计算机方面的 例子, 在举一个生活中的例子

一个超市, 店老板喊, 下班了, 然后各个店员就纷纷尽快结束自己手里的工作(由于店员分布在不同楼层, 不同房间)因此他们纷纷开始准备下班(一定还有一些顾客在买东西, 因此这些店员要服务完人家才能开始下班), 店主观察店中是否还有顾客存在, 当店中顾客都走了后, 店主会在喊, 开始集合, 等众人集合后, 开始总结当天工作, 以及布置第二天工作, 最后宣布下班。

这个就是开始结束的事情(其实是开始事件, 结束事件)

 

准确数量事情的改进办法

前面分析了, 这个开始结束类型工作的情况(其实是基于事件的工作), 他产生问题原因是有很多事情都是不可以进行精确控制的, 可能有时候多, 有时候少, 或者有其他情况。

但是有一个情况是一个 大家都能认可的事情, 就是, 当框苹果或者别的东西已经固定了, 然后针对这个固定的苹果框或者里面的东西进行计数(就是查数量), 这个计数的办法,无论你查的快, 慢, 等等都不会有问题, 一定是准确的, 除非查错了。 对于查错的事情, 我们可以采用两个不同人, 分别查然后核对的办法进行, 然后若是两人数量一致基本是正确的了, 同时查错的可能性比较小的, 当然可以在多些人查, 然后核对结果。

总之, 计数的办法是可以很好解决数量问题的。

因此我们对08中分布式烙饼的事情进行改进, 如下:

张飞, 通过计算发现, 每个厨房500张饼, 一共10个厨房, 这样合计就是5000张饼, 因此张飞吩咐了

传令兵去 各种的厨房 传令烙500张饼, 然后等饼都烙完了, 你们负责把饼都台回来! 交令。

然后, 各个传令兵就分别出发了, 去了各自的厨房

执行结果如下图:

a

从上图可以看出, 各个厨房完成的时间可能是不同的, 但是最终数量 一定是满足 5000张的!

 

相关文章

计算机介绍                                  从锦囊妙计想到的01

流程图(分支结构)介绍          从锦囊妙计想到的02

线程介绍                                     从锦囊妙计想到的03

循环结构介绍                             从锦囊妙计想到的05

流程线程总结                             从锦囊妙计想到的06

cpu和线程定义、开始               从锦囊妙计想到的07

分布式计算                                  从锦囊妙计想到的08

分布式中事件和计数                 从锦囊妙计想到的09

内容总结                                     从锦囊妙计想到的10

数据类型,变量简介                从锦囊妙计想到的11

函数和参数                                从锦囊妙计想到的12

用户交互与数据输入输出       从锦囊妙计想到的13

人机交互界面                            从锦囊妙计想到的15 

过程与对象                                从锦囊妙计想到的16

同步和异步                                从锦囊妙计想到的17

顺序打印                                    从锦囊妙计想到的18

数据输入输出                            从锦囊妙计想到的19

屏幕坐标和打印                        从锦囊妙计想到的20

java函数控制输出                     从锦囊妙计想到的21

逐步细化解决复杂问题           从锦囊妙计想到的22

java入门                                    从锦囊妙计想到的23

java复杂过程分析                   从锦囊妙计想到的25

中间辅助功能解决问题          从锦囊妙计想到的26

叠加操作输出复杂图形          从锦囊妙计想到的27

时间和空间                               从锦囊妙计想到的28

编写边测解决问题                  从锦囊妙计想到的29

让程序动起来                          从锦囊妙计想到的30

程序往复运动                           从锦囊妙计想到的31