这篇文章主要讲解了“Docker如何搭建简单秒杀环境”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Docker如何搭建简单秒杀环境”吧!
创新互联于2013年创立,先为德兴等服务建站,德兴等地企业,进行企业商务咨询服务。为德兴企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
首先,先简单介绍下本文中会涉及到的一些组件,如下图所示:
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条记录,没有发生超卖或者少卖的情况。当然在实际生产环境场景中,还有许多其它需要考虑的地方,希望此文可以起到一个抛砖引玉的作用,帮助大家更好的理解秒杀场景。
感谢各位的阅读,以上就是“Docker如何搭建简单秒杀环境”的内容了,经过本文的学习后,相信大家对Docker如何搭建简单秒杀环境这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!
售后响应及时
7×24小时客服热线数据备份
更安全、更高效、更稳定价格公道精准
项目经理精准报价不弄虚作假合作无风险
重合同讲信誉,无效全额退款