高併發模擬實驗1 情景模擬

2021-09-12 22:21:32 字數 4783 閱讀 9424

實驗目的

檢視高併發情況下資料邏輯上出現的錯誤問題(注:這裡不考慮伺服器負載等效能問題)

實驗描述

假設存在商品表goods,表包含兩個字段:id,quantity,其中id為主鍵,代表商品編號,quantity代表商品庫存數量,服務端設計程式模擬購物,每購買一件(客戶端每請求一次),商品庫存就減一。在測試會話中使用ab壓力測試工具模擬以下兩種情況,分別檢視庫存剩餘量。假設庫存總量為100,請求完畢,正確的庫存剩餘量應該是80。

(1)有20個人依次排隊進行購物,每人購買一件。

(2)同時有10個人進行購物操作,總的購買量為20(即總的請求個數為20,每次傳送10個請求)

實驗環境:fedora29

所需軟體:apache,php,mysql,ab

實驗步驟

建立初始資料

mariadb [test]> create database `test`;

mariadb [test]> create table `goods` (

-> `id` int(10) default null,

-> `quantity` int(10) default null

-> ) engine=innodb default charset=utf8;

query ok, 0 rows affected (0.693 sec)

mariadb [test]> insert into goods values(1,100);

query ok, 1 row affected (0.068 sec)

mariadb [test]> select * from goods;

+------+----------+

| id | quantity |

+------+----------+

| 1 | 100 |

+------+----------+

1 row in set (0.000 sec)

購物處理程式buy.php

<?php

$db = new mysqli("localhost","root","yptest","test");

$query = "select quantity from a where id =1";

$res =$db->query($query);

while($row=mysqli_fetch_array($res))

$sql = "update goods set quantity = $quantity+1 where id =1";

$reslut =$db->query($sql);

//記錄操作語句,檢視執行細節

$file = fopen("log.txt", "a+") or die("unable to open file!");

fwrite($file, $sql."\r\n");

fclose($file);

if($reslut)else

?>

模擬請求

(1)有20個人依次排隊進行購物,每人購買一件。

ab -c 1 -n 20 "http://localhost:9101/buy.php"
結果(正確):

mariadb [test]> select * from goods;

+------+----------+

| id | quantity |

+------+----------+

| 1 | 80 |

+------+----------+

1 row in set (0.000 sec)

日誌(log.txt)明細:

update goods set quantity = 100-1 where id =1

update goods set quantity = 99-1 where id =1

update goods set quantity = 98-1 where id =1

update goods set quantity = 97-1 where id =1

update goods set quantity = 96-1 where id =1

update goods set quantity = 95-1 where id =1

update goods set quantity = 94-1 where id =1

update goods set quantity = 93-1 where id =1

update goods set quantity = 92-1 where id =1

update goods set quantity = 91-1 where id =1

update goods set quantity = 90-1 where id =1

update goods set quantity = 89-1 where id =1

update goods set quantity = 88-1 where id =1

update goods set quantity = 87-1 where id =1

update goods set quantity = 86-1 where id =1

update goods set quantity = 85-1 where id =1

update goods set quantity = 84-1 where id =1

update goods set quantity = 83-1 where id =1

update goods set quantity = 82-1 where id =1

update goods set quantity = 81-1 where id =1

(2)同時有10個人進行購物操作,總的購買量為20(即總的請求個數為20,每次傳送10個請求)

ab -c 10 -n 20 "http://localhost:9101/concurrency.php"
結果(錯誤):

mariadb [test]> select * from goods;

+------+----------+

| id | quantity |

+------+----------+

| 1 | 87 |

+------+----------+

1 row in set (0.000 sec)

日誌(log.txt)明細:

update goods set quantity = 100-1 where id =1

update goods set quantity = 99-1 where id =1

update goods set quantity = 98-1 where id =1

update goods set quantity = 98-1 where id =1

update goods set quantity = 99-1 where id =1

update goods set quantity = 99-1 where id =1

update goods set quantity = 98-1 where id =1

update goods set quantity = 97-1 where id =1

update goods set quantity = 97-1 where id =1

update goods set quantity = 96-1 where id =1

update goods set quantity = 95-1 where id =1

update goods set quantity = 94-1 where id =1

update goods set quantity = 91-1 where id =1

update goods set quantity = 93-1 where id =1

update goods set quantity = 91-1 where id =1

update goods set quantity = 92-1 where id =1

update goods set quantity = 91-1 where id =1

update goods set quantity = 90-1 where id =1

update goods set quantity = 88-1 where id =1

update goods set quantity = 89-1 where id =1

結果分析:

從結果可以看出,當有10個人同時進行請求購物時,庫存剩餘量出錯,分析日誌檔案可以看出,在併發請求的情況下,由於無法準確的獲取當前庫存剩餘量,導致在更新庫存剩餘量出錯。

問題:

如何保障在10個人同時進行請求購物時,每次請求都能獲取到準確的庫存剩餘量,進而進行庫存的更新操作?

解決辦法

《 高併發模擬實驗2-解決高併發問題》

PacketTracer 模擬實驗

目前主流的網路模擬器有 packettracer gns3 eve ng 教學模擬建議使用 packettracer 生產模擬建議使用 eve ng packettracer 只能模擬思科自家的裝置。由於這款軟體是基於純軟體模擬,所以思科裝置的很多功能特性模擬的不全面,導致有些實驗做不了。這款模擬器...

PHP模擬高併發

高併發 high concurrency 是網際網路分布式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時並行處理很多請求。高併發相關常用的一些指標有響應時間 response time 吞吐量 throughput 每秒查詢率qps query per second 併發使用...

1203 實驗三 程序排程模擬實驗

實驗三 程序排程模擬實驗 物聯網工程 張學玲 201306104140 一 實驗目的 用高階語言完成乙個程序排程程式,以加深對程序的概念及程序排程演算法的理解。二 實驗內容和要求 實驗內容 完成兩個演算法 簡單時間片輪轉法 多級反饋佇列排程演算法 的設計 編碼和除錯工作,完成實驗報告。1 每個程序有...