## 講個故事
軟件、服務器工作模式的很多靈感都是從餐廳來的,都是為了解決實際問題的。
生產者,消費者;
我們來看去餐廳吃飯的場景:
某日我們肚子餓了,去餐館吃飯,我們需要吃飯,餐館是做飯的。
那么我是消費者,餐廳是生產者。我消費飯菜,餐廳生成飯菜。
此時剛好正中午吃飯的時候,人很多,而這個餐廳只有一個廚師在炒菜,所以需要排隊等。
餐廳吃飯的流程:吧臺點菜付錢,付款后領號找個位置等,廚房炒菜,飯好了會有人叫號,拿到飯就吃飯。
我點菜一分鐘就好了,但是廚師炒出來需要5~10分鐘,所以我在吧臺點好后,服務員會給我一個號(32號),讓我找個位置坐下先喝杯茶。
然后我就找個位置一邊喝茶,一邊看會手機。
8分鐘很快就過了,服務員拿著牌子,喊“32號好了”,誰是32號,我一看我的牌子,“我是32號,我在這兒”,服務員“哦,好的”,然后給我端過來了我剛點的千張肉絲,還有個小細節,她把菜放到我的桌子上的時候收走了我的牌子。當然我的菜已經上了,要這個牌子也沒用了,于是我就開始吃飯了。
其它的人來的晚的還在排隊,還有很多人像我剛才一樣的正在等著“叫號”,有幾個人好像等得有點不耐煩了,頻繁的去催服務員。
但是只有一個廚師啊,**我看到服務員把菜單送到廚房,貼在板子上,廚師照著菜單炒菜,有時候按照順序,有時候估計是什么好炒,方便炒,什么菜有幾份的可以一起炒,總之廚師會想辦法盡量提高效率(關于怎么提高廚師出餐的效率真的需要到廚房去考察一下廚師的工作情況才能知道的)**,但中午吃飯人太多了,高峰期,板子上的菜單都貼滿了,炒不過來啊。
有的沒耐心的甚至要去前臺退款不吃了。
有的人排隊排到一半沒有耐心要走了。
有的人看到門口排那么長的隊,干脆就沒進來,換別家了。
看著有人走了,老板就不高興了,怎么能這樣呢,到手的錢飛了,這不行,趕快打電話叫另外一個廚師來,叫另外一個休假的收銀員也來上班,過了一會,**廚房第二個灶臺開了,第二個廚師將第一個廚師的板子上的菜單拿走一部分,貼到自己的板子上(注意這里,很重要,這里面涉及到的細節很重要,下面會說到)開始炒菜**,收銀員增加了一個,點菜就可以在兩個吧臺點,之前第一個吧臺排隊的人看到第二個吧臺開了,排在后面的人都一窩蜂的跑去第二個吧臺排隊。很快第二個吧臺也排滿了人,兩個吧臺勢均力敵,人數差不多。(這里有一個細節,吧臺2開的時候,正在吧臺1點菜人是不會去吧臺2的,因為他此時正在吧臺1點呢,注意這個細節,也很重要,下面會說到這有什么意義)
點菜,上菜的速度提升了之后,店里的秩序好了很多,吃飯的人也多了,店里的桌子差不多都坐滿了人,生意好的令人旁邊的店羨慕不已。
老板可高興了,看著前臺不停的收錢,廚房不斷的出餐,心里美滋滋的。
時間過的很快,飯點的時候很快就過了,吃飯的人漸漸沒有了,此時忙碌的餐廳變得閑起來了,前臺兩個妹子沒事了開始相互的聊天,廚房里有一個廚師也很閑。
老板又開始皺眉頭了,你們這么閑可不行,可是要工資的,精明的老板對來幫忙的前臺和廚師說你們現在可以下班了,今天的給你們加半天的工資。
哈哈,聰明的老板,錢也賺了,人力成本也講到最低化。
我目睹了一切,回到家里來了靈感,原來服務器,軟件的工作的方式,靈感就是來自于餐廳啊。于是我趕緊寫下了這些文字,生怕沒能記下這個“偉大”的發現。
以上,純屬瞎編。
再說上面那兩個重要的問題:
其實是資源分配,并發的問題。
另外一個廚師來了,將第一個廚師的板子上的菜單拿下一部分貼到自己的板子上。
你覺得實際生活中是怎樣的情景呢?
此時廚師1正在炒菜,廚師2來了,要拿掉一下廚師1板子上的菜單,也就是原本廚師1要炒的菜。
注意這段話有三個重要的信息:
1. 廚師1當前正在炒著菜呢
2. 當前板子上的所有菜單是廚師1原本準備要炒的菜
3. 現在廚師2想要分配一點過去
那么這里就會有一些問題,廚師2拿走一些的時候肯定要問一下廚師1:
廚師2:“喂,你現在在炒什么菜,沒有炒的我拿去炒了啊”(肯定要問一下,不然廚師1當前再炒青椒肉絲,廚師2沒問,看到板子上的青椒肉絲也炒了,那這樣就炒了兩個青椒肉絲,重復炒了。)
廚師1:“什么,別叫,炒菜在呢,把我頭都弄暈了,你等我把這個菜炒完了再說”
他們要重新分配資源,因為廚師2是中途進來的,所以要重新分配,要保證正確的話,那么廚師1必須要停下來,然后再一起重新分配資源,但是廚師1鍋里面還炒著菜啊,肯定不能停啊,停下來不就炒糊了,所以廚師1要先把此時鍋里面正在炒著的菜先炒完,再停下來,也就是說哪怕廚師1接收到了停止工作的命令,也要先把手頭上的正在炒的菜炒完,炒完了再停止工作。
其實這和我們經常說的:熱插拔,平滑停止工作,平滑重啟等是同樣的意義。
廚師2就乖乖的等廚師1把手頭上的菜炒完,然后他們在開始重新分配菜單。
然后開始同時工作,各自炒各自的菜沒有沖突。
其實這里面涉及到的問題就是:
重復執行問題
worker變化導致**重排問題**,資源重新分配問題(平滑停止,重新分配資源)
同理,前臺也是同樣的問題。
* * * * *
### 擴展
[高并發得時候,服務器壓力大,是內存的問題,還是cpu的問題?-那份心情61650940的回答-悟空問答](https://www.wukong.com/answer/6463195446322921741/?iid=12619555732&app=news_article&wxshare_count=1&tt_from=weixin&utm_source=weixin&utm_medium=toutiao_android&utm_campaign=client_share)
last update:2017-9-8 13:36:39
- 開始
- 公益
- 更好的使用看云
- 推薦書單
- 優秀資源整理
- 技術文章寫作規范
- SublimeText - 編碼利器
- PSR-0/PSR-4命名標準
- php的多進程實驗分析
- 高級PHP
- 進程
- 信號
- 事件
- IO模型
- 同步、異步
- socket
- Swoole
- PHP擴展
- Composer
- easyswoole
- php多線程
- 守護程序
- 文件鎖
- s-socket
- aphp
- 隊列&并發
- 隊列
- 講個故事
- 如何最大效率的問題
- 訪問式的web服務(一)
- 訪問式的web服務(二)
- 請求
- 瀏覽器訪問阻塞問題
- Swoole
- 你必須理解的計算機核心概念 - 碼農翻身
- CPU阿甘 - 碼農翻身
- 異步通知,那我要怎么通知你啊?
- 實時操作系統
- 深入實時 Linux
- Redis 實現隊列
- redis與隊列
- 定時-時鐘-阻塞
- 計算機的生命
- 多進程/多線程
- 進程通信
- 拜占庭將軍問題深入探討
- JAVA CAS原理深度分析
- 隊列的思考
- 走進并發的世界
- 鎖
- 事務筆記
- 并發問題帶來的后果
- 為什么說樂觀鎖是安全的
- 內存鎖與內存事務 - 劉小兵2014
- 加鎖還是不加鎖,這是一個問題 - 碼農翻身
- 編程世界的那把鎖 - 碼農翻身
- 如何保證萬無一失
- 傳統事務與柔性事務
- 大白話搞懂什么是同步/異步/阻塞/非阻塞
- redis實現鎖
- 淺談mysql事務
- PHP異常
- php錯誤
- 文件加載
- 路由與偽靜態
- URL模式之分析
- 字符串處理
- 正則表達式
- 數組合并與+
- 文件上傳
- 常用驗證與過濾
- 記錄
- 趣圖
- foreach需要注意的問題
- Discuz!筆記
- 程序設計思維
- 抽象與具體
- 配置
- 關于如何學習的思考
- 編程思維
- 談編程
- 如何安全的修改對象
- 臨時
- 臨時筆記
- 透過問題看本質
- 程序后門
- 邊界檢查
- session
- 安全
- 王垠
- 第三方數據接口
- 驗證碼問題
- 還是少不了虛擬機
- 程序員如何談戀愛
- 程序員為什么要一直改BUG,為什么不能一次性把代碼寫好?
- 碎碎念
- 算法
- 實用代碼
- 相對私密與絕對私密
- 學習目標
- 隨記
- 編程小知識
- foo
- 落盤
- URL編碼的思考
- 字符編碼
- Elasticsearch
- TCP-IP協議
- 碎碎念2
- Grafana
- EFK、ELK
- RPC
- 依賴注入
- 科目一
- 開發筆記
- 經緯度格式轉換
- php時區問題
- 解決本地開發時調用遠程AIP跨域問題
- 后期靜態綁定
- 談tp的跳轉提示頁面
- 無限分類問題
- 生成微縮圖
- MVC名詞
- MVC架構
- 也許模塊不是唯一的答案
- 哈希算法
- 開發后臺
- 軟件設計架構
- mysql表字段設計
- 上傳表如何設計
- 二開心得
- awesomes-tables
- 安全的代碼部署
- 微信開發筆記
- 賬戶授權相關
- 小程序獲取是否關注其公眾號
- 支付相關
- 提交訂單
- 微信支付筆記
- 支付接口筆記
- 支付中心開發
- 下單與支付
- 支付流程設計
- 訂單與支付設計
- 敏感操作驗證
- 排序設計
- 代碼的運行環境
- 搜索關鍵字的顯示處理
- 接口異步更新ip信息
- 圖片處理
- 項目搭建
- 閱讀文檔的新方式
- mysql_insert_id并發問題思考
- 行鎖注意事項
- 細節注意
- 如何處理用戶的輸入
- 不可見的字符
- 抽獎
- 時間處理
- 應用開發實戰
- python 學習記錄
- Scrapy 教程
- Playwright 教程
- stealth.min.js
- Selenium 教程
- requests 教程
- pyautogui 教程
- Flask 教程
- PyInstaller 教程
- 蜘蛛
- python 文檔相似度驗證
- thinkphp5.0數據庫與模型的研究
- workerman進程管理
- workerman網絡分析
- java學習記錄
- docker
- 筆記
- kubernetes
- Kubernetes
- PaddlePaddle
- composer
- oneinstack
- 人工智能 AI
- 京東
- pc_detailpage_wareBusiness
- doc
- 電商網站設計
- iwebshop
- 商品規格分析
- 商品屬性分析
- tpshop
- 商品規格分析
- 商品屬性分析
- 電商表設計
- 設計記錄
- 優惠券
- 生成唯一訂單號
- 購物車技術
- 分類與類型
- 微信登錄與綁定
- 京東到家庫存系統架構設計
- crmeb
- 命名規范
- Nginx https配置
- 關于人工智能
- 從人的思考方式到二叉樹
- 架構
- 今日有感
- 文章保存
- 安全背后: 瀏覽器是如何校驗證書的
- 避不開的分布式事務
- devops自動化運維、部署、測試的最后一公里 —— ApiFox 云時代的接口管理工具
- 找到自己今生要做的事
- 自動化生活
- 開源與漿果
- Apifox: API 接口自動化測試指南