需求
某个图书网站,希望看到双十一秒杀期间实时的热销排行榜单。我们可以将“实时热门商品”翻译成程序员更好理解的需求:每隔5秒钟输出最近一小时内点击量最多的前 N 个商品/图书.
需求分解
将这个需求进行分解我们大概要做这么几件事情:
- 告诉 Flink 框架基于时间做窗口,我们这里用processingTime,不用自带时间戳
- 过滤出图书点击行为数据
- 按一小时的窗口大小,每5秒钟统计一次,做滑动窗口聚合(Sliding Window)
- 聚合,输出窗口中点击量前N名的商品
代码实现
向Kafka发消息模拟购买事件
1 | public class KafkaProducer { |
其中的:MyNoParalleSource
是作者自己实现的一个并行度为1的发送器,用来向kafka发送数据:
1 | public class MyNoParalleSource implements SourceFunction<String> {//1 |
可见,我们每过1秒向Kafka的topn这个topic随机发送一本书的名字用来模拟购买行为。
整体实现代码如下:
1 | public class TopN { |
查看输出:1
2
3
4
5
6
7
8=================
热销图书列表:
2019-03-05 22:32:40.004{8=(Java从入门到放弃,8), 7=(C++从入门到放弃,7), 5=(Php从入门到放弃,5)}
===============
=================
热销图书列表:
2019-03-05 22:32:45.004{8=(Java从入门到放弃,8), 7=(C++从入门到放弃,7), 5=(Php从入门到放弃,5)}
===============