
188
|
第
11
章
11.2.2
状态
如果只是单独处理每一个事件,那么流式处理就很简单。例如,如果想从
Kafka
读取在线
购物交易事件流,找出金额超过
10 000
美元的交易,并将结果通过邮件发送给销售人员,
那么可以使用
Kafka
消费者客户端和
SMTP
库,几行代码就可以搞定。
如果操作里包含了多个事件,流式处理就会变得很有意思,比如根据类型计算事件的数
量、移动平均数、合并两个流以便生成更丰富的信息流。在这些情况下,光处理单个事件
是不够的,用户需要跟踪更多的信息,比如这个小时内看到的每种类型事件的个数、需要
合并的事件、将每种类型的事件值相加,等等。事件与事件之间的信息被称为“状态”。
这些状态一般被保存在应用程序的本地变量里。例如,使用散列表来保存移动计数器。事
实上,本书的很多例子就是这么做的。不过,这不是一种可靠的方法,因为如果应用程序
关闭,状态就会丢失,结果就会发生变化,而这并不是用户希望看到的。所以,要小心地
持久化最近的状态,如果应用程序重启,要将其恢复。
流式处理包含以下几种类型的状态。
本地状态或内部状态
这种状态只能被单个应用程序实例访问,它们一般使用内嵌在应用程序里的数据库进行
维护和管理。本地状态的优势在于它的速度,不足之处在于它受到内存大小的限制。所
以,流式处理的很多设计模式都将数据拆分到多个子流,这样就可以使用有限的本地状
态来处理它们。
外部状态
这种状态使用外部的数据存储来维护,一般使用
NoSQL
系统,比如
Cassandra
。使用外
部存储的优势在于,它没有大小的限制,而且可以被应用程序的多个实例访问,甚至被 ...