国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

云服務器|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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 久久首页 | 亚洲免费一区二区 | 国产欧美精品 | 91短视频版在线观看www免费 | 欧美日本精品 | 日韩视频在线一区二区 | 精品成人av| 欧美日一区二区 | a在线免费观看 | av网站地址 | av色综合 | 亚洲一区中文字幕在线观看 | 天天看天天爽 | 免费看的av | 狠狠艹 | 国产91色 | 依人在线免费视频 | 亚洲福利精品视频 | 久久久91| 免费一级毛片网站 | 久久午夜羞羞影院免费观看 | 国产精品一区二区三 | 日韩中文字幕av | 日韩欧美一区二区三区久久婷婷 | 91电影国产| 亚洲欧美日韩精品久久奇米色影视 | 国产精品久久久 | 在线播放亚洲 | 亚洲精品电影在线观看 | 日韩国产一区二区 | 噜噜噜在线 | 亚洲免费在线播放 | 天堂在线视频 | 国产1区2区 | 91中文在线观看 | 久久久久国产一区二区三区四区 | 亚洲人视频在线观看 | 99久久免费视频在线观看 | 欧美日韩久久精品 | 99精品欧美一区二区三区综合在线 | 免费一级片免费一级片 |