2019/11/04 01-生产者消费者模型

开始写项目的时候,代码不一定效率最高但是也不算太差,差不多赶上进度先在这里插入图片描述
前面完成了数据的加载,再把数据拿过来一行行处理掉,处理掉之后,把数据提取出来,提取的字段可以自定义(原始数据提取的速度全部提取,后面哪个程序要就给一份,避免漏掉字段)
所以刚开始不要把数据过滤掉,把不合格的某一行干掉,就不要了,但是列,就让那些程序自己看要哪一列
数据提取出来,暂时是保存的
大量的文件可以交给好几个handler,分别对原始数据做不同处理得出不同结果,统计类型,统计平均值,写到三个不同的handler去,计算出三个不同的结果
(等于给你excel表,把不同的维度,统计下),不同的计算给不同的函数做,这么把数据交给不同的函数去做,就是分发
在分发领域经常碰到的就是,生产者消费者模型
把数据交给handler(搬运工),是一个分发的过程

对于监控系统有很多数据,源源不断产生的,这些数据可以称为生产者
采集数据的叫消费者,
把数据提取分析完成了一个个fields,完成了数据的生产,生产者和消费者是不断变化的
还写了个函数,window,handler函数,都是来消费数据的,叫消费者,window里面包括了很多handler
总之把你提供的数据消费处理掉,这样的称为消费者
不同的处理交给不同的handler函数,消费者可以多个

箭头代表数据流向,要么生产者主动推送数据 推,或者消费者主动去拿,拉
生产者的代码和消费者的代码时关联在一起的,如果要扩大规模,就肯定要独立开把两个

生产者和消费者的主要问题
生产快,消费慢
消费速度超过生产速度(大量人买包子)
如果生产快,消费慢
就可以等消费者消费完,再生产(
我们使用的是yield,处理完再要一个,但是生产中,并发那么大,产生的日志很多,那边的生产速度肯定不会和你的速度相同)我们就需要解决这个问题

在这里插入图片描述
如何解决,就有了消息队列
一个消费者搞不定可以搞很多个消费者
一般来讲消费速度大于生产速度是最好的,因为消费慢了,久而久之就要堆积起来,一般可以让消费者处于不够忙的状态,万一哪个消费者出现问题,保证最终能还是被消费完的

在这里插入图片描述
生产者如果久而久之,不堪重负,就需要开多个窗口,但是这样生产者和消费者耦合度太高,那么能不能开第二个店,就涉及到消费者调度的问题
如果生意太好,依然会出现每家店排一队的问题,每个店也开多个窗口,这样依然是我们遇到的生产者和消费者模型
生产者也扩容,多个来收集数据,多个和消费者打交道
这样生产者和消费依然是直接耦合在一起的
在这里插入图片描述
中间的消息队列可以理解为非常快的,让消费者能够消费数据的东西,可以把消息队列理解为一个超市,市生产者和消费者的一个缓冲地带,消费者到超市里去有专门的通道,生产者的大规模数据堆到超市是没有问题的, 这样就让生产者和消费者不再见面了,中间的叫解耦,原来是耦合在一起,解耦的另一个好处是可以缓冲一下,临时把生产者产生的大量数据,缓存一下,最后消费掉了,但是不需要同时消费掉,按照自己的行为把数据消费掉
如果生产太多,数据是有时效性的,过期就没用的,所以电商就需要实时分析,数据必须尽量快速的消费完,数据分析要尽量快速的分析
如果消费者过快,一直在等,服务器就浪费了
对于程序来讲,生产者和消费者最好不要直接见面,中间应该有个东西,这个叫队列,给你的东西时候是一箱箱的,你拿的时候也是一箱箱的,这样,每个箱子不会给第二个消费者拿走了,每个箱子给三个箱子拿走,等于一份数据分3份,产生不同的结果,感觉像是3条线一样,每条线数据一摸一样,每个消费者做不同的处理
在这里插入图片描述
生产者和消费者之间最好加个东西,这个东西就是一个缓冲的作用,就是个缓冲队列,是用来做生产者和消费者解耦的,不直接打交道,好处是生产者数据涌来了,这个队列相当于拦河大坝,在到达消费者之前,水就没那么急,然后拦河大坝就慢慢放出来,消费速度一定要快,不然就漫出来了
生产者生产的消息是源源不断的,产生大量数据,靠消息队列中间件缓冲一下,能够解决短时间速度不匹配的问题,总体来看,消费速度要匹配生产速度或者略大于一些

一种方案是每个消费者拿不同的数据
在这里插入图片描述
第二种是,每个消费者都可以拿到1数据,2数据,拿到的数据一摸一样的,就是消息队列变成3个小队列,等于容器,数据变3份,消费者分别读取
在这里插入图片描述
生产者源源不断地生成数据,这个生产者总会被人消耗掉的,一般生成的数据yield出来,然后被人next拿到
还有一种是源源不断地生成数据,满了,如果你不拿就把容器清空,继续生产

如果生产者和消费者直接耦合起来会有一些问题,想办法把他们分离,这个缓冲地带最常用的东西叫队列
缓冲队列主要解决两个问题,1。在代码中叫解耦和消费者并不直接关联在一起,他们中间都是关联到同一个队列上去的,这压根就代码上解耦了,解决问题就是拦河大坝,目的就是把生产者产生的数据高峰消灭掉,

在这里插入图片描述
消费者的性能也有快有慢,闲了就自己去缓冲的数据拿一个出来处理,队列在python中有很多种,那么最常用的线程中用的东西是queue模块提供的,queue模块提供了队列数据结构,满足多线程
进程有进程版本,线程有线程版本queue提供的,多进程往往用第三方的queue,第三方的缓冲队列,rabbitmq,kafka,消息中间件,也称消息队列,因为消息是有次序的,一般都是先到先出

服务和服务出现了生产者和消费者的问题,要消费,速度要匹配,需要用到消息中间件,支持集群,适合大规模提供服务
生产者A打到消息队列里去,生产者B打到消息队列里去,适合大型规模的
在这里插入图片描述
生产者消费者最大问题在于,速度匹配问题和耦合的问题(不推荐代码混合在一起),最好是解耦,解耦就需要在中间加东西,让生产者把数据放在中间地带,中间地带就是消息队列,解决程序耦合的问题,数据缓冲地带,解决数据涌入的问题在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值