`
saybody
  • 浏览: 904323 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

架构设计:生产者/消费者模式[1]:如何确定数据单元?

阅读更多

  既然前一个帖子 已经搞过扫盲了,那接下来应该开始聊一些具体的编程技术问题了。不过在进入具体的技术细节之前,咱们先要搞明白一个问题:如何确定数据单元?只有把数据单元分析清楚,后面的技术设计才好搞。<!-- program-think-->

  ★啥是数据单元
  何谓数据单元捏?简单地说,每次生产者放到缓冲区的,就是一个数据单元;每次消费者从缓冲区取出的,也是一个数据单元。对于前一个帖子 中寄信的例子,我们可以把每一封单独的信件看成是一个数据单元。
  不过光这么介绍,太过于简单,无助于大伙儿分析出这玩意儿。所以,后面咱们来看一下数据单元需要具备哪些特性。搞明白这些特性之后,就容易从复杂的业务逻辑中分析出适合做数据单元的东西了。

  ★数据单元的特性
  分析数据单元,需要考虑如下几个方面的特性:
  ◇关联到业务对象
  首先,数据单元必须关联到某种业务对象。在考虑该问题的时候,你必须深刻理解当前这个生产者/消费者模式所对应的业务逻辑 ,才能够作出合适的判断。
  由于“寄信”这个业务逻辑比较简单,所以大伙儿很容易就可以判断出数据单元是啥。但现实生活中,往往没这么乐观。大多数业务逻辑都比较复杂,当中包含的业务对象是层次繁多、类型各异。在这种情况下,就不易作出决策了。
  这一步很重要,如果选错了业务对象,会导致后续程序设计和编码实现的复杂度大为上升,增加了开发和维护成本。
  ◇完整性
  所谓完整性,就是在传输过程中,要保证该数据单元的完整。要么整个 数据单元被传递到消费者,要么完全没有传递到消费者。不允许出现部分 传递的情形。
  对于寄信来说,你不能把半封信放入邮筒;同样的,邮递员从邮筒中拿信,也不能只拿出信的一部分。
  ◇独立性
  所谓独立性,就是各个数据单元之间没有互相依赖,某个数据单元传输失败不应该影响已经完成传输的单元;也不应该影响尚未传输的单元。
  为啥会出现传输失败捏?假如生产者的生产速度在一段时间内一直超过消费者的处理速度,那就会导致缓冲区不断增长并达到上限,之后的数据单元就会被丢弃。如果数据单元相互独立,等到生产者的速度降下来之后,后续的数据单元继续处理,不会受到牵连;反之,如果数据单元之间有某种耦合,导致被丢弃的数据单元会影响到后续其它单元的处理,那就会使程序逻辑变得非常复杂。
  对于寄信来说,某封信弄丢了,不会影响后续信件的送达;当然更不会影响已经送达的信件。
  ◇颗粒度
  前面提到,数据单元需要关联到某种业务对象。那么数据单元和业务对象是否要一一对应捏?很多场合确实是一一对应的。
  不过,有时出于性能等因素的考虑,也可能会把N个业务对象打包成一个数据单元。那么,这个N该如何取值就是颗粒度的考虑了。颗粒度的大小是有讲究的。太大的颗粒度可能会造成某种浪费;太小的颗粒度可能会造成性能问题。颗粒度的权衡要基于多方面的因素,以及一些经验值的考量。
  还是拿寄信的例子。如果颗粒度过小(比如设定为1),那邮递员每次只取出1封信。如果信件多了,那就得来回跑好多趟,浪费了时间。
  如果颗粒度太大(比如设定为100),那寄信的人得等到凑满100封信才拿去放入邮筒。假如平时很少写信,就得等上很久,也不太爽。
  可能有同学会问:生产者和消费者的颗粒度能否设置成不同大小(比如对于寄信人设置成1,对于邮递员设置成100)。当然,理论上可以这么干,但是在某些情况下会增加程序逻辑和代码实现的复杂度。后面讨论具体技术细节时,或许会聊到这个问题。

  好,数据单元的话题就说到这。希望通过本帖子,大伙儿能够搞明白数据单元到底是怎么一回事。下一个帖子,咱们来聊一下“基于队列的缓冲区 ”,技术上如何实现。


版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者编程随想 和本文原始地址:

http://program-think.blogspot.com/2009/03/producer-consumer-pattern-1-data.html

分享到:
评论

相关推荐

    架构设计 -- 生产者/消费者模式

    【生产者/消费者模式】是一种常见的并发编程和系统设计模式,它主要解决的是在多线程环境下,如何协调生产者和消费者之间的数据处理问题。在软件开发中,生产者通常是生成数据的一方,而消费者则是处理这些数据的...

    架构设计 生产者消费者模式

    在使用生产者消费者模式时,需要确定数据单元的特性,包括: ◇关联到业务对象:数据单元必须关联到某种业务对象。 ◇独立性:数据单元之间应该是独立的,不应该相互依赖。 ◇一致性:数据单元的格式和结构应该是...

    LabView图形化编程语言之生产者消费者架构串口数据高速采集.zip

    在“LabView图形化编程语言之生产者消费者架构串口数据高速采集”这个主题中,我们将深入探讨如何使用LabView来构建高效的数据采集系统,特别是涉及到串口通信和生产者消费者模式。 首先,让我们理解生产者消费者...

    基于队列的状态机—生产者消费者架构

    ### 基于队列的状态机—生产者消费者架构知识点详解 #### 一、状态机的概念与作用 **状态机**是一种广泛应用于程序设计中的模式,尤其在LabVIEW这类图形化编程环境中,状态机被用来控制程序流程和状态转换。在...

    生产者消费者模式在java中的应用

    6. `谷度科技_客户关系及资源管理系统_CRM.xls`文件可能是介绍如何在CRM系统中应用生产者消费者模式的案例,可能包含了系统的架构设计、性能分析等信息。 在实际开发中,生产者消费者模式有助于提高系统并发性,...

    《生产者/消费者循环》后续资源包.zip

    同时,也会涉及简单的阻塞队列(如ArrayBlockingQueue)的使用,它是实现生产者/消费者模式的一个常见工具。 中级教程则可能进一步深入到更复杂的同步策略,如信号量(Semaphore)、条件变量(Condition)以及各种...

    生产者/消费者设计模式在连续音频信号采集系统的应用

    相比之下,队列提供了数据的存储和管理,确保了数据的安全传输,并支持多数据项的FIFO(先进先出)处理,是实现生产者/消费者模式的理想选择。 在音频信号采集系统中,生产者循环不断地将采集到的音频数据放入队列...

    并发编程笔记(httpswww.bilibili.comvideoav84491203p=279).zip

    生产者消费者模式通过阻塞队列实现数据的生产和消费;读写者模式允许多个读取者同时访问资源,但写入者独占资源;单例模式在并发环境中确保只有一个实例存在,双检锁和静态内部类是实现线程安全单例的常用方式。 **...

    生产者消费者演示程序

    通过对这个代码的分析和学习,我们可以更深入地理解多线程同步以及生产者消费者模式在实际应用中的实现方法。 总之,生产者消费者问题是多线程编程中的一个重要概念,它展示了如何通过同步机制来协调不同任务之间的...

    基于生产者/消费者设计模式的连续音频信号采集系统

    在IT行业,虚拟仪器的概念及其应用是工程师和科研人员需要深入理解的...LabVIEW平台提供的图形化编程环境,使得开发者可以直观地设计系统架构,方便地实现生产者/消费者模式,从而构建出高效、可靠的音频信号处理系统。

    LabVIEW生产者消费者架构串口数据高速采集.rar

    在"LabVIEW生产者消费者架构串口数据高速采集"这个项目中,我们将深入探讨如何利用LabVIEW的生产者-消费者模型实现串口数据的高效采集。 生产者-消费者模型是并发编程中的一个经典模式,用于解决数据处理的同步和...

    逐步深入LabVIEW程序设计架构

    生产者/消费者循环设计模式是另一种广泛应用于LabVIEW的设计模式,主要用于处理数据流问题。在这种模式下,生产者负责生成数据,而消费者则负责处理这些数据。 ##### 3.1 Producer/Consumer(Data) (基于数据的生产...

    RocketMQ概念 producer:生产者,消息发送者

    1. **Producer**: 生产者是消息的源头,负责生成并发送消息到RocketMQ系统。一个`Producer Group`由多个`Producer`组成,它们共享同组内的配置信息,如发送策略和主题。生产者可以选择同步、异步或单向发送消息。 ...

    逐步深入LabVIEW程序设计架构1.pptx

    本篇文章将详细探讨三种常用的设计模式:顺序结构、状态机架构以及基于生产者消费者机构的架构。 首先,**顺序结构**是最基础的编程模型,按照固定的顺序执行一系列操作。它简单易懂,适用于执行线性任务,但可能...

    企业架构设计(业务架构、数据架构、应用架构、技术架构)方法及实例.pptx

    1. **电商企业案例**:通过优化组织架构、职能架构和业务流程等要素,实现了从供应商到消费者的全链条数字化运营,大幅提高了业务效率和客户满意度。 2. **制造企业案例**:围绕“智能制造”战略目标,对组织架构、...

    三十种架构设计模式(上).pdf

    **定义**: 大使模式是指在网络请求中创建一个代理服务,该服务位于消费者服务或应用程序之外,负责处理与远程服务的通信。这种代理通常负责服务路由、熔断、跟踪、监控、授权、数据加密和日志记录等功能。 **应用...

    RocketMQ生产消费者模型实现

    1. Push模式:消费者订阅主题后,RocketMQ服务器主动将消息推送到消费者,消费者只需处理接收到的消息。 2. Pull模式:消费者主动从RocketMQ服务器拉取消息,可根据需要控制消费速度。 四、RocketMQ消费模型实现 1....

    创业天下:让消费者变成生产消费者.pdf

    《创业天下:让消费者变成生产消费者.pdf》一文,涉及了当前电商平台、互联网商业模式的创新,特别是针对消费者角色的转变,以及新兴技术在电商系统中的应用。文章阐述了“创业天下”这款App如何通过融合分享经济、...

    通用任务分发框架(TaskDispatcher),基于生产者消费者模式

    生产者消费者模式是一种多线程设计模式,用于解决数据的生产和消费问题。在这个模式中,生产者负责生成任务,而消费者则负责处理这些任务。中间通过一个缓冲区进行隔离,确保生产与消费的同步,避免了数据的不一致性...

Global site tag (gtag.js) - Google Analytics