一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

云服務器|WEB服務器|FTP服務器|郵件服務器|虛擬主機|服務器安全|DNS服務器|服務器知識|Nginx|IIS|Tomcat|

服務器之家 - 服務器技術 - 服務器知識 - Docker + Nodejs + Kafka + Redis + MySQL搭建簡單秒殺環境

Docker + Nodejs + Kafka + Redis + MySQL搭建簡單秒殺環境

2021-01-10 18:03BlairWaldorf 服務器知識

本文給大家分享的是使用Docker + Nodejs + Kafka + Redis + MySQL模擬搭建起來的商品秒殺環境,非常的實用和熱門,有需要的小伙伴可以參考下

秒殺活動可以說在互聯網上隨處可見,從12306搶票,到聚劃算搶購,我們生活的方方面面都可以看到秒殺的身影。秒殺的架構設計也是對于一個架構師架構設計能力的一次考驗。本文的目的并不在于提供一個可以直接落地的設計方案,而是意在提供一個簡單的方法,一個思路,使大家能夠對于秒殺背后的一些設計有更感性的認識, 并且可以自己親自動手實踐一下。所有的配置及源碼都在本文最后的github repository中可以找到。

首先,先簡單介紹下本文中會涉及到的一些組件,如下圖所示:

Docker + Nodejs + Kafka + Redis + MySQL搭建簡單秒殺環境

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次并發請求。

Docker + Nodejs + Kafka + Redis + MySQL搭建簡單秒殺環境

在這個thread group下新建一個http request的sampler并命名為seckill,按下圖配置host name,port number,http request method以及request path

Docker + Nodejs + Kafka + Redis + MySQL搭建簡單秒殺環境

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文件,內容如下:

Docker + Nodejs + Kafka + Redis + MySQL搭建簡單秒殺環境

配置文件中一共配置了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

Docker + Nodejs + Kafka + Redis + MySQL搭建簡單秒殺環境

Docker + Nodejs + Kafka + Redis + MySQL搭建簡單秒殺環境

第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

Docker + Nodejs + Kafka + Redis + MySQL搭建簡單秒殺環境

這里的代碼就比較簡單了,會初始化一個kafka consumer監聽car_number topic,對于新獲取的消息會去mysql的seckill表里插入一條記錄。

操作步驟

啟動docker container

啟動seckill_service

啟動seckill_kafka_consumer

啟動jmeter發送2000個并發請求

結果 jmeter request results Docker + Nodejs + Kafka + Redis + MySQL搭建簡單秒殺環境

redis counter field

Docker + Nodejs + Kafka + Redis + MySQL搭建簡單秒殺環境

mysql seckill table

Docker + Nodejs + Kafka + Redis + MySQL搭建簡單秒殺環境

可以看到,最后redis中的counter變成0,seckill數據表中會插入100條記錄,沒有發生超賣或者少賣的情況。當然在實際生產環境場景中,還有許多其它需要考慮的地方,希望此文可以起到一個拋磚引玉的作用,幫助大家更好的理解秒殺場景。

項目github地址: mockseckill

原文鏈接:http://www.jianshu.com/p/c18e61d0726c

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 天天插在线视频 | 亚洲美洲国产日产 | 天海翼最新作品 | 水岛津实在线 | 国产精品片 | 欧美兽皇另类 | 精品一区二区三区视频 | xxoo做爰猛烈动态 | av91在线| 成人观看免费大片在线观看 | 高清国产欧美一v精品 | 日本高清在线精品一区二区三区 | 美女被吸乳老师羞羞漫画 | 99热这里只有精品国产免费 | 精品一久久香蕉国产线看观 | 啊好大好爽 | 息与子中文字幕在线 | 日本xx高清视频免费观看 | 韩国三级 720p | 91大神大战高跟丝袜美女 | 狠狠做五月深爱婷婷天天综合 | 视频免费观看在线播放高清 | 91手机在线 | 午夜AV国产欧美亚洲高清在线 | 麻生希在线观看 | 男女男精品网站 | 日本xnxnxnxnxn护士 | 欧美性4khd720 | 美女吃男生鸡鸡 | 91精品国产高清久久久久 | 娇妻与公陈峰姚瑶小说在线阅读 | 呜呜别塞了啊抽插 | 欧美精品一区二区三区免费观看 | 国产精品资源在线观看网站 | 国产成人精品一区二三区在线观看 | 天天色综合三 | 日本不卡一区二区三区在线观看 | 天天爽天天干天天操 | 国产色拍 | 亚洲免费国产 | 欧美一级专区免费大片 |