原文地址:http://martinfowler.com/articles/lmax作者:Martin Fowler

以下内容撰写理解后的解读
译文后的解读:https://sxs-fx.com/?p=518 作者:S先生
LMAX是一种新型零售金融交易平台,它能够以很低的延迟(latency)产生大量交易(吞吐量). 这个系统是建立在JVM平台上,核心是一个业务逻辑处理器,它能够在一个线程里每秒处理6百万订单. 业务逻辑处理器完全是运行在内存中(in-memory),使用事件源驱动方式(event sourcing). 业务逻辑处理器的核心是Disruptors,这是一个并发组件,能够在无锁的情况下实现网络的Queue并发操作。他们的研究表明,现在的所谓高性能研究方向似乎和现代CPU设计是相左的。
1.Disruptor 模型的特点:
无锁设计:Disruptor 使用无锁数据结构,避免了传统锁和信号量带来的竞争和阻塞,从而大幅度减少了上下文切换和线程间的竞争条件。
环形缓冲区:核心是一个环形缓冲区,所有的数据交换都在这个缓冲区内完成。生产者和消费者通过索引进行数据的快速传递,这种设计使得数据在内存中的访问高效。
批处理和预先分配:Disruptor 提倡批处理的方式来处理事件,减少单个事件处理的开销。此外,它还采用预先分配的策略,避免了动态内存分配和垃圾回收带来的延迟。
单线程消费者:每个消费者都运行在自己的线程上,但每个线程只消费特定的事件类型,这种单一消费者模式避免了复杂的线程间同步和通信。
LMAX 的成功因素:
高性能和低延迟:通过上述特点,LMAX 实现了每秒处理数百万订单的能力,同时保持了极低的延迟,这是传统并发模型所无法轻易达到的。
简化的并发模型:相比传统的锁和多线程并发模型,Disruptor 提供了更简单、更高效的解决方案,减少了代码的复杂性和调试难度,使开发人员能够更专注于业务逻辑而非并发问题。

2. 业务逻辑处理器 (Business Logic Processor)
功能:处理所有的应用程序业务逻辑,运行在一个简单的单线程 Java 程序中。这里的业务逻辑处理是纯粹的方法调用和返回输出,不涉及复杂的平台框架,便于测试和开发。
特点:全部驻留在内存中,没有使用数据库或其他持久存储。这种设计的优势包括极高的性能(无IO和事务的开销)和简化的编程模型(无需对象/关系数据库映射)。
事件驱动:业务逻辑处理器的状态由输入事件驱动,所有的输入事件都被持久化保存,这样在系统崩溃后可以通过重放事件来重新构建状态。
快照和恢复:每天晚上在系统不繁忙时创建快照,以便在需要时快速重新启动业务逻辑处理器。重启包括加载最近的快照并重放一天的事件,整个过程非常快速(不到一分钟)。
高可用性:为了应对高负载和可能的故障,LMAX 保持多个业务逻辑处理器同时运行。每个输入事件被多个处理器处理,但只有一个处理器的输出是有效的,其他处理器忽略。如果一个处理器失败,系统可以切换到另一个处理器,实现故障转移和恢复。
2. 输入和输出 Disruptors
功能:处理输入和输出的并发组件,因为涉及到网络数据的接收和发送,需要进行解组和组装、日志记录等复杂的IO操作。
并发处理:与业务逻辑处理器不同,这些组件是并发的,因为它们需要处理慢速和独立的IO操作。Disruptor 框架特别适合于这种高并发、低延迟的场景。
设计原理:使用环形缓冲区和无锁设计来提高吞吐量和降低延迟。输入 Disruptor 负责从网络网关接收、解组和日志记录输入消息,而输出 Disruptor 则负责将输出消息进行序列化和发送至网络。
LMAX 架构的关键在于其创新的并行编程模型,特别是使用 Disruptor 框架来处理输入和输出,以及采用事件驱动的方式管理业务逻辑处理器的状态。这种设计不仅提供了极高的性能和低延迟,还简化了系统的复杂性,使得开发人员能够更专注于业务逻辑的实现而非并发问题的处理。通过每晚的快照和多个处理器的运行,LMAX 实现了高可用性和系统的连续运行,即使在高负载和故障情况下也能保持稳定的性能表现。
在 LMAX 架构中,采用了 Disruptor 这一高性能并发框架来处理输入和输出,以及确保业务逻辑处理的顺序和可靠性。下面我会详细解释 Disruptor 的设计和它在 LMAX 中的应用。
Disruptor 框架的设计和原理
Disruptor 是一种基于环形缓冲区和无锁设计的并发框架,旨在提供高性能和低延迟的事件处理。以下是其关键特点和工作原理:
环形缓冲区:
Disruptor 使用环形缓冲区作为主要的数据结构。这个环形缓冲区在内存中预先分配,用来存储事件对象。
生产者将事件写入环形缓冲区的指定位置,而消费者则从缓冲区中读取并处理这些事件。
无锁设计:
Disruptor 避免了传统的锁机制,而是利用 CAS(Compare and Swap)等原子操作来实现并发控制。
每个生产者和消费者都有自己的序号(Sequence),用于指示它们在环形缓冲区中的位置。这种方式可以避免竞争和阻塞,提高了并发处理的效率和吞吐量。
事件驱动:
Disruptor 提供了一种事件驱动的编程模型,生产者生产事件并将其发布到环形缓冲区,消费者则从缓冲区中读取并处理这些事件。
这种模型非常适合于需要高并发和低延迟处理的场景,比如金融交易系统中的订单处理。
处理过程:
生产者:生产者将消息或事件写入环形缓冲区,并更新自己的序号。
消费者:消费者通过监听环形缓冲区的变化来获取事件,处理完事件后,更新自己的序号,确保消费顺序和处理完整性。
Disruptor 在 LMAX 架构中的应用
在 LMAX 架构中,Disruptor 被用于处理输入和输出的并发需求:
输入 Disruptor:
负责从网络接收原始消息,将其转换成业务逻辑处理器可以处理的事件形式,并进行持久化。
输入 Disruptor 使用 Disruptor 的并发机制来确保消息的高效处理和顺序性。
输出 Disruptor:
负责将处理完毕的事件序列化,并发送到网络上的目标位置。
同样利用 Disruptor 的环形缓冲区和并发机制来提高输出操作的效率和可靠性。
Disruptor 框架在 LMAX 架构中发挥了关键作用,通过其高效的无锁并发机制,提供了处理高负载、低延迟的解决方案。它不仅简化了并发编程的复杂性,还显著提升了系统的性能和可伸缩性。通过 Disruptor,LMAX 能够在处理大量金融交易时保持高效运行,并确保数据处理的完整性和顺序性,从而实现了其业务需求的高度可靠性和性能表现。
LMAX 架构的设计和哲学背后蕴含着深刻的技术思想和决策,下面我将进一步总结和解释其关键点和优势。
关键设计原则和技术特点
1.Disruptor 框架:
环形缓冲区和无锁设计:Disruptor 使用环形缓冲区作为主要数据结构,通过无锁设计提供高并发、低延迟的事件处理能力。
单写者原则:每个环形缓冲区只允许一个生产者,确保了简化的并发控制和更高的吞吐量。消费者通过序号(Sequence)确保事件的顺序处理。
2. 事件驱动架构:
LMAX 架构采用了事件驱动的方式处理业务逻辑。输入事件通过 Disruptor 处理转换为业务处理器可以处理的形式,输出事件也通过类似的机制传输到合适的目标。
3.高性能和低延迟:
Disruptor 的设计使得它能够处理极高的交易吞吐量(比如每秒数百万交易),并且在处理上保持非常低的延迟。这对于金融交易系统等需要高效处理的领域尤为重要。
4.事件源驱动(Event Sourcing)和日志:
LMAX 使用事件源驱动的方式来处理业务逻辑,将事件持久化到文件系统而非传统的关系数据库。这种方式更适合大量事件的写入和读取,避免了传统数据库的性能瓶颈和复杂性。
5.分布式架构:
LMAX 运行在一个分布式集群上,通过 IP 广播进行节点间通信,以支持高可用和容错性。主节点负责接收输入事件并进行处理,复制工作者将事件广播到其他节点,确保系统的一致性和可靠性。
6.现代硬件优化:
LMAX 架构深入理解现代硬件的特性,例如 CPU 缓存层次结构和多核处理器的优化。通过单线程处理业务逻辑,最大化地利用 CPU 缓存,提升了系统的性能和响应速度。
7.异步和并发:
架构中强调了异步处理和并发的重要性,尤其是在处理大量并发交易时。这种异步处理模型能够更好地利用系统资源,同时减少对锁和同步机制的依赖,从而提高系统的响应性。
技术决策的理由
放弃传统事务性数据库:传统的关系型数据库在处理高并发和大量事务时性能较差,LMAX 团队选择了更适合大规模事件处理的文件系统持久化方案,避免了数据库的性能瓶颈和复杂性。
选择 Disruptor:Disruptor 提供了高效的并发处理能力,符合单写者原则的设计使其成为处理大规模事件流的理想选择。它优化了队列访问和事件处理效率,减少了系统的整体延迟。
事件驱动架构的优势:通过事件驱动的方式,LMAX 实现了业务逻辑的解耦和水平扩展,每个事件都独立处理,从而提高了系统的灵活性和可维护性。
结论
LMAX 架构不仅仅是为了实现极高的性能和低延迟,更是对传统系统设计的一种创新和挑战。它通过简化和优化系统组件的方式,提供了一种新的处理大规模事件流的模型,使得金融交易等领域能够更有效地处理复杂的业务需求。同时,它的开源性和对 Disruptor 框架的使用,也为其他领域和系统提供了有价值的参考和应用可能性。
1 thought on “LMAX架构解读”