一、需求分析
在上一篇中,我们搭建了一套实时日志分析平台,目前该平台的主要需求就是监测日志中是否含有某些敏感信息,对于不同的日志来源渠道,规则是不同的,有些是默认规则,有些是用户个性化需求,比如A系统,我的日志里面不允许出现hello这个单词,B系统我的日志里面不允许出现world这个单词,当用户新增了敏感信息后,要求应用能够近乎实时的更新其本地缓存(默认情况下,当storm启动的时候,会加载默认规则到bolt里面,而不是每次都从DB查询),这里我们采用redis的发布订阅来实现。
二、Storm使用Redis发布订阅
redis的发布订阅类似于观察者模式,订阅者可以订阅多个主题,当发布者发布消息到某个主题的时候,订阅这个主题的客户端都可以收到,从而进行后续的业务处理。
在看具体的代码实现之前,需要先了解一下storm里面bolt的生命周期以及bolt相关的几个方法是干嘛的
public class IBolt接口测试 implements IBolt{
@SuppressWarnings("rawtypes")
@Override
public void prepare(Map stormConf, TopologyContext context,
OutputCollector collector) {
/**
* 1、提供bolt运行的一些环境
*/
}
@Override
public void execute(Tuple input) {
/**
* 1、一次处理一个输入的元祖,元祖对象包括来自哪个组件/流/任务的元数据
* 2、IBolt没有立即处理元祖,而是完整的捕获一个元祖并在以后进行处理
* 3、如果实现basicBolt则不用手动ack()
*/
}
@Override
public void cleanup() {
/**
* 1、当一个bolt即将关闭时调用,不能保证一定被调用,集群的kill -9 不行
*
*/
}
/**
* bolt的生命周期:在客户端主机上创建Ibolt对象,bolt被序列化到拓扑,并提及到nimbus,然后nimbus
* 启动工作进程(worker)进行反序列化,调用其prepare()方法开始处理
*/
}
我们的初始化工作都在prepare方法里面完成,对于不同的日志来源,可能topology的配置不一样,比如名字,应用需要监听的主题,所以我们在部署的时候,可能main方法会有几个,即不同的topic采用不同的topology进行接收处理,但是bolt尽量做到通用,在bolt里面,根据传入的工程名加载相对应的规则文件。先看代码
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>flume</groupId>
<artifactId>storm</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>storm</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.3.3.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>1.1.0</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.clojure</groupId>
<artifactId>clojure</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.ap