加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 安全 > 正文

一篇文了解分布式队列编程:从模型、实战到优化

发布时间:2021-01-10 04:01:10 所属栏目:安全 来源:网络整理
导读:《一篇文了解分布式队列编程:从模型、实战到优化》要点: 本文介绍了一篇文了解分布式队列编程:从模型、实战到优化,希望对您有用。如果有疑问,可以联系我们。 本文由美团点评技术团队出品,一篇文助你掌握分布式队列编程的要义.从模型到实战再到优化,基本

当同一请求最小重复长度大于消费者队列长度,如下图.假定有3个消费者,Consumer1将会处理r1,Consumer2将会处理r2,Consumer3将会处理r3,如果每个请求处理的时间严格相等,Consumer1在处理完r1之后,接着处理r4,Consumer2将会处理r2之后会处理r1.虽然r1被再次处理,但是任何时刻,只有这一个消费者在处理r1,不会出现多个消费者同时处理同一请求的场景.

高重复消费模型

如下图,仍然假定有3个消费者,队列中前面4个请求都是r1,它会同时被3个消费者线程处理:

显然,对于无重复和稀疏重复的分布式队列,排重优化并不会带来额外的好处.排重优化所针对的对象是高重复消费模型,特别是对于并行处理消费者比较多的情况,重复处理同一请求,资源消耗极大.

排重状态机

排重优化的主要对象是高重复的队列,多个消费者线程或进程同时处理同一个幂等请求只会浪费计算资源并延迟其他待请求处理.所以,排重状态机的一个目标是处理唯一性,即:同一时刻,同一个请求只有一个消费者处理.

如果消费者获取一条请求消息,但发现其他消费者正在处理该消息,则当前消费者应该处于等待状态.如果对同一请求,有一个消费者在处理,一个消费者在等待,而同一请求再次被消费者读取,再次等待则没有意义.

所以,状态机的第二个目标是等待唯一性,同一个请求最多只有一个消费者处于等待状态.总上述,状态机的目标是:处理唯一性和等待唯一性.我们把正在处理的请求称为头部请求,正在等待的请求称为尾部请求.

由于状态机的处理单元是请求,所以需要针对每一个请求建立一个排重状态机.基于以上要求,我们设计的排重状态机包含4个状态Init,Process,Block,Decline.各个状态之间转化过程如下图:

  1. 状态机创建时处于Init状态.
  2. 对Init状态进行Enqueue操作,即接收一个请求,开始处理(称为头部请求),状态机进入Process状态.
  3. 状态机处于Process状态,表明当前有消费者正在处理头部请求.此时,如果进行Dequeue操作,即头部请求处理完成,返回Init状态.如果进行Enqueue操作,即另一个消费者准备处理同一个请求,状态机进入Block状态(该请求称为尾部请求).
  4. 状态机处于Block状态,表明头部请求正在处理,尾部请求处于阻塞状态.此时,进行Dequeue操作,返回Process状态,并且尾部请求变成头部请求,原尾部请求消费者结束阻塞状态,开始处理.进行Enqueue操作,表明一个新的消费者准备处理同一个请求,状态机进入Decline状态.
  5. 状态机进入Decline状态,根据等待唯一性目标,处理最新请求的消费者将被抛弃该消息,状态机自动转换回Block状态.

构思

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读