> 文档中心 > 传递事件流

传递事件流

批处理领域,作业的输入和输出是文件(也许在分布式文件系统)。流处理领域中的等价物是啥呢?

当输入是一个文件(一个字节序列),第一个处理步骤通常是将其解析为一系列记录。在流处理的上下文中,记录通常被叫做事件(event) ,本质是一样的:一个小的、自包含的、不可变的对象,包含某时间点发生的某事的细节。一个事件通常包含一个来自日历时钟的时间戳,以指明事件发生的时间。

发生的事件可能是:

  • 用户行动,如查看页面或进行购买

  • 也可能源于机器,如对温度传感器或 CPU 利用率的周期性测量

    “使用 Unix 工具的批处理” 的示例中,Web 服务器日志的每一行都是个事件。

事件可能被编码为文本字符串或JSON或二进制编码。这允许你存储一个事件,如将其追加到一个文件,将其插入关系表或写入文档DB。还允许你通过网络将事件发送到另一个节点处理。

批处理中,文件被写入一次,然后可能被多个作业读取。流处理中,一个事件:

  • 由producer(也称publisher、sender)生成一次
  • 可能由多个consumer( subscribers、recipients)处理。文件系统中,文件名标识一组相关记录;流式系统中,相关的事件通常被聚合为一个主题(topic)或流(stream)。

文件或数据库就足以连接Pro和Con:Pro将其生成的每个事件写入数据存储,且每个Con定期轮询数据存储,检查自上次运行以来新出现的事件。这正是批处理每天结束时处理当天数据时所做之事。

但当想进行低延迟连续处理时,若数据存储不是为这种用途专门设计,则轮询开销很大。轮询越频繁,能返回新事件的请求比例就越低,额外开销越高。最好能在新事件出现时直接通知Con。

数据库在传统上对这种通知机制支持的并不好,关系型数据库有触发器(trigger),可对变化(如插入表中的一行)反应,但功能有限,且在数据库设计中有些后顾之忧。已开发了专门的工具来提供事件通知。

麦克风网