在SessionWindows启动和结束时向Kafka发送消息

时间:2019-08-08 07:01:43

标签: apache-kafka apache-flink flink-streaming

我想在创建新的SessionWindow以及结束会话时向Kafka主题发送消息。我有以下代码

stream
    .filter(user -> user.isAdmin)
    .keyBy(user -> user.username)
    .window(ProcessingTimeSessionWindows.withGap(Time.seconds(10)))
//what now? Trigger?

现在,我想在新会话开始时发送消息(使用一些元数据,例如Web浏览器和时间戳,这些信息在流的每个元素中都可用),并在会话结束时(在此示例中,在10秒后)将消息发送到Kafka。我认为是最后一个元素),其中包含请求总数。

在Flink中可以吗?我想我应该使用一些触发器,但我不知道如何,也找不到任何示例。

2 个答案:

答案 0 :(得分:1)

如果要在处理窗口时执行此操作,则可以简单地使用 make a global.aspx file protected void Application_BeginRequest(object sender, EventArgs e) { var context = HttpContext.Current; var response = context.Response; // enable CORS response.AddHeader("Access-Control-Allow-Origin", "*"); if (context.Request.HttpMethod == "OPTIONS") { response.AddHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); response.End(); } } in your web.config <system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Headers" value="accept, content-type" /> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS" /> </customHeaders> </httpProtocol> </system.webServer> ,基本上需要做的就是将WindowProcessFunction添加到代码中。在.process(new MyProcessFunction()中,您可以访问整个窗口,包括其第一个(开始)和最后一个(结束)元素。您可以简单地使用Side输出来只输出给定窗口的开始和结束。然后,您可以从侧面输出创建流并将其沉入Kafka。可以在here中找到更多有关侧面输出的信息。

答案 1 :(得分:0)

您可以编写自定义窗口触发器。

  1. 如何告知开始新会话?
    您可以创建一个ThreadPoolExecutor executor = Executors.newSingleThreadExecutor(); executor.scheduleAtFixedRate(() -> renderFrame(), 0, 1000 / 60, TimeUnit.ms); ,默认值为null,因此,如果状态值为null,则它是会话开始。

  2. 会话何时结束?
    就在ValueState之前。

这是一个基于Flink的TriggerResult.FIRE的演示,我仅在此处添加与问题相关的逻辑,您可以从源代码中查看其他详细信息。

ProcessingTimeTrigger