由于项目需要,我开始了学习Esper的任务。刚开始觉得他是个很高级的东西,学了一段时间后发现他确实是很高级的东西。不过貌似在国内的应用很少,网上都查不到什么资料的,所以我觉得在博客里写一下自己的学习的收获,一是总结所学知识点,二是分享给更多的学习者,毕竟好东西不能这样被埋没了。今天就先来简单介绍一下Esper是什么玩意儿。

       说到Esper,不得不说一下CEP。CEP即Complex Event Process,中文意思就是“复杂事件处理”。听起来好像很复杂,实际上就是基于事件流进行数据处理,把要分析的数据抽象成事件,然后将数据发送到CEP引擎,引擎就会根据事件的输入和最初注册的处理模型,得到事件处理结果。

       有人可能要问了,这和Hadoop有什么区别?可是本人不才,没学过Hadoop,虽然说赶上了这阵风,但是从很多人那了解以后,觉得不过就是个不是特别成熟的工具,然后各个公司要根据需求对Hadoop进行二次开发,就需要懂得源码的人。所以就没打算学了,一个工具而已,等到自己确实有空的时候再学也不迟。至于CEP和Hadoop的区别,应该是Esper和Hadoop的区别,我的理解是:Hadoop适合做事后分析,而Esper适合实时分析。Hadoop我确实不是很了解,如果有问题还希望大家指正。

       CEP是一种标准,Esper只是对这个标准的一种开源实现。除了Esper,很多大公司也有类似的商业软件,比如IBM,Sybase等等,听说巨贵无比。CEP的一个重要特点就是他是一个内存计算工具和类SQL语句。内存计算可以说是一把双刃剑。好处自不必说,一个字:快!坏处也显而易见,数据有丢失的风险,而且还有容量的限制(实时计算其实并不受制于内存大小,而是得看如何对实时进行定义,也就是具体的业务来决定了)。所以如果业务不能容忍数据丢失,那么高可用方案就必须做好,不过Esper的高可用很不好做,后面我将会说到。

       CEP的类SQL语句,可以理解为处理模型的定义与描述。这是运行在CEP引擎中的特殊语句,之所以叫他类SQL,是因为它和SQL确实很像,除了select,insert,delete,update,而且也有avg,count等函数。所以对于会SQL的人来说,他的语法结构大致还是能猜出一二的。在Esper中,这个句子叫做EPL,即Event Process Language。作为Esper的核心内容,对于它的讲解有三四百页的英文文档,所以之后我会慢慢向大家细细说明的。

下面就简单写个列子给大家看看吧。场景是计算3个苹果的平均价格


[java] view plain copy

1. package
2.   
3. import
4. import
5. import
6. import
7. import
8. import
9. import
10.   
11. /**
12.  * 
13.  * @author luonanqin
14.  *
15.  */
16. class
17. {  
18. private int
19. private int
20.   
21. public int
22.     {  
23. return
24.     }  
25.   
26. public void setId(int
27.     {  
28. this.id = id;  
29.     }  
30.   
31. public int
32.     {  
33. return
34.     }  
35.   
36. public void setPrice(int
37.     {  
38. this.price = price;  
39.     }  
40. }  
41.   
42. class AppleListener implements
43. {  
44.   
45. public void
46.     {  
47. if (newEvents != null)  
48.         {  
49. 0].get("avg(price)");  
50. "Apple's average price is "
51.         }  
52.     }  
53.   
54. }  
55. public class
56.   
57. public static void main(String[] args) throws
58.         EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();  
59.   
60.         EPAdministrator admin = epService.getEPAdministrator();  
61.   
62. class.getName();  
63. "select avg(price) from " + product + ".win:length_batch(3)";  
64.   
65.         EPStatement state = admin.createEPL(epl);  
66. new
67.   
68.         EPRuntime runtime = epService.getEPRuntime();  
69.   
70. new
71. 1);  
72. 5);  
73.         runtime.sendEvent(apple1);  
74.   
75. new
76. 2);  
77. 2);  
78.         runtime.sendEvent(apple2);  
79.   
80. new
81. 3);  
82. 5);  
83.         runtime.sendEvent(apple3);  
84.     }  
85. }

很简单的例子,虽然没有加注释,也应该很好懂吧。大家可以自己运行一下看看是什么结果。