架构学习-生产消费者模式(七)

246 阅读4分钟

image.png

生产者消费者模式

  • 同步调用变异步调用

  • 生产数据与消费数据分离

  • 协调不同处理速度

生产者

  • 系统运转的动力
  • 为下一环节产生待处理的工作/数据
  • 与消费者的关系
    • 重点在如何将数据发送到容器
    • 对消费者无依赖
    • 不关注消费者的how/when
  • 发送顺序

消费者

  • 从容器中获得数据,并按照自身业务逻辑处理
  • 依赖于容器,不直接依赖于生产者
  • 向容器确认数据已经被消费
  • 处理后数据
    • 从容器中删除(queue)
    • 保留在容器中(topic)
  • 消费顺序

容器

  • 消费者与生产者的交汇点
  • 保管数据的责任
    • 容量
    • 保存时间
    • 读写效率
  • 生产者和消费者的差速器
  • 数据分配策略

核心问题:平衡

  • 数据不堆积,不溢出,不浪磁盘
  • 消费者无资源浪费.不会出现1000个消费者消费100个消息
  • 调度算法,确保不堆积,消费者无资源浪费

EDA异同

EDA

  • 事件触发流程
  • 重点在事件本身
  • 不解决事件/消息如何传递的问题

Producer-Consumer

  • 强调的是从生产端到消费端到全流程
  • 从抽象程度来看EDA更抽象

消费策略

决定消费者如何消费数据

消费方式

  • push
  • poll

分发方式

  • Topic
  • Queue

事务性

优点:低耦合

  • Producer,Consumer和Container均可独立变化
  • Producer和Consumer互无相互依赖
  • 无事务系统对三者都无约束
  • 异步运作

优点:分布式部署

  • Producer,Consumer和Container均可分开部署
  • Producer,Consumer和Container自成分布式系统
  • 各自按需扩展

优点:平衡系统差速

  • 通过Container来平衡生产速度和消费速度
  • 动态调节Producer和Consumer数量
  • 减少资源浪费
    • 避免生产过多数据
    • 避免数据堆积在容器

削峰填谷

  • 削峰
    • 生产数据超过消费数据
    • 缓存数据
  • 填谷
    • 生产数据的速度下降
    • 消费端消费速度不变
  • 单点流量增加不影响系统稳定性
    • 整体系统运行于匀速状态

数据单元

设计数据单元

定义

  • 生产者放入/发送到容器的单体
  • 容器内存储的单体
  • 消费者消费的单体

从业务逻辑推导

  • 数据单元具备业务含义
  • 数据单元的颗粒度适中

完整性保证

  • 传输过程中数据单元不可缺失

无依赖

  • 数据单元是独立的
  • 两个数据单元之间互无影响

设计Producer

生产/发送

  • 对发送成功的确认
  • 始乱终弃(Fire-and-forget)
  • 望穿秋水(Synchronous send)
  • 云中谁寄锦书来(Aynchronous send)

序列化

  • 数据单元变成用于网络传输的数据
  • JSON
  • Avro
  • Thrift
  • Protobuf

数据单元独立性

  • 时间
  • 空间

异常处理

  • 超时
  • 重试
  • 错误

Consumer消费模式

推(push)

  • 由container发起,将数据单元推送给consumer
  • Consumer可以尽快获得数据

拉(pull)

  • 由consumer发起
  • Long polling
  • 获取数据有滞后

Consumer分发模式

  • Queue
    • point to point
    • 1->1
    • 不可重复消费
  • Pub/Sub
    • Topic
    • 1->N
    • 重复消费

反序列化

消费确认

  • commit log
  • ack

消费策略

  • 批量/单体
  • 同步/异步
  • 幂等

Container

集群

  • replica
    • Nodes Master-slave
    • Partitions
  • Non-replica
    • 只存meta data
    • 读取转移

数据存储和调度

  • 消息/数据存储
    • 数据单元的存储结构
    • 时效性
  • 调度算法
    • 分配数据单元到consumer

QoS(消费保证)

At least once

  • producer保证consumer至少收到一次数据单元
  • 从业务分析container中可能有重复数据单元
  • consumer实现要防重或幂等

At most once

  • producer保证consumer最多收到一次数据单元
  • 从业务分析container中可能会丢失部分数据单元
  • consumer可能无法读取到所需数据单元
  • 引入第三方数据对比验证程序

Exactly once

  • producer保证consumer收到并仅有收到一次数据单元
  • 从业务分析container中有且仅有一份数据单元
  • consumer无需防重