codecamp

Samza窗口功能

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

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()调用可能会被延迟的缺点。

协调器流  »

管理 Samza 状态
Samza 协调器流
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Samza API

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }