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()调用可能会被延迟的缺点。
以上内容是否对您有帮助:
更多建议: