流处理系统
批处理系统中,一个作业输入和输出的是文件
,流处理系统 等效的流
是什么。
流是什么
一个小的不可变的对象,该对象包含某个时间点发生的事情的细节。每个事件包含一个时间点。(墙上时钟)
例如 web 日志的每一行都是一个事件。
事件: 通常事件会被编码为文本字符串或者是JSON,或者是某种二进制形式。通过这种编码的方式保存事件。可以持久化。或者通过网络事件发送到另一个节点进行处理。
主题:文件被写入一次可能被多个作业读取,流术语中,事件也可能有多个消费者或者是订阅接受者。流系统中,相关的事件,通常被组合成主题或者是流。
消息系统
向消费者通知新事件的常见方法通常是使用消息系统:生产者发送包含事件的消息,然后该消息被推送到了一个或者是多个消费者。
数据库或者是文件系统连接生产者和消费者
生产者和消费者在除了消息系统这种模式还有另外的实现。
生产者将每个事件都写入到数据存储。消费者定期轮训出现的事件。要求延迟事件较短的情况下进行连续的处理开销非常大。
数据库触发器
功能比较有限(有点时候考虑的意思)因此出现了消息系统
专门提供事件通知。
发布/订阅 模式
和UNIX 管道TCP 连接一个发送者和一个接受者不同,消息系统允许多个生产者发送到同一个主题
,并且允许多个消费者节点接受主题的消息。不同的系统采用了不同的方法。
区分不同系统实现的方法
1 如果生产者发送消息的速度比消费者所能处理的块,会发生什么情况?
- 系统丢弃消息。
- 将消息缓存在队列中。
- 激活
背压
其实就是阻止生产者发送更多的消息过来。也叫作流量控制。(UNIX 和 TCP都有相关的设计,如果缓存满了会激活背压,阻止发送者发送数据,其实就是网络拥塞与排队)
缓存在队列中会出现新的问题。
内存如果无法容纳所有的队列系统是否会崩溃。
如果写入磁盘,磁盘访问如何影响传递系统的性能。
2 如果节点崩溃或者是暂离,是否会消息丢失?
- 和数据库一样要写入磁盘或者是复制方案。(这样都是有成本的,但是能够接受一定程度上的丢失消息,那么在同样的硬件上面可以获得更好的吞吐量和性能。)
消息是否可以丢失?
消息是否可以丢失其实很大程度上取决于应用程序,
偶尔丢失数据可能不重要
- 周期性传输的传感器读数和指标。(因为更新的值马上就会再传过来)
如果需要对传输过来的值进行计数。可靠的传输就显得很重要了。
生产者和消费者的直接消息传递。
- UDP 组播广泛应用于金融行业,股票等低延时的场景。
消息代理(消息队列)
其实就是消息队列。实质上就是:针对处理消息而优化的数据库。生产者和消费者作为客户端连接到它。生产者将消息写入消息队列。消费者读取消息。
队列的存在导致了消费以异步的方式工作。生产者发送消息,只需要等待消息队列确认已经缓存了消息
不会等待消费者消费消息。
数据库和消息队列的区别
- 消息队列一般在成功传递后会自动删除消息,不会保存。
- 多数的消息系统,会嘉定当前的工作集相当小,即队列很短。
- 消息队列不支持任何的查询,相反如果数据发生新的变化的时候,会通知到客户端。