`

秒杀系统 ,ActiveMQ Artemis+backend

阅读更多

原文出处:

https://github.com/chanjarster/artemis-disruptor-miaosha

 

 

没有redis也能够支撑"小米在印度把亚马逊搞挂了"事件的秒杀解决方案。

小米在印度打破了多项记录:

  1. 4分钟内卖出了超过250,000台。 ---OPS:1042次抢购/S
  2. 成为最快的手机抢购活动。
  3. 抢购前我们收到了100万“到货提醒”。
  4. 亚马逊每分钟收到超过500万个点击。
  5. 亚马逊在这个期间每秒收到1500个订单(这是印度电商公司所有销售中最高的)。 ---OPS:1500次下单请求/S

性能表现

先说一下性能表现吧,因为大家对这个比较感兴趣。

硬件环境(Tomcat、Artemis、Jmeter、Oracle,backend都在这台电脑上):

  • MacBook Pro (Retina, 15-inch, Mid 2014)
  • 2.2 GHz Intel Core i7
  • 16 GB 1600 MHz DDR3
  • 512G SSD

软件环境:

  • java version "1.8.0_131"
  • Artemis 1.5.4
  • Oracle XE 11g (Docker)
  • Tomcat 8.5.14 (1个)

相关配置见如何准备环境

测试Jmeter脚本见如何Benchmark

  • 300线程,循环1000次,共30w请求

一共Benchmark了两次,因为JIT的关系,第二次的性能表现更好。

第一次结果

  • QPS:300000 in 00:01:57 = 2569.8/s Avg: 108 Min: 0 Max: 41102 Err: 164 (0.05%)
  • TPS:299836订单 / 121秒 = 2477条/s

PS. 数据库表现从后端程序的日志中分析的。

第二次结果

不重启Tomcat和Artemis,把数据库的数据恢复后,重启了后端程序

  • QPS:300000 in 00:00:35 = 8527.8/s Avg: 20 Min: 0 Max: 4515 Err: 2 (0.00%)
  • TPS:246873订单 / 46 秒 = 5366条 / s

数据库记录数偏少是因为Artemis队列满了,把消息丢掉了。

架构说明

从部署拓扑上看,架构分为4个部分:

  1. webapp,可集群部署,运行在Tomcat中
  2. ActiveMQ Artemis,负责webapp和backend之间的通信
  3. backend,只能单个部署,独立运行,内部使用Disruptor
  4. Oracle数据库

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。

优化项

架构上的优化点

  1. 下单请求异步处理,请求返回的本次请求的ID,客户端拿这个ID到另行发起请求查询结果
  2. 在秒杀期间,商品库存信息在内存中,库存判断及库存扣减都在内存中进行,之后异步到数据库
  3. 利用Disruptor将并发请求串行化,同时避免了多线程编程复杂度
  4. 抛弃数据库事务,采用最终一致性

和JMS相关的优化点

  1. 重用JMS Connection、Session、MessageProducer、MessageConsumer,而不是每次都创建这些对象(Spring的JmsTemplate就是这么干的)
  2. 将JMS Session设定为transacted=false, AUTO_ACKNOWLEDGE
  3. 发送JMS消息时DeliveryMode=NON_PERSISTENT
  4. 关闭Artemis的重发、消息持久机制

和JDBC相关的优化点

  1. 使用JDBC Batch Update,减少和数据库网络IO的次数
  2. 优化更新商品库存的DB操作,将多个更新商品库存的请求合并成一条update,而不是多个update

和Tomcat相关的优化点

  1. 调大maxThreads参数

流程说明

本项目只提供了两个接口:

  1. 下单接口。用于下单。
  2. 查询下单结果的接口。用于查询下单是否成功。

聪明的读者肯定已经想到了,整个秒杀过程是异步的。

下单流程

下单流程

查询下单结果的流程

查询下单结果流程

How-tos

分享到:
评论

相关推荐

    Apache ActiveMQ Artemis.pdf

    13. 管理和安全:涉及如何使用ActiveMQ Artemis的管理控制台进行系统管理,包括安全性配置。 14. 群集:讨论了如何设置和管理ActiveMQ Artemis群集以确保高可用性和故障转移。 15. 高可用性和故障转移:介绍了...

    ActiveMQ-Artemis .pdf

    ActiveMQ Artemis用户手册不仅适用于开发人员和系统管理员,也适合需要深入理解消息服务的任何专业人员。通过阅读这份手册,读者可以全面掌握ActiveMQ Artemis的功能和最佳实践,从而在构建高效、可靠的消息系统时...

    springboot-nettysocketio +netty+activeMq在线客服系统

    springboot +netty+activeMq在线客服系统springboot +netty+activeMq在线客服系统springboot +netty+activeMq在线客服系统springboot +netty+activeMq在线客服系统springboot +netty+activeMq在线客服系统springboot...

    P2P网络借贷平台项目SSH+Redis+ActiveMQ+POI+Shiro+AngularJS+Nginx+Quartz等

    1、项目整体采用Maven分模块构建、SVN版本控制、PowerDesigner数据建模,基于约定标准的项目工程结构,同时讲解了很多主流Maven插件的使用配置。 2、前端页面采用流行的bootstrap、 angularjs 等流行的前端技术,...

    activemq镜像+docker-compose.yaml

    activemq镜像+docker-compose.yaml

    ActiveMQ+Camel+Spring+jms Demo(一)

    **ActiveMQ+Camel+Spring+jms Demo(一)** 在IT行业中,集成不同组件以构建高效、可扩展的消息传递系统是一项常见的任务。本示例将深入探讨如何使用ActiveMQ作为消息中间件,Apache Camel作为集成工具,以及Spring...

    ActiveMQ5.1+Spring2.5 Demo

    将ActiveMQ与Spring结合,可以轻松地在Spring应用中集成消息队列,实现高效、解耦的系统通信。 在这个"ActiveMQ5.1+Spring2.5 Demo"中,我们将深入探讨如何在Spring 2.5版本中配置和使用ActiveMQ,以及如何构建一个...

    activemq-artemis, Apache Artemis的镜像.zip

    activemq-artemis, Apache Artemis的镜像 ActiveMQ Artemis这个文件描述了在这个项目中开始编码的一些最小'需要知道的东西'。源有关修改代码。构建项目。运行测试。IDE集成的详细信息,请参见我们的黑客指南( ) 。...

    ActiveMQ+Camel+Spring+jms Demo(二)

    在本项目中,我们探索了如何整合ActiveMQ、Apache Camel和Spring框架来创建一个基于JMS(Java消息服务)的应用程序。这个Demo是系列的第二部分,它建立在上一部分的基础之上,深入介绍了如何实际操作这些组件以实现...

    activemq-artemis-operator:用于Kubernetes的ActiveMQ Artemis运营商(正在进行中)

    ActiveMQ Artemis运营商 概述 此ActiveMQ Artemis运算符是使用工具和API完成的实现。 SDK CLI operator-sdk生成项目布局并控制开发生命周期。 此外,此实现将SDK的替换为监视,查询和变异Kubernetes资源的方法。 ...

    Java高级课程(nginx+redis+zookeeper+activemq+storm+dubbo+netty+jvm+并发编程锁+项目实战)

    Java高级互联网架构师系统培训班课程Java高级互联网架构师系统培训班课程Java高级互联网架构师系统培训班课程

    ActiveMQ教程+配置[归纳].pdf

    Apache ActiveMQ 是一款开源的、基于 Apache 2.0 许可证发布的消息中间件,它遵循Java消息服务(JMS...对于软件开发者来说,了解并掌握ActiveMQ的配置和使用,能够有效地提升分布式系统中的消息传递效率和系统稳定性。

    ActiveMQ教程+配置[参照].pdf

    作为Java消息服务(JMS)提供商,ActiveMQ 提供了多种消息传递模式,包括点对点和发布/订阅模式,使其适用于各种分布式系统中的通信。它不仅支持Java,还支持多种其他编程语言如C、C++、C#、Ruby、Perl、Python和PHP...

    SpringBoot+ActiveMq+MQTT实现消息的发送和接收

    这是一个典型的分布式系统中的消息通信场景,其中SpringBoot作为应用程序框架,ActiveMQ作为消息中间件,而MQTT(Message Queuing Telemetry Transport)则是一种轻量级的发布/订阅消息协议,适用于低带宽、高延迟或...

    activemq-artemis-dynatrace-plugin:ActiveMQ Artemis经纪人流程的自定义Dynatrace JMX插件

    Dynatrace的ActiveMQ Artemis插件关于经纪人流程的自定义 插件。Artemis概述插件该插件提供常规的代理统计信息,例如地址内存使用率,连接/用户数,总消息数,总消息添加/确认率。 Artemis Queues插件这提供了详细的...

    activeMQ+spring+springmvc整合示例

    这个"activeMQ+spring+springmvc整合示例"旨在帮助开发者理解如何将这三者结合,以实现消息队列(Message Queue)的功能,提高系统的异步处理能力和负载均衡。以下是关于这一整合的详细知识讲解: 1. **ActiveMQ**:...

    ActiveMQ教程+配置借鉴.pdf

    在设计高并发、高可用的系统时,ActiveMQ 可以帮助简化通信,提高系统的可靠性和可扩展性。此外,由于其开源性质,用户可以定制和优化以满足特定需求,进一步增强了其在复杂 IT 环境中的适用性。

    tasks:Spring Boot和ActiveMQ Artemis的生产者消费者微服务教程

    任务Spring Boot和ActiveMQ Artemis的生产者消费者微服务教程。涵盖的主题Sprint Boot子休息区ApiSpring启动批处理SSL连接JMS(Java消息服务) Swagger UI用于可视化API错误处理基本认证POJO <-> DTO的映射器记录...

    activemq+mqtt+android通信

    标题中的“activemq+mqtt+android通信”指的是在Android设备上使用ActiveMQ服务器和MQTT协议进行通信的技术实现。ActiveMQ是Apache软件基金会开发的一个开源消息中间件,它遵循开放消息中间件标准(JMS),支持多种...

    springmvc+dubbo/zookeeper+activemq+redis+mybatis+druid

    【标题】"springmvc+dubbo/zookeeper+activemq+redis+mybatis+druid" 涵盖了多个在企业级Java应用开发中的核心技术,它们共同构建了一个高可用、高性能的服务架构。以下是对这些技术的详细解释: 1. **SpringMVC**...

Global site tag (gtag.js) - Google Analytics