数据密集型应用系统设计 笔记11流处理系统

流处理系统

批处理系统中,一个作业输入和输出的是文件,流处理系统 等效的是什么。

流是什么

一个小的不可变的对象,该对象包含某个时间点发生的事情的细节。每个事件包含一个时间点。(墙上时钟)
例如 web 日志的每一行都是一个事件。

在这里插入图片描述

事件: 通常事件会被编码为文本字符串或者是JSON,或者是某种二进制形式。通过这种编码的方式保存事件。可以持久化。或者通过网络事件发送到另一个节点进行处理。

主题:文件被写入一次可能被多个作业读取,流术语中,事件也可能有多个消费者或者是订阅接受者。流系统中,相关的事件,通常被组合成主题或者是流。

消息系统

向消费者通知新事件的常见方法通常是使用消息系统:生产者发送包含事件的消息,然后该消息被推送到了一个或者是多个消费者。

数据库或者是文件系统连接生产者和消费者
生产者和消费者在除了消息系统这种模式还有另外的实现。
生产者将每个事件都写入到数据存储。消费者定期轮训出现的事件。要求延迟事件较短的情况下进行连续的处理开销非常大。

数据库触发器
功能比较有限(有点时候考虑的意思)因此出现了消息系统专门提供事件通知。

发布/订阅 模式

和UNIX 管道TCP 连接一个发送者和一个接受者不同,消息系统允许多个生产者发送到同一个主题,并且允许多个消费者节点接受主题的消息。不同的系统采用了不同的方法。
在这里插入图片描述
区分不同系统实现的方法
1 如果生产者发送消息的速度比消费者所能处理的块,会发生什么情况?

  • 系统丢弃消息。
  • 将消息缓存在队列中。
  • 激活背压其实就是阻止生产者发送更多的消息过来。也叫作流量控制。(UNIX 和 TCP都有相关的设计,如果缓存满了会激活背压,阻止发送者发送数据,其实就是网络拥塞与排队

缓存在队列中会出现新的问题。
内存如果无法容纳所有的队列系统是否会崩溃。
如果写入磁盘,磁盘访问如何影响传递系统的性能。

2 如果节点崩溃或者是暂离,是否会消息丢失?

  • 和数据库一样要写入磁盘或者是复制方案。(这样都是有成本的,但是能够接受一定程度上的丢失消息,那么在同样的硬件上面可以获得更好的吞吐量和性能。)
消息是否可以丢失?

消息是否可以丢失其实很大程度上取决于应用程序,

偶尔丢失数据可能不重要
- 周期性传输的传感器读数和指标。(因为更新的值马上就会再传过来)
如果需要对传输过来的值进行计数。可靠的传输就显得很重要了。

生产者和消费者的直接消息传递。
  • UDP 组播广泛应用于金融行业,股票等低延时的场景。
消息代理(消息队列)

其实就是消息队列。实质上就是:针对处理消息而优化的数据库。生产者和消费者作为客户端连接到它。生产者将消息写入消息队列。消费者读取消息。

队列的存在导致了消费以异步的方式工作。生产者发送消息,只需要等待消息队列确认已经缓存了消息不会等待消费者消费消息。

数据库和消息队列的区别
  • 消息队列一般在成功传递后会自动删除消息,不会保存。
  • 多数的消息系统,会嘉定当前的工作集相当小,即队列很短。
  • 消息队列不支持任何的查询,相反如果数据发生新的变化的时候,会通知到客户端。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值