Presto 设计与实现(七):Event
之前在 TalkingData 参与过移动广告监测产品的设计和开发,每天需要处理大量的广告点击、曝光、下载、注册和登录等数据,对于每条数据都需要进行如下处理:
处理前后记录日志;
使用 Redis 累加每种类型每天的数据条数;
处理时发生异常,将该条数据上报报警中心,报警中心根据异常发生的频率决定是否报警;
如果是点击数据,需要提取点击数据中携带的关键标识写入 Cassandra,用于后续的归因分析。
编码实现时尽量减少前后依赖,让代码变得简单,易于维护。这里推荐使用观察者模式来解耦,每个分发逻辑只监听关心的事件。当然我们不是从 0 开始,可以从 Airlift Event 开始。
1. Airlift Event
借助于 Airlift Event 我们可以这样设计:
EventService:用于广告数据的处理,处理过程中会产生事件,之后推送给 MultiEventClient;
MultiEventClient: 相当于观察者模式中的 Subject,如有新事件会通知 Observer;
EventClient 具体的实现类: 相当于观察者模式中的 Observer,先注册到 Subject,之后监听新事件;
1.1 定义广告数据和处理服务
AdvertData:模拟广告数据;
AdvertDataService:处理广告数据接口;
AdvertDataServiceImpl:处理广告数据接口的实现类。
1.2 定义 Event 事件
AdvertEventType:事件类型,PROCESSING=处理中,ERROR=异常,PROCESSED=处理完毕;
AdvertEvent:事件,事件内部有事件类型、广告原始数据和扩展属性,如果使用 JSON 序列化,请使用标识事件类的注解 @EventType ,标识事件属性的注解 @EventField。
1.3 定义具体的 EventClient
可以继承 Airlift 提供的 AbstractEventClient 类,需要实现一个范型方法,我这里又简单封装一下:
1.4 编写 module
1.5 实际集成
执行程序后,可看见相关事件被正确处理:
2. 其他模块
event-http:通过 HttpEventClient 上报事件数据,需要在 config.properties 配置 service-inventory.uri 上报地址,HttpEventClient 会将事件序列化为 JSON 数据,之后上报数据;
http-client:底层基于 Jetty 的 HttpClient,支持 HTTP 1 和 HTTP 2 协议,支持创建同步异步客户端;
http-server:底层基于 Jetty 的 ServerConnector,ServerConnector 使用的还是 NIO,支持 HTTP 1 和 HTTP 2 协议。
3. Presto 中的应用
event 和 event-http:在 Presto Verifier 中推送查询验证事件,Presto Verifier 是用来验证 SQL 语句查询正确性的工具,例如验证同一个 SQL 多次查询返回结果是否相等;Preto 升级后的校验;
http-client:广泛的应用在单元测试中,用来模拟客户端的实际请求,验证 Server 端处理的正确性;
http-server:Presto 提供的所有的 HTTP 服务都是基于 http-server 构建的。
版权声明: 本文为 InfoQ 作者【冰心的小屋】的原创文章。
原文链接:【http://xie.infoq.cn/article/f7c42375b5414dd25d43ea16d】。文章转载请联系作者。
评论