没有redis也可以或许支撑“小米在印度把亚马逊搞挂了”事件的秒杀办理方案。
小米在印度冲破了多项记录:
机能表示
先说一下机能表示吧,因为各人对这个较量感乐趣。
硬件情况(Tomcat、Artemis、Jmeter、Oracle,backend都在这台电脑上):
软件情况:
相关设置见如何筹备情况
测试Jmeter剧本见如何Benchmark:
一共Benchmark了两次,因为JIT的干系,第二次的机能表示更好。
第一次功效
PS. 数据库表示从后端措施的日志中阐明的。
第二次功效
不重启Tomcat和Artemis,把数据库的数据规复后,昆山软件开发,重启了后端措施
数据库记录数偏少是因为Artemis行列满了,把动静丢掉了。
架构说明
从陈设拓扑上看,架构分为4个部门:
ActiveMQ Artemis
ActiveMQ Artemis是JBoss把HornetQ捐赠到Apache基金会后更名的项目,今朝是ActiveMQ下的子项目。
HornetQ是当年台甫鼎鼎的高机能动静中间件,因此ActiveMQ Artemis也具备相当的机能表示。
本项目操作它做webapp和backend之间的动静通信。
Disruptor
Disruptor是LMAX公司开源的高机能内存行列。Disruptor可以或许让开拓人员只需写单线程代码,就可以或许得到很是强悍的机能表示,同时制止了写并发编程的难度和坑。 其本质思想在于多线程未必比单线程跑的快。
backend操作它把从ActiveMQ Artemis得到请求串行化,判定商品库存是否富裕,更新剩余库存,最后异步写入数据库。
利用内存、制止IO
本项目对付库存是否富裕的判定既不在数据库层面,也没有操作redis,更不涉及任何IO。
backend措施在启动时将数据库中的库存数据加载到内存中,库存富裕判定、更新剩余库存的行动都是在内存中举办的,共同Disruptor绕过了并发编程的内存可见性、同步、锁等问题,劳务派遣管理系统,机能很是强。
也许有人会说,在实际项目中把商品信息都放到内存中不现实,怕会产生OOM,其实这个要看详细环境。
在本项目中商品在内存中相关类是Item.java,在操作jol-cli(点此下载)查察其memory-layout后发明,其巨细为24byte:
me.chanjar.jms.server.memdb.Item object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 12 (object header) N/A 12 4 int Item.amount N/A 16 4 Long Item.id N/A 20 4 (loss due to the next object alignment) Instance size: 24 bytes Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
而Long
占用的内存也为24b:
java.lang.Long object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 12 (object header) N/A 12 4 (alignment/padding gap) N/A 16 8 long Long.value N/A Instance size: 24 bytes Space losses: 4 bytes internal + 0 bytes external = 4 bytes total
假设你有100W商品需要秒杀,昆山软件开发,那么其占用内存 = 1,000,000 * (24b + 4b + 24b) = 52,000,000b = 49m。仅仅只占49m。
优化项
架构上的优化点
和JMS相关的优化点