IT评测·应用市场-qidao123.com技术社区

标题: 20.LMAX——DDD的极致性能架构 [打印本页]

作者: 不到断气不罢休    时间: 2025-2-14 09:58
标题: 20.LMAX——DDD的极致性能架构
学习视频来源:DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid=1940048&ctype=0

  
汗青

LMAX是由Martin Fowler 2011年提出,原文地址: https://martinfowler.com/articles/lmax.html
开端

架构目的

超高TPS。这里的TPS不是指只把数据读出来,是要有写入操纵的,有变动的。
架构要素

1. 聚合常驻内存
在范畴驱动计划中,不管以什么方式计划,最后要得到的就是“聚合”。在LMAX中,聚合是一直在内存中存在,不像传统的架构,用的时候把聚合从数据库中加载到内存,修改后生存到数据库 ,内存中的聚合就被接纳掉了。
2. 变乱溯源
需要高可用写入范畴变乱,宕机重启后可以从范畴变乱重建聚合。
3. 单线程异步非阻塞IO(串行,无锁)

外部系统发过来的哀求会先写入环形队列Input DisruptorBusiness Logic Processor会串行化地从队列中一个一个取出来哀求处理,并将效果写入到OutDisruptor中,这个效果就是范畴变乱
它没有给客户端直接返回效果,它是完全异步化的过程,客户端发过来哀求后不会等待,直接退出。客户端会监听相应的变乱,当收到相应的变乱,才知道操纵是否成功。Disruptor是一个高性能的队列框架,当初就是为了LMAX架构而计划的。
时序对比

传统时序


变乱溯源时序


LMAX时序


单线程非阻塞异步IO(reactor)

多线程

- CPU在多线程间切换开销高 (相对于reactor)
- 阻塞
每个哀求一线程模式,并发受线程数限制。像传统的tomcat这种方式,一个哀求对应一个线程。
- 非阻塞
聚合在内存中只有一个实例,多线程情况下就会出现并发问题,以是就需要对实例加锁,加锁情况下每个聚合实际并发1。
单线程


变乱溯源

为什么要使用变乱溯源,主要有两点:

高可用方案

聚合放在内存中,假如宕机怎么办呢,以是需要计划高可用方案。
所有的高可用方案都是通过冗余来实现的。main(主机器) 会发出所有的变乱,follower(从机器) 会不断的重播这些变乱,并重建聚合。假如main和follower之间没有高延迟,二者就可以在短时间内保持同等性。supervisor会监测main和follower, 一旦main出现宕机,就会在follower中选择一个作为新的主机器main,并告诉网关,将哀求发到新的主机器上去。

代价

1. 无数据库事务
无先操纵后回滚,必须严酷前置完成所有校验,才能变动聚合内的状态数据,才能发布范畴变乱。
2. 运行时外部调用变复杂
因为异步的原因,导致它和外边系统交互很复杂。需要写代码处理异步IO,给编写代码带来负担。需要减少主动外部调用: 监听变乱提前组装数据 (数据量小)
显式变乱驱动方式
3. 受内存巨细限制
因为聚合全部在内存中,假如聚合数量太大就需要用多台服务器去做数据分区,架构更复杂。
总结

优点

缺点

实用范围

聚合数据量适合内存化,需要极致TPS场景,比如:

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4