同事用flink写的服务,wifi和人关联查询,一个wifi数据kafka流,一个人的数据kafka流,按WIFI相机的设备号和时间关联查询,最后结果写入ClickHouse,如果不用flink这类框架,我想了一个实现分布式流处理的方法,代码写起来比用flink可能会繁琐一些,但应该也能做到可靠和高效。
各工作节点用同一个groupId消费同一个topic。
然后数据按设备ID分区,也就是分给各工作节点处理,某个节点遇到一个设备ID,就查自己的缓存,判断由谁处理,如果是分配给自己的就自己处理,如果是分配给别的节点的,就发给别的节点处理,如果缓存里没有,就发给主节点,由主节点按一定规则平均分配,主节点把该设备ID的分配结果缓存起来,也把分配结果发给各子节点。
缓存可以减少通信次数。
节点间发数据,攒够一定数量再发,以减少通信次数,这个数量可以调整。
通信采用socket短连接,提高可靠性。
由于是按设备ID和时间关联,所以按设备ID分区,分区后,属于同一个设备ID的数据不可能被分在两个机器,所以有关联的数据一定在同一个机器,不在同一个机器的数据一定没有关联。这样就可以做到关联查询了。
自己实现相对繁琐,好处1.不依赖hadoop和flink环境。2.方便和其他非flink服务一样用StatHub管理。3.对flink API不够精通,用错API的话会写出性能低下的flink程序。
================= 分隔 ===========================================================================================================
复杂的程序自己写不太现实,简单的可以自己实现。同事用flink写的另一个程序,比较简单,为了补某天缺失的数据,又不想折腾flink和服务器,就随手用SpringBoot写了一个,没用flink但功能和同事用flink写的一样,扔到StatHub上,跑了半小时,把缺失的数据补上了。