Samza窗口功能

2018-08-22 17:45 更新

有时,流处理作业需要定期执行某些操作,无论作业正在处理多少个传入消息。例如,假设您要报告每分钟的页面浏览次数。为此,您每次看到页面查看事件时都会增加一个计数器。每分钟一次,将当前计数器值发送到输出流,并将计数器复位为零。

Samza 的窗口功能为任务以常规时间间隔提供了一种方式,例如每分钟一次。要启用窗口,您只需要在作业配置中设置一个属性:

# Call the window() method every 60 seconds
task.window.ms=60000

接下来,您的流任务需要实现WindowableTask接口。此接口定义了一个由 Samza 在您配置的常规间隔中调用的 window()方法。

例如,您将如何实现基本的每分钟事件计数器:

public class EventCounterTask implements StreamTask, WindowableTask {

  public static final SystemStream OUTPUT_STREAM =
    new SystemStream("kafka", "events-per-minute");

  private int eventsSeen = 0;

  public void process(IncomingMessageEnvelope envelope,
                      MessageCollector collector,
                      TaskCoordinator coordinator) {
    eventsSeen++;
  }

  public void window(MessageCollector collector,
                     TaskCoordinator coordinator) {
    collector.send(new OutgoingMessageEnvelope(OUTPUT_STREAM, eventsSeen));
    eventsSeen = 0;
  }
}

如果需要向输出流发送消息,可以使用传递给 window()方法的MessageCollector对象。请仅使用该 MessageCollector 对象发送消息,并且不要在调用 window()之外使用它。

请注意,Samza 使用单线程执行,因此 window()调用永远不会与 process()调用同时发生。这样做的优点在于您不需要担心代码中的线程安全性(不需要同步任何内容),但如果您的process()方法需要很长时间才能返回,则 window()调用可能会被延迟的缺点。

协调器流  »

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号