赞
踩
对于Java web而言,一个用户的HTTP请求最终会转换为一条Java线程处理。HTTP本身是无状态的,具体的请求逻辑一般也是无状态的。如果进程奔溃或者系统宕机,用户会发觉当前网页不可用之类的错误。虽然会影响一些用户体验,但是只要服务重启了,用户依然可以完成他的请求并满足其需要。但是有些情况下则势必会造成混乱甚至恐慌,例如跨行转账。用户从自己A银行的账户转账1万元至自己在B银行的账户,如果转出的动作成功了,但是转入却失败了,用户的心情是可想而知的,自己的财产不翼而飞了!一种解决的方式是引入事务,在此场景下还必须是分布式事务。如果只是银行内部实现分布式事务多少还是可行的,但是不同银行之间要实现的成本是可想而知的,甚至不可行的。如果A银行转出时对用户的状态作持久化,B银行对收到的转入请求也进行持久化,那么恢复用户的损失才有可能。
以上啰里啰嗦说了这么多,无非就是抛出个引子,进而介绍Akka提供的持久化功能。
有关Akka的日志持久化和快照持久化的配置如下:
persistence {
journal {
plugin = "akka.persistence.journal.leveldb"
leveldb.dir = "target/example/journal"
leveldb.native = false
}
snapshot-store {
plugin = "akka.persistence.snapshot-store.local"
local.dir = "target/example/snapshots"
}
}
根据配置,我们知道日志插件使用了leveldb,leveldb的存储目录为当前项目编译路径下的example/journal路径下。快照插件使用了local,存储路径与前者相同。
本例子中需要用到Cmd和Evt两种消息,Cmd代表命令,Evt代表事件。ExampleState代表我们例子中的状态。以上三个类的定义如下:
- public interface Persistence {
-
- public static class Cmd implements Serializable {
- private static final long serialVersionUID = 1L;
- private final String data;
-
- public Cmd(String data) {
- this.data = data;
- }
-
- public String getData() {
- return data;
- }
- }
-
- public static class Evt implements Serializable {
- private static final long serialVersionUID = 1L;
- private final String data;
-
- public Evt(String data) {
- this.data = data;
- }
-
- public String getData() {
- return data;
- }
- }
-
- public static class ExampleState implements Serializable {
- private static final long serialVersionUID = 1L;
- private final ArrayList<String> events;
-
- public ExampleState() {
- this(new ArrayList<String>());
- }
-
- public ExampleState(ArrayList<String> events) {
- this.events = events;
- }
-
- public ExampleState copy() {
- return new ExampleState(new ArrayList<String>(events));
- }
-
- public void update(Evt evt) {
- events.add(evt.getData());
- }
-
- public int size() {
- return events.size();
- }
-
- @Override
- public String toString() {
- return events.toString();
- }
- }
- }
上面代码展示的Cmd和Evt都很简单,它们有一样的data字段作为内容。ExampleState中维护了一个列表,次列表用于缓存所有的事件内容。
在具体介绍本例中持久化Actor之前,先看看其实现,其代码清单如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。