冰羚杂谈(四)上下游对齐工作节奏
前面的系列文章介绍了矿工挖金矿和搬运工运金矿的故事,这种场景设定虽然可以描述一些通信基础设施的建立过程,但还不能准确还原自动驾驶中数据的实际使用场景。自动驾驶中业务数据流的传递很多时候采用分布式数据分发软件架构,这意味着同一种类型的数据可能有多于一个的发布者,也往往有不止一个的订阅者,如下图:
同一份数据往往会被多个订阅者同时使用,如传感器采集的数据可能被行车、泊车及故障收集等多个业务方使用。数据使用的核心诉求是使用而不是消耗。订阅者A、B、C可能在同一个存储位置同时得到了同一份数据,但仅仅使用数据,并不消耗这些数据,数据仍然放在原来的存放位置。订阅者A并不搬走独占这些数据,A在使用这些数据的同时,B、C也可以使用同一份存储在相同位置的数据,只有当A、B、C全部使用完后,这份数据才被标记为已用状态,此时该位置的数据可被丢弃,后续可以在该位置上存放新的数据。
在挖矿的场景设定中,矿工甲挖完金矿,放入云盘,立马被勤劳的搬运工甲搬运走了,但搬运工乙和矿工甲先前约定好了,矿工甲每次放好金矿后,矿工乙可以听个回响沾沾喜气。于是在金矿放入云盘的同时,矿工乙也得到了通知,但此时金子已经被搬运工甲运走了,整个过程中没有谁对谁错,戏剧冲突有了,但剧情的逻辑设定限定了矿工乙的发挥。
于是,有了新的剧情。
数十年年复一年日复一日的辛苦劳作让岁月在第一批矿工和搬运工的脸颊上烙上了深深的纹理,矿工和搬运工们不再年轻,马上就要集体奔赴35岁的黄金岁月了。本着来了就是兄弟,奉献了就该风雨同行的指导原则,金矿跳动决定给兄弟们来一次再就业行动。公司内部虽然职能部门众多,但各个职位还是有一定门槛的。在经历了多轮岗前培训和渐进式工作带教后,曾经的体力劳动者纷纷焕然一新变成了文字工作者。转岗信息如下:
原岗位 | 新岗位 | 工作职责 |
---|---|---|
矿工 | 资深情报收集专家 | 定时采集矿工们的产出效能 |
搬运工 | 资深HR人力专家 | 汇总矿工们的产出效能,优化人力资源配置 |
搬运工 | 资深健康风险评估师 | 汇总矿工们的产出效能,评估每位矿工的工作状态对身体健康的影响 |
搬运工 | 资深战略运营专家 | 汇总矿工们的产出效能,优化公司总体产能预期 |
矿区分为东西南北四大片区,每个片区都有如上人力配置。在每个片区,资深情报搜集专家定时采集矿工们的产出效能,并将每次采集到的数据分别发送给资深HR人力专家、资深健康风险评估师及资深战略运营专家。在冰羚杂谈(二)建设云盘和怎样找到云盘-CSDN博客提到,数据共享可以通过云盘实现,示意图如下:
资深情报搜集专家将情报放入共享云盘后,需要告诉HR人力专家、资深健康风险评估师及资深战略运营专家情报(统称情报消费专家)在共享云盘的具体位置,按照冰羚杂谈(二)建设云盘和怎样找到云盘-CSDN博客的讨论,只需将藏经阁的编号(出于剧情发展需要,藏经阁扩展了它的功能,不仅能够存放金子,也能够存放情报等其它信息)和情报位置的地址偏移量传递给他们即可。于是,资深情报搜集专家在云盘上分别与每个情报消费专家开辟了一条专属情报位置信息传输通道:
资深情报搜集专家将情报放入共享云盘后,分别通过专属的一对一的产出效能数据位置信息传输通道告诉HR人力专家、资深健康风险评估师及资深战略运营专家情报的具体位置信息。
资深情报搜集专家定时发送情报的节奏和情报消费专家们的情报消费节奏不一定能够严格匹配,所以产出效能数据位置信息传输通道可以设计为一个缓存队列,缓存队列是先进先出的结构,情报消费专家们总是从最先放入的位置获取数据。据节奏要求的不同需要设计不同类型的缓存队列:
1. HR人力专家要求队列满后,资深情报搜集专家以一定的时间间隔持续不断尝试重新将本次位置信息放入队列,直到HR人力专家取走数据队列重新变为空为止。这种队列的实现请参考无锁队列之SpscFifo队列_spsc实现-CSDN博客
2. 资深健康风险评估师及资深战略运营专家要求队列满后,资深情报搜集专家将队列中现存的最先放入的位置信息弹出或另作他用,然后将本次位置信息放入该位置,资深健康风险评估师及资深战略运营专家下次从次先的位置取出位置信息。这种队列的实现请参考无锁队列之SpscSofi队列-CSDN博客
3. 除了三位情报消费专家,后期可能还会加入一个狠角色专家,这位狠角色不仅要求得到自己加入后的情报,还要求获取自己加入前的一些情报,既要得到现在,还要了解过去,爱的轰轰烈烈:
资深情报搜集专家有一个固定大小的缓存队列应对狠角色专家的加入,最近发送的一部分位置信息缓存在该队列
4. 一个资深情报搜集专家收集的数据可能造假或者存在偏差,设置两个资深情报搜集专家同时采集数据,同时竞争同一个队列将数据放入,某个特定位置的数据只需被消费专家们其中之一使用一次即可,示意如下:
和2一样,队列满后,资深情报搜集专家将队列中现存的最先放入的位置信息弹出或另作他用,然后将本次位置信息放入该位置,数据消费专家下次从次先的位置取出位置信息。这种队列的实现请参考无锁队列之Mpmc Fifo队列_mpmcqueue-CSDN博客
5. 专家们一致要求缓存队列的容量可动态伸缩,以此动态调节双方的工作节奏和负荷。这种队列的实现请参考无锁队列之Mpmc动态可伸缩队列-CSDN博客