全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Docker + Nodejs + Kafka + Redis + MySQL搭建简单秒杀环境

秒杀活动可以说在互联网上随处可见,从12306抢票,到聚划算抢购,我们生活的方方面面都可以看到秒杀的身影。秒杀的架构设计也是对于一个架构师架构设计能力的一次考验。本文的目的并不在于提供一个可以直接落地的设计方案,而是意在提供一个简单的方法,一个思路,使大家能够对于秒杀背后的一些设计有更感性的认识, 并且可以自己亲自动手实践一下。所有的配置及源码都在本文最后的GitHub repository中可以找到。

首先,先简单介绍下本文中会涉及到的一些组件,如下图所示:


JMeter:用JMeter来模拟秒杀活动中大量并发的用户请求

Seckill Service:基于Nodejs使用Express实现的秒杀service,图中的步骤2,3,4都是在这个service中处理的

Redis:一个Redis的docker container,在其中保存一个名为counter的数据来表示当前剩余的库存大小

Kafka: 一个Kafka的docker container,其实这里还有一个zookeeper的docker container,Kafka用zookeeper来存放一些元数据,在程序中并没有涉及到,所以也就不单独列出来说了。Seckill service在更新完Redis之后,会发送一条消息给Kafka表示一次成功的秒杀

Seckill Kafka Consumer: 基于Nodejs的Kafka consumer,会从Kafka中去获取秒杀成功的消息,处理并且存储到MySQL中

MySQL:一个MySQL的docker container,最终秒杀成功的请求都会对应着数据库表中的一条记录

环境搭建

1 . 安装JMeter
从官网下载一个JMeter的binary包,执行bin目录下的jmeter即可启动,启动后如下图新建一个名为Seckill的Thread Group,并且设置在5s内发起2000次并发请求。


在这个Thread Group下新建一个Http Request的Sampler并命名为Seckill,按下图配置host name,port number,http request method以及request path


2 . 安装Redis,Kafka, Zookeeper和MySQL
为了方便搭建环境,这几个组件会以docker container的形式启动。在此之前需要去Docker官网下载并安装Docker Engine,Docker Machine和Docker Compose。如果是在Windows或者Mac上,Docker官网提供Docker For Windows/Docker For Mac安装程序,可以很方便的把这3个组件安装好。

3 . 编写Docker Compose文件
创建一个Seckill项目文件夹,新建一个docker-compose.yml文件,内容如下:


配置文件中一共配置了4个services对应4个docker container,分别是zookeeper,kafka,redis以及mysql。这里有两个地方需要设置成你实际环境的值,一个是kafka配置下面的KAFKA_ADVERTISED_HOST_NAME字段,这个需要设置成本地机器的IP。另一个是MYSQL配置下面的MYSQL_ROOT_PASSWORD,你可以设置成你想要的任何值。

创建好这个文件之后,就可以去命令行项目根目录中执行docker-compose up,docker engine就会把上面配置的这4个组件全部启动起来。

注意:在启动完之后,需要去Kafka容器中创建一个名为CAR_NUMBER的topic,去Redis容器中创建一个名为counter的计数器(设置值为100,代表库存初始值为100),去MySQL容器中创建一个名为seckill的数据表(包含一个自增长的id自段和一个timestamp格式的date字段)。

代码片段

1 . Seckill Service


第1-8行,引入了程序需要用到的对象,nodejs的mvc框架express, redis, kafka等

第10行,利用express提供的方法暴露出一个path为/seckill的POST方法

第12行,定义了一个方法,在54行会调用

第13-22行,新建了一个redis client并且监听error事件

第23行,这行代码非常关键,它的作用是让redis cilent监视redis中的counter值,之后会启动一个事务,如果在事务提交的时候发现有其它client修改了counter值的话,就会放弃这个事务。

第24行,通过redis client的异步方法获取counter的值,因为redis的get操作是原子的,所以在这里不用担心有并发读写的问题。

第25-28行,判断返回的库存值是否大于0,如果大于0,通过client.multi()启动一个事务,通过decr()方法将counter值减1,最后通过exec()方法提交事务;如果小于0,则执行第47行,打印卖完了并且关闭redis client。

第29-46行,这里我们看一下multi.exec()中的这个回调方法。在前面我们已经使用watch对counter进行了监视。如果在事务提交过程中有其它client修改了counter值的话,回调方法中的replies参数就会是null,可以看到第29-31行,程序会打印“可能有冲突”并且再次调用fn方法重试。
如果replies的值不为null,就会使用kafka的producer发送一条message到CAR_NUMBER topic。

2 . seckill_kafka_consumer


这里的代码就比较简单了,会初始化一个kafka consumer监听CAR_NUMBER topic,对于新获取的消息会去MySQL的seckill表里插入一条记录。

操作步骤

启动docker container

启动Seckill_Service

启动seckill_kafka_consumer

启动JMeter发送2000个并发请求

结果 JMeter request results

Redis counter field


MySQL seckill table


可以看到,最后redis中的counter变成0,seckill数据表中会插入100条记录,没有发生超卖或者少卖的情况。当然在实际生产环境场景中,还有许多其它需要考虑的地方,希望此文可以起到一个抛砖引玉的作用,帮助大家更好的理解秒杀场景。

项目GitHub地址: MockSecKill


# docker环境搭建  # docker  # 开发环境搭建  # 搭建秒杀搭建  # golang如何使用sarama访问kafka  # Go操作Kafka的实现示例(kafka-go)  # Go语言kafka生产消费消息实例搬砖  # go操作Kafka使用示例详解  # docker部署kafka的方法步骤  # Docker容器搭建Kafka集群的详细过程  # Docker部署kafka遇到的问题及解决  # Go库实现Kafka消息的发送与接收(docker和k3s安装kafka)  # 秒杀  # 就会  # 创建一个  # 可以看到  # 官网  # 在这个  # 新建一个  # 设置成  # 涉及到  # 提供一个  # 回调  # 中会  # 值为  # 如下图  # 都是  # 是在  # 在这里  # 你可以  # 都在  # 也就 


相关文章: 如何在万网自助建站平台快速创建网站?  如何在建站之星网店版论坛获取技术支持?  定制建站是什么?如何实现个性化需求?  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  如何快速搭建虚拟主机网站?新手必看指南  javascript基本数据类型及类型检测常用方法小结  打鱼网站制作软件,波克捕鱼官方号怎么注册?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  建站之星后台密码遗忘如何找回?  建站主机无法访问?如何排查域名与服务器问题  零服务器AI建站解决方案:快速部署与云端平台低成本实践  如何在宝塔面板中修改默认建站目录?  宁波免费建站如何选择可靠模板与平台?  jQuery 常见小例汇总  历史网站制作软件,华为如何找回被删除的网站?  如何在云主机上快速搭建网站?  建站之星代理商如何保障技术支持与售后服务?  如何自定义建站之星模板颜色并下载新样式?  行程制作网站有哪些,第三方机票电子行程单怎么开?  如何用美橙互联一键搭建多站合一网站?  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  创业网站制作流程,创业网站可靠吗?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  平台云上自主建站:模板化设计与智能工具打造高效网站  如何在Golang中引入测试模块_Golang测试包导入与使用实践  Bpmn 2.0的XML文件怎么画流程图  盘锦网站制作公司,盘锦大洼有多少5G网站?  宿州网站制作公司兴策,安徽省低保查询网站?  如何在Golang中指定模块版本_使用go.mod控制版本号  如何在建站之星绑定自定义域名?  专业商城网站制作公司有哪些,pi商城官网是哪个?  建站主机服务器选购指南:轻量应用与VPS配置解析  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  如何在阿里云购买域名并搭建网站?  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  网站制作软件有哪些,制图软件有哪些?  如何基于PHP生成高效IDC网络公司建站源码?  活动邀请函制作网站有哪些,活动邀请函文案?  英语简历制作免费网站推荐,如何将简历翻译成英文?  七夕网站制作视频,七夕大促活动怎么报名?  css网站制作参考文献有哪些,易聊怎么注册?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  如何在阿里云完成域名注册与建站?  如何在西部数码注册域名并快速搭建网站?  用v-html解决Vue.js渲染中html标签不被解析的问题  建站之星上传入口如何快速找到?  建站之星多图banner生成与模板自定义指南  如何用花生壳三步快速搭建专属网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。