<small id='M1ighDx'></small> <noframes id='5U1u'>

  • <tfoot id='MfwvJScF5'></tfoot>

      <legend id='5a36zTch0'><style id='p6AWqGX'><dir id='Oxog'><q id='eSjgE'></q></dir></style></legend>
      <i id='A5qDT'><tr id='ot2c'><dt id='8z3P'><q id='k6p0OchHj'><span id='bv3S4RUl9e'><b id='wThNU'><form id='YzLmpRXNBW'><ins id='EazGe3WKq'></ins><ul id='6AIhzKg2y3'></ul><sub id='ilDC8NhmpK'></sub></form><legend id='lhJOi'></legend><bdo id='qVS67bEyn'><pre id='hFg4'><center id='uY0iyW'></center></pre></bdo></b><th id='kns1'></th></span></q></dt></tr></i><div id='NnjJbrmeIt'><tfoot id='Q35fwmDY'></tfoot><dl id='6ygOZY'><fieldset id='OjUWMD'></fieldset></dl></div>

          <bdo id='ge3uG08wD'></bdo><ul id='kxnhpMI9'></ul>

          1. <li id='lXdZsVGvWu'></li>
            登陆

            一次简略模仿秒杀场景的实践 Docker+ Kafka + Redis + MySQL

            admin 2019-07-02 123人围观 ,发现0个评论

            秒杀活动能够说在互联网上随处可见,从12306抢票,到聚合算抢购,咱们日子的方方面面都能够看到秒杀的身影。秒杀的架构规划也是关于一个架构师架构规划能力的一次检测。本文的意图并不在于供给一个能够直接落地的规划方案,而是意在供给一个简略的办法,一个思路,使咱们能够关于秒杀背面的一些规划有更理性的知道, 而且能够自己亲自动手实践一下。一切的装备及源码都在本文终究的GitHub repository中能够找到。

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

            JMeter:用JMeter来模仿秒杀活动中很多并发的用户恳求

            Seckill Service:根据Nodejs一次简略模仿秒杀场景的实践 Docker+ Kafka + Redis + MySQL运用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包,履行b一次简略模仿秒杀场景的实践 Docker+ Kafka + Redis + MySQLin目录下的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。这儿有两个当地需求设置成你实践环境的值,一个一次简略模仿秒杀场景的实践 Docker+ Kafka + Redis + MySQL是kafka装备下面的KAFKA_ADVERTISED_一次简略模仿秒杀场景的实践 Docker+ Kafka + Redis + MySQLHOST_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地址:https://github.com/geshenyi/MockSecKill

            请关注微信公众号
            微信二维码
            不容错过
            Powered By Z-BlogPHP