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

生产者消费者模式
-
同步调用变异步调用
-
生产数据与消费数据分离
-
协调不同处理速度
生产者
- 系统运转的动力
- 为下一环节产生待处理的工作/数据
- 与消费者的关系
-
-
-
- 发送顺序
消费者
- 从容器中获得数据,并按照自身业务逻辑处理
- 依赖于容器,不直接依赖于生产者
- 向容器确认数据已经被消费
- 处理后数据
-
-
- 消费顺序
容器
- 消费者与生产者的交汇点
- 保管数据的责任
-
-
-
- 生产者和消费者的差速器
- 数据分配策略
核心问题:平衡
- 数据不堆积,不溢出,不浪磁盘
- 消费者无资源浪费.不会出现1000个消费者消费100个消息
- 调度算法,确保不堆积,消费者无资源浪费
EDA异同
EDA
- 事件触发流程
- 重点在事件本身
- 不解决事件/消息如何传递的问题
Producer-Consumer
- 强调的是从生产端到消费端到全流程
- 从抽象程度来看EDA更抽象
消费策略
决定消费者如何消费数据
消费方式
分发方式
事务性
优点:低耦合
- 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分发模式
反序列化
消费确认
消费策略
Container
集群
数据存储和调度
QoS(消费保证)
At least once
- producer保证consumer至少收到一次数据单元
- 从业务分析container中可能有重复数据单元
- consumer实现要防重或幂等
At most once
- producer保证consumer最多收到一次数据单元
- 从业务分析container中可能会丢失部分数据单元
- consumer可能无法读取到所需数据单元
- 引入第三方数据对比验证程序
Exactly once
- producer保证consumer收到并仅有收到一次数据单元
- 从业务分析container中有且仅有一份数据单元
- consumer无需防重