一个优秀的CQRS框架Reveno

一个优秀的CQRS框架Reveno

作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs

一、Reveno介绍

CQRS表示Command Query Responsibility Segregation,即命令和查询责任分离,是由Greg Young提出的一种将系统的读(查询)、写(命令)操作分离为两种独立子系统的架构模式。在一些应用场景下,这种分离是很有价值的,但要注意,CQRS对大多数系统而言,让系统变得更加复杂。

目前,大多数事务处理解决方案都经历了过度复杂的架构和难以维护的基础设施的痛苦,更不用说整体维护成本的昂贵。

Reveno是一个事件溯源的事务处理框架,提供了一个高性能、低延迟、支持容错、极其简单的一部事务处理、基于JVM的框架。Reveno的目标是提供一个简单易用的面向域的开发工具,透明的架构、非常适合的组件,使得性能最大化。Reveno可以每秒完成百万级的事务处理,而且延迟在微妙级。

下面以一个人工银行系统为例,遍历Reveno框架的整个开发,讲述了定义命令对象到执行事务处理和检查结果的整个过程。

二、定义事务处理模型

在Reveno中,有两种方法来定义模型——可变的或不可变的。下面的例子,我们使用了默认的方式——不可变的模型。首先,我们应该定义一个账户Account实体,它代表了一个银行客户:

public static class Account {
    public final String name;
    public final long balance;
    public Account add(long amount) {
        return new Account(name, balance + amount);
    }
    public Account(String name, long initialBalance) {
        this.name = name;
        this.balance = initialBalance;
    }
}

由于Reveno框架采用了CQRS模式,我们需要为账户Account域类定义一个视图,它可用于查询模型:

public static class AccountView {
    public final long id;
    public final String name;
    public final long balance;
    public AccountView(long id, String name, long balance) {
        this.id = id;
        this.name = name;
        this.balance = balance;
    }
}

三、命令和事务处理操作

要执行任何事务处理,你需要执行命令。命令会根据一些内部的业务逻辑,派遣指定的事务处理执行,它实现了实际的状态突变。例子中简化了一些内容。Reveno有特定的DSL语法,它对于简单的案例非常有用,尤其是当命令句柄执行单个事务处理时。如果对延迟和吞吐量有较高的要求,推荐使用基本的API。

首先,我们定义一个带文件系统存储的新引擎实例。

Reveno reveno = new Engine("/tmp/reveno-sample");

接着定义一个从事务处理到查询模型的视图映射器:

reveno.domain().viewMapper(Account.class, AccountView.class, (id,e,r) -> new AccountView(id, e.name, e.balance));

现在,创建新的事务处理句柄,它把新账户添加到系统:

DynamicCommand createAccount = reveno.domain()
    .transaction("createAccount",
                (t, c) -> c.repo().store(t.id(), new Account(t.arg(), 0)))
    .uniqueIdFor(Account.class).command();

快速说一下到底是怎么回事。我们创建了一个createAccount命令对象和它的句柄,添加了一个新账户到仓库中,并给新账户分配了新的ID(自动产生)账户ID可通过t.id()访问。

我们还需要定义一些事务处理借记/贷记账户的余额,出于简单性考虑,借记用负数表示。

DynamicCommand changeBalance = reveno.domain()
    .transaction("changeBalance", (t, c) - >
                c.repo().remap(t.longArg(), Account.class, (id, a) -> a.add(t.intArg("inc")))
                )
    .command();

一个changeBalance命令需要传递两个参数:一个是账户ID参数,另一个是资产的值参数。

四、事务处理的执行

第一个要执行的事务处理是创建一个新账户。但在这之前,必须启动引擎:

reveno.startup();
long accountId = reveno.executeSync(createAccount, map("name", "John"));

在添加10,000$到账户,比如:

reveno.executeSync(changeBalance, map("id", accountId, "inc", 10_000));

现在,事务处理模型有了单个账户实体,账户上的资产有10,000$。之后,可以访问查询模型,检查所有的事务处理是否做了相应的改变:

Assert.assertNotNull(reveno.query().find(AccountView.class, accountId));
Assert.assertEquals(reveno.query().find(AccountView.class, accountId).name, "John");
Assert.assertEquals(reveno.query().find(AccountView.class, accountId).balance, 10_000);

五、还原系统状态

在典型的事务处理环境中,每一个执行成功的结果北欧必须保存到物理存储设备,需要在耐用性和性能方面做最好的平衡,从而最大限度地减少在紧急情况下的损失,最大限度地提升系统 可用性和响应能力。

Reveno框架还比较年轻,但也比较稳定了。可以登录官网查看:http://reveno.org/

时间: 2024-11-10 05:18:37

一个优秀的CQRS框架Reveno的相关文章

一个优秀的Javascript框架--Prototype解说

http://www.cnblogs.com/meil/archive/2007/04/24/724200.html   Prototype.js 是Ruby On Rails的副产品, Javascript编写者的一把小军刀,提供了Ruby风格的简写语法和实效的函数,更难得的是完全跨浏览器,让大家舒舒服服写出又精简又不用愁心兼容的的JS代码,SpringSide 已经离不开它了.Prototype在线手册 /**   * 定义一个全局对象, 属性 Version 在发布的时候会替换为当前版本号

一个优秀的程序员所具备的14个品质【转载】

慎于说Yes 在没有搞清楚开发需求.任务工作量.团队期望值之前,有前途的程序员不会轻易答应.特别是对于新人来说,比较急于表现自己,对于同事或者老板的工作安排来者不拒,精神可嘉,方法不可取.承诺太多,会出现自己无法按时完成的情况,即使按时完成,也可能没有达到别人的期望值,长期以往别人对你的失望会越来越多. 敢于说No 看起来和第一条雷同,其实细究起来不一样.第二条执行起来比第一条难得多.当遇到明显不合理的要求时,可以考虑拒绝,前提是准备好了全面充分的理由.不要经常说No,但是一旦说了,就要切中要害

如何成为一个优秀的前端工程师?

一.英语. 由于大部分优秀的新技术几乎都来源于欧美国家,因此依赖官方的汉化资料往往需要等待很长的时间.等中文资料已经满大街了,同时可能表明这种技术已经过时了.因此流程阅读英文材料必须作为一个优秀程序员的必备技能.如何提升英语阅读能力?1.订阅一些优秀的国外技术作者或者机构的Blog.2.使用框架或者库的时候不依赖中文资料,先从英文文档读起.3.学会FQ,使用google.4.多关注优秀的技术社区: github.stackoverflow 二.修练内功1.计算机基础:算法.数据结构.操作系统.网

20个2014年最优秀的PHP框架

原文:20个2014年最优秀的PHP框架 对于Web开发者来说,PHP是一款非常强大而又受欢迎的编程语言.世界上很多顶级的网站都是基于PHP开发的.本文我们来回顾一下20个2014年最优秀的PHP框架. 每一个开发者都知道,拥有一个强大的框架可以让开发工作变得更加快捷.安全和有效.在开发项目之前选择一款合适的框架可以为今后奠定厚实的基础,下面这20个PHP框架你可以有选择的使用,一定会帮助到你的. 1.Laravel Laravel是一款免费并且开源的PHP应用框架,它是为开发基于MVC的WEB

【知乎】怎么成为一个优秀的程序员,而不是一个优秀的码农?

怎么成为一个优秀的程序员,而不是一个优秀的码农? 9 条评论 分享 默认排序按时间排序 98 个回答 3844赞同反对,不会显示你的姓名 萧井陌 微信公众号:炼瓜研究所 技术社区 - 3844 人赞同 优秀的程序员会告诉你打根基的重要性,会劝你在厚积薄发前要隐忍. 优秀的码农会告诉你学啥底层.啥啥啥一拖就好了,学了python还要啥自行车啊,数据结构排序函数二分搜索这不都内置了吗?工作中永远用不到,学算法有啥用啊?成为高手有很多种方法汇编是个屁啊? +++基础的分割线+++ 列举几个我认为比较重

你应该知道的9个优秀的CSS框架

前端开发是一项非常繁琐的工作,你不仅需要拥有和别人不一样的审美观和设计观,而且需要了解诸如HTML.CSS.JavaScript等错综复杂的技术,因此选择一些优秀的CSS框架或许可以帮助你大大提高工作效率.本文向你推荐了9个还不错的CSS框架,希望对你有所帮助. 1.Twitter开源杰作 – Bootstrap Bootstrap是一款由Twitter推出的开源CSS框架,它的核心是由一系列用于Web前端开发的工具包组成.Bootstrap基于HTML.CSS和JavaScript,是一款非常

GitHub 里面有大量优秀的第三方框架

写iOS 程序的时候往往需要很多第三方框架的支持,可以大大减少工作量,讲重点放在软件本身的逻辑实现上. GitHub 里面有大量优秀的第三方框架,而且 License 对商业很友好.一下摘录一下几乎每个项目都想集成的几个框架. SDWebImageView 1. Mantle Mantle 让我们能简化 Cocoa 和 Cocoa Touch 应用的 model 层.简单点说,程序中经常要进行网络请求,请求到得一般是 json 字符串,我们一般会建一个 Model 类来存放这些数据.这就要求我们

谈谈一个优秀的程序员是如何炼成的

一个优秀的程序员是如何炼成的?他们关注什么?问一下自己这个问题会很有意思.这能让你好好思考一下软件开发的过程.拿它来问一下同事也不错,这能引起一些关于如何一起协作的很有意思的讨论.下面是我认为成为一名优秀的程序员所必需的5个技能. 问题分解 编程讲的是如何解决问题.但在你开始写代码之前,你需要清楚如何解决问题.一个好的程序员应该得拥有这样的技能,他能将问题分解成子问题,直到每个子问题都可以很轻松地进行解决.不过要找到一个解决问题的方式可不是件简单的事.好的程序员能够很好的对问题进行建模,这样写出

Android集成主流优秀第三方组件框架

Android集成主流优秀第三方组件框架 这是一个集成目前Android主流优秀第三方组件.优秀好用的自定义控件.实用工具类封装. 以及一些APP共通模块(比如:版本更新.意见反馈.引导界面等等)的开发包,帮助程序员 快速开发自己的APP 已集成第三方开源组件: 网络请求库android-async-http 图片异步加载库universal-image-loader Sqlite数据库操作ormlite-android 社会化分享ShareSDK+短信验证码 Zxing二维码库 百度地图定位S