前言
对于java web而言,一个用户的HTTP请求最终会转换为一条java线程处理。HTTP本身是无状态的,具体的请求逻辑一般也是无状态的。如果进程奔溃或者系统宕机,用户会发觉当前网页不可用之类的错误。虽然会影响一些用户体验,但是只要服务重启了,用户依然可以完成他的请求并满足其需要。但是有些情况下则势必会造成混乱甚至恐慌,例如跨行转账。用户从自己A银行的账户转账1万元至自己在B银行的账户,如果转出的动作成功了,但是转入却失败了,用户的心情是可想而知的,自己的财产不翼而飞了!一种解决的方式是引入事务,在此场景下还必须是分布式事务。如果只是银行内部实现分布式事务多少还是可行的,但是不同银行之间要实现的成本是可想而知的,甚至不可行的。如果A银行转出时对用户的状态作持久化,B银行对收到的转入请求也进行持久化,那么恢复用户的损失才有可能。
以上啰里啰嗦说了这么多,无非就是抛出个引子,进而介绍Akka提供的持久化功能。
Akka的持久化架构
- UntypedPersistentActor
- UntypedPersistentView
- UntypedPersistentActorAtLeastOnceDelivery
- AsyncWriteJournal
- Snapshot store
本文基于Akka官网提供的持久化例子,并对其进行一些适应性改造,将着重介绍UntypedPersistentActor、AsyncWriteJournal及Snapshot store的应用。
配置
有关Akka的日志持久化和快照持久化的配置如下:
persistence {
journal {
plugin = "akk