既然前一个帖子
已经搞过扫盲了,那接下来应该开始聊一些具体的编程技术问题了。不过在进入具体的技术细节之前,咱们先要搞明白一个问题:如何确定数据单元?只有把数据单元分析清楚,后面的技术设计才好搞。<!-- program-think-->
★啥是数据单元
何谓数据单元捏?简单地说,每次生产者放到缓冲区的,就是一个数据单元;每次消费者从缓冲区取出的,也是一个数据单元。对于前一个帖子
中寄信的例子,我们可以把每一封单独的信件看成是一个数据单元。
不过光这么介绍,太过于简单,无助于大伙儿分析出这玩意儿。所以,后面咱们来看一下数据单元需要具备哪些特性。搞明白这些特性之后,就容易从复杂的业务逻辑中分析出适合做数据单元的东西了。
★数据单元的特性
分析数据单元,需要考虑如下几个方面的特性:
◇关联到业务对象
首先,数据单元必须关联到某种业务对象。在考虑该问题的时候,你必须深刻理解当前这个生产者/消费者模式所对应的业务逻辑
,才能够作出合适的判断。
由于“寄信”这个业务逻辑比较简单,所以大伙儿很容易就可以判断出数据单元是啥。但现实生活中,往往没这么乐观。大多数业务逻辑都比较复杂,当中包含的业务对象是层次繁多、类型各异。在这种情况下,就不易作出决策了。
这一步很重要,如果选错了业务对象,会导致后续程序设计和编码实现的复杂度大为上升,增加了开发和维护成本。
◇完整性
所谓完整性,就是在传输过程中,要保证该数据单元的完整。要么整个
数据单元被传递到消费者,要么完全没有传递到消费者。不允许出现部分
传递的情形。
对于寄信来说,你不能把半封信放入邮筒;同样的,邮递员从邮筒中拿信,也不能只拿出信的一部分。
◇独立性
所谓独立性,就是各个数据单元之间没有互相依赖,某个数据单元传输失败不应该影响已经完成传输的单元;也不应该影响尚未传输的单元。
为啥会出现传输失败捏?假如生产者的生产速度在一段时间内一直超过消费者的处理速度,那就会导致缓冲区不断增长并达到上限,之后的数据单元就会被丢弃。如果数据单元相互独立,等到生产者的速度降下来之后,后续的数据单元继续处理,不会受到牵连;反之,如果数据单元之间有某种耦合,导致被丢弃的数据单元会影响到后续其它单元的处理,那就会使程序逻辑变得非常复杂。
对于寄信来说,某封信弄丢了,不会影响后续信件的送达;当然更不会影响已经送达的信件。
◇颗粒度
前面提到,数据单元需要关联到某种业务对象。那么数据单元和业务对象是否要一一对应捏?很多场合确实是一一对应的。
不过,有时出于性能等因素的考虑,也可能会把N个业务对象打包成一个数据单元。那么,这个N该如何取值就是颗粒度的考虑了。颗粒度的大小是有讲究的。太大的颗粒度可能会造成某种浪费;太小的颗粒度可能会造成性能问题。颗粒度的权衡要基于多方面的因素,以及一些经验值的考量。
还是拿寄信的例子。如果颗粒度过小(比如设定为1),那邮递员每次只取出1封信。如果信件多了,那就得来回跑好多趟,浪费了时间。
如果颗粒度太大(比如设定为100),那寄信的人得等到凑满100封信才拿去放入邮筒。假如平时很少写信,就得等上很久,也不太爽。
可能有同学会问:生产者和消费者的颗粒度能否设置成不同大小(比如对于寄信人设置成1,对于邮递员设置成100)。当然,理论上可以这么干,但是在某些情况下会增加程序逻辑和代码实现的复杂度。后面讨论具体技术细节时,或许会聊到这个问题。
好,数据单元的话题就说到这。希望通过本帖子,大伙儿能够搞明白数据单元到底是怎么一回事。下一个帖子,咱们来聊一下“基于队列的缓冲区
”,技术上如何实现。
版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者编程随想
和本文原始地址:
http://program-think.blogspot.com/2009/03/producer-consumer-pattern-1-data.html
分享到:
相关推荐
在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数...产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。
使用Spring Cloud Stream + Avro + MapR Kafka进行架构演化服务/生产者/消费者模式的发展始终具有挑战性。 作为一名架构师/开发人员,我想设计自己的服务/生产者/消费者以适应不同的有效负载方案。 在大数据世界中,...
Services与它们的消费者之间共享的是Schema和Contract ;以适用为目的的设计 14、以下哪些是功能规格说明书的组成元素?远景/范围总结;背景信息;设计目标;使用场景;功能和服务的描述;组件规格说明(产品和配置...
然而,我们鼓励下载和审查“架构与开发电子书”,因为在指导中解释的架构风格和架构模式和技术在解释许多模式实现时使用此参考应用程序,因此您将更好地了解上下文,设计以及在当前架构和内部设计中采取的决策。...
157_kafka编程API实现生产者和消费者+ w9 l1 N( D8 E% z( D; G 158_kafka手动修改zk的偏移量实现消费处理( w7 s! K9 v7 U3 P7 T4 j 159_kafka与flume集成-source集成- _, G+ K) y% I4 D" q9 \ 160_kafka与flume集成-...
面向客户端的核心功能,即消费者、生产者、模式等。 Franzy-Common,Kafka 客户端 客户 使用 Clojure 管理 Kafka,获取 Clojure 数据输入/输出,创建主题,添加分区,列出代理等。 Franzy-Common,Kafka 服务器...
高并发之单(多)生产者消费者线程 高并发复用数据库链接技术详解之数据库连接池 类加载器的高级特性(自定义类加器实现加密解密) iBATIS开源主流框架(实现半自动化hibernate) 企业实用技能之详解(眼睛横纹模式验证码...
STANDBY电流测试:测量IC处于HALT模式时即每一个接点(PAD)在1态0态或Z态保持不变时的漏电流是否符合最低之规格。  耗电测试:整颗IC的静态耗电与动态耗电。  输入电压测试:测量每个输入接脚...
编键的数据 事件被分类路由到处理单元(Processing Elements,PEs),处理单元消费这些事 件,做如下事情之一或全部:(1)发出一个或多个可能被其他 PE 处理的事件。 (2)发布结果。这种架构类似提供了封装和地址透明语义的 ...
通常,生产者和消费者之间存在数据格式合同。 事件:通常,状态更改的通知。 带有时间戳的轻巧,不可变的记录,以及发生了什么的详细信息。 事件示例:基于事件的模型的示例是为在线拍卖中的特定项目提交出价。 ...
本工程包含了SpringAOP,死锁,JUC同步锁,读-写同步锁,线程本地使用,JUC线程池和Spring提供的线程池,jdk 1.8中的日期时间API,数据结构中图的实现及操作和广度优先遍历/深度优先遍历(其他待完善),生成XML文件...
>要保证可靠性传输需要从三个角度来考虑:第一是生产者弄丢了数据,第二是消息队列弄丢了数据,第三是消费者弄丢了数据 > >第一种情况rabbitmq提供了transaction和confirm模式来确保生产者不会丢失消息 >transaction...
tensorflow实战场景tfrecord方式读取数据的数据样本,现在tensorflow架构里限制整个流程瓶颈的是数据IO,用Queue机制异步的方式(生产者消费者模式)实现数据IO可以高效完成数据的预处理和读取,有效利用GPU资源。
Java客户端实现Kafka生产者与消费者实例 kafka的副本机制及选举原理剖析 基于kafka实现应用日志实时上报统计分析 RabbitMQ 初步认识RabbitMQ及高可用集群部署 详解RabbitMQ消息分发机制及主题消息分发 ...
**4)线程池**:基于C++的生产者消费者模式的并发开发,具体技术运用如下:\ **①线程池底层结构**:线程池创建相当于消费者,队列添加相当于生产者,通过vector维护线程池,通过queue<function<>>维护任务队列;...
我们设计并实现的基于J2EE四层结构的系部动态网站,根据生产--消费模式,将应用的逻辑处理和应用的表现相分离,WEB服务器负责应用的表现,应用逻辑层负责应用的逻辑处理。前台系统即消费子系统,为访问者提供信息的...
二 电子客票系统的系统规划 (一)系统设计思路 采纳结构化系统开发方法---生命周期法,设计思路如图 (二) 系统设计思想 (1)页面模块化 本系统把页面中的一些常用代码编写为独立的单元,例如页面的头部和尾部代码、...
1-互联网产品商业模式1.mp4 2-互联网产品商业模式2.mp4 3-互联网产品商业模式3.mp4 4-互联网产品商业模式4.mp4 5-互联网产品商业模式5.mp4 6-互联网产品商业模式6.mp4 3产品的商业模式画布 1-产品的商业...
随着经济的发展和消费者需求的多样化,连锁加盟模式逐渐成为企业快速扩张和品牌推广的重要手段。然而,连锁加盟管理面临着诸多挑战,如加盟商管理、运营标准化、服务质量控制等。因此,构建一个高效、便捷、统一的...
4.1.3 理解并行的生产者-消费者模式 4.1.4 ConcurrentStack 4.1.5 将使用数组和不安全集合的代码转换为使用并发集合的代码 4.1.6 ConcurrentBag 4.1.7 IProducerConsumerCollection 4.1.8 BlockingCollection ...