`

LMAX架构

 
阅读更多

Martin Fowler最近的一篇文章:LMAX架构

LMAX是一种新型零售金融交易平台,它能够以很低的延迟(latency)产生大量交易(吞吐量). 这个系统是建立在JVM平台上,核心是一个业务逻辑处理器,它能够在一个线程里每秒处理6百万订单. 业务逻辑处理器完全是运行在内存中(in-memory),使用事件源驱动方式(event sourcing). 业务逻辑处理器的核心是Disruptors,这是一个并发组件,能够在无锁的情况下实现网络的Queue并发操作。他们的研究表明,现在的所谓高性能研究方向似乎和现代CPU设计是相左的。(见另外一篇文章:JVM伪共享)

过 去几年我们不断提供这样声音:免费午餐已经结束。我们不再能期望在单个CPU上获得更快的性能,因此我们需要写使用多核处理的并发软件,不幸的是, 编写并发软件是很难的,锁和信号量是很难理解的和难以测试,这意味着我们要花更多时间在计算机上,而不是我们的领域问题,各种并发模型,如Actors 和软事务STM(Software Transactional Memory), 目的是更加容易使用,但是按下葫芦飘起瓢,还是带来了bugs和复杂性.

我 很惊讶听到去年3月QCon上一个演讲, LMAX是一种新的零售的金融交易平台。它的业务创新 - 允许任何人在一系列的金融衍生产品交易。这就需要非常低的延迟,非常快速的处理,因为市场变化很快,这个零售平台因为有很多人同时操作自然具备了复杂性, 用户越多,交易量越大,不断快速增长。

鉴于多核心思想的转变,这种苛刻的性能自然会提出一个明确的并行编程模型 ,但是他们却提出用一个线程处理6百万订单,而且是每秒,在通用的硬件上。

通过低延迟处理大量交易,取得低延迟和高吞吐量,而且没有并发代码的复杂性,他们是怎么做到呢?现在LMAX已经产品化一段时间了,现在应该可以揭开其神秘而迷人的面纱了。

结构如图:


从最高层次看,架构有三个部分:
业务逻辑处理器business logic processor[5]
输入input disruptor
输出output disruptors

业务逻辑处理器处理所有的应用程序的业务逻辑,这是一个单线程的Java程序,纯粹的方法调用,并返回输出。不需要任何平台框架,运行在JVM里,这就保证其很容易运行测试环境。

业务逻辑处理器
全部驻留在内存中

业务逻辑处理器有次序地取出消息,然后运行其中的业务逻辑,然后产生输出事件,整个操作都是在内存中,没有数据库或其他持久存储。将所有数据驻留在内存中有两个重要好处:首先是快,没有IO,也没有事务,其次是简化编程,没有对象/关系数据库的映射,所有代码都是使用Java对象模型(广告:开源框架JdonframeworkJiveJdon也是全部基于内存和事件源,内存领域对象+事件驱动,看来这条路的方向是对的)。

使用基于内存的模型有一个重要问题:万一崩溃怎么办?电源掉电也是可能发生的,“事件”(Event Sourcing )概念是问题解决的核心,业务逻辑处理器的状态是由输入事件驱动的,只要这些输入事件被持久化保存起来,你就总是能够在崩溃情况下,根据事件重演重新获得当前状态。(NOSQL存储的基于事件事务实现)

要很好理解这点可以通过版本控制系统来理解,版本控制系统提交的序列,在任何时候,你可以建立由申请者提交一个工作拷贝,版本控制系统是一个复杂的商业逻辑处理器,而这里的业务逻辑处理只是一个简单的序列。

因此,从理论上讲,你总是可以通过后处理的所有事件的商业逻辑处理器重建的状态,但是实践中重建所有事件是耗时的,需要切分,LMAX提供业务逻辑处理的快照,从快照还原,每天晚上系统不繁忙时构建快照,重新启动商业逻辑处理器的速度很快,一个完整的重新启动 - 包括重新启动JVM加载最近的快照,和重放一天事件 - 不到一分钟。

快照虽然使启动一个新的业务逻辑处理器的速度,但速度还不够快,业务逻辑处理器在下午2时就非常繁忙甚至崩溃,LMAX就保持多个业务逻辑处理器同时运行,每个输入事件由多个处理器处理,只有一个处理器输出有效,其他忽略,如果一个处理器失败,切换到另外一个,这种故障转移失败恢复是事件源驱动(Event Sourcing)的另外一个好处。

通过事件驱动(event sourcing)他们也可以在处理器之间以微秒速度切换,每晚创建快照,每晚重启业务逻辑处理器, 这种复制方式能够保证他们没有当机时间,实现24/7.

事件方式是有价值的因为它允许处理器可以完全在内存中运行,但它有另一种用于诊断相当大的优势:如果出现一些意想不到的行为,事件副本们能够让他们在开发环境重放生产环境的事件,这就容易使他们能够研究和发现出在生产环境到底发生了什么事。

这 种诊断能力延伸到业务诊断。有一些企业的任务,如在风险管理,需要大量的计算,但是不处理订单。一个例子是根据其目前的交易头寸的风险状况排名前20位客 户名单,他们就可以切分到复制好的领域模型中进行计算,而不是在生产环境中正在运行的领域模型,不同性质的领域模型保存在不同机器的内存中,彼此不影响。

性能优化
正如我解释,业务逻辑处理器的性能关键是按顺序地做事(其实并不愚蠢 并行做就聪明吗?),这可以让普通开发者写的代码处理10K TPS. 如果能精简代码能够带来100K TPS提升. 这需要良好的代码和小方法,当然,JVM Hotspot的缓存微调,让其更加优化也是必须的。

以下省去两段.......调试方面。


编程模型

以 一个简单的非LMAX的例子来说明。想象一下,你正在为糖豆使用信用卡下订单。一个简单的零售系统将获取您的订单信息,使用信用卡验证服务,以检查您的信 用卡号码,然后确认您的订单 - 所有这些都在一个单一过程中操作。当进行信用卡有效性检查时,服务器这边的线程会阻塞等待,当然这个对于用户来说停顿不会太长。

在MAX架构中,你将此单一操作过程分为两个,第一部分将获取订单信息,然后输出事件(请求信用卡检查有效性的请求事件)给信用卡公司. 业务逻辑处理器将继续处理其他客户的订单,直至它在输入事件中发现了信用卡已经检查有效的事件,然后获取该事件来确认该订单有效。

这种异步事件驱动方式确实不寻常,虽然使用异步提高应用程序的响应是一个熟悉的技术。它还可以帮助业务流程更弹性,因为你必须要更明确的思考与远程应用程序打交道的不同之处。

这个编程模型第二个特点在于错误处理。传统模式下会话和数据库事务提供了一个有用的错误处理能力。如果有什么出错,很容易抛出任何东西,这个会话能够被丢弃。如果一个错误发生在数据库端,你可以回滚事务

LMAX的内存模式(in-memory structures)在于持久化输入事件,如果有错误发生也不会从内存中离开造成不一致的状态。但是因为没有回滚机制,LMAX投入了更多精力,确保输入事件在实施任何内存状态影响前有效地持久化,他们发现这个关键是测试,在进入生产环境之前尽可能发现各种问题,确保持久化有效。

转:http://www.jdon.com/42452

分享到:
评论

相关推荐

    Disruptor示例

    Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易。这个系统是建立在JVM平台上,其核心是一个业务逻辑处理器,它能够在一个线程...

    并发框架架构

    Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易。这个系统是建立在JVM平台上,其核心是一个业务逻辑处理器,它能够在一个线程...

    Real-time Big Data Analytics 无水印pdf 0分

    如LMAX架构中的环形缓冲区是Disruptor的核心,能够实现极低延迟的消息处理。通过优化生产者和消费者的设计,以及利用ZeroMQ和Netty等高性能通信框架,可以显著提高数据处理的效率。 #### 12. 大数据技术平台 大数据...

    Disruptor_doc_ZH_CN:Disruptor中文参考

    并发框架Disruptor介绍Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易。这个系统是建立在JVM平台上,其核心是一个业务逻辑...

    新型架构案例与实践

    新型架构案例与实践 孙子荀 腾讯手Q公众号后台负责人

    最高效的交易所撮合引擎,采用伦敦外汇交易所LMAX开源的Disruptor框架,用Hazelcast进行分布式内存存.zip

    这个项目采用了伦敦外汇交易所LMAX的开源Disruptor框架,以及Hazelcast作为分布式内存存储。 Disruptor框架是由LMAX开发的一个高性能的并发工具,它设计用于处理高频率的金融交易。Disruptor通过避免传统的锁和线程...

    IOS应用源码——第一个我们小组的IPHONE程序LMAX郎迈.zip

    1. **iOS应用结构**:了解iOS应用的基础架构,包括Main.storyboard(用户界面)、ViewController(视图控制器)、Model(模型)、View(视图)和Controller(控制器)的MVC设计模式。 2. **Objective-C或Swift编程*...

    ios应用源码之第一个我们小组的iphone程序lmax郎迈 2018128

    3. **模型-视图-控制器(MVC)**:检查源码是否遵循MVC设计模式,这是一种常见的软件架构模式。 4. **协议和代理**:看看源码中是否使用了协议和代理来处理不同组件间的通信。 5. **网络请求**:如果应用涉及网络...

    高性能高稳定性分布式的游戏架构,游戏逻辑运行在Disruptor消费者线程中,其它线程都为辅助线程, 整体为多生产者.zip

    Disruptor是由LMAX公司开源的一个高性能并发工具,它提供了一个低延迟、高吞吐量的消息传递机制。Disruptor通过消除锁和最小化内存交互,极大地提高了多线程环境下的性能。在游戏项目中,将游戏逻辑放在Disruptor...

    串行io disruptor

    在构建高效率金融交易平台LMAX的过程中,开发者面临了如何优化数据在并发线程间交换的问题。传统的队列方式在处理并发数据交换时,其延迟成本与磁盘I/O操作相当,这对追求极致性能的应用来说是无法接受的。如果一个...

    RealTimeNotification:AWS SNS 等效项 - 基于 LMAX DisruptorMQTTRabbitMQ 的实时 x 平台通知框架

    AWS SNS 免费等效项 - 基于 LMAX Disruptor/MQTT/RabbitMQ/ 的实时 x 平台通知框架 #为什么我们需要实时通知框架? 众所周知,发布/订阅是在大多数分布式架构中占有一席之地的关键设计范式之一。 例如,移动推送...

    Disruptor.zip

    Disruptor是由英国金融服务公司LMAX开发的一种高性能的并发数据结构,主要被设计为一个低延迟、高吞吐量的消息传递框架。它以其创新的并发处理机制和在单核CPU上实现每秒处理数百万事务的速度而闻名。Disruptor在...

    Disruptor:一种高性能的、在并发线程间数据交换领域用于替换有界限队列的方案.pdf

    这种性能提升使得Disruptor成为异步事件驱动架构的理想选择,LMAX公司已经在订单匹配引擎、实时风险管理和内存事务处理系统等多个关键项目中成功应用了Disruptor,实现了前所未有的性能水平。 Disruptor并非仅限于...

    综合布线设计方案和对策作业.doc

    * 水平线缆计算方法:水平线缆长度 A=(Lmax+Lmin)/2*1.1+D,D 为端接余量 6~15m。 * 垂直线缆计算方法:每层垂直线缆长度(m)=(距 BD 的楼层数*层高+端接容限)*每层需要根数。 六、设备间/管理子系统设计 * 设备间...

    Disruptor并发框架中文参考文档

    ##### 3.1 LMAX的架构 LMAX是一家零售金融服务提供商,其交易平台基于Disruptor构建。LMAX的业务逻辑处理器能够在单个线程中每秒处理600万笔订单,这得益于Disruptor的高效并发处理能力。LMAX的系统完全运行在内存...

Global site tag (gtag.js) - Google Analytics