成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何用Go語言每分鐘處理100萬個請求

開發 后端
作者結合自身工作經歷,以一個項目為案例,通過多個Go語言程序實例的嘗試,闡述了Go語言是如何每分鐘可以處理100萬個請求的。

摘要:作者結合自身工作經歷,以一個項目為案例,通過多個Go語言程序實例的嘗試,闡述了Go語言是如何每分鐘可以處理100萬個請求的,以下是譯文。

我在幾個不同的公司從事反垃圾郵件,反病毒和反惡意軟件工作超過15年,現在我知道這些系統的復雜性可能是由于我們每天處理的大量數據造成的。

目前,我是 smsjunk.com 的CEO和 KnowBe4 的***架構師,兩個活躍在網絡安全行業的公司。

有趣的是,在過去10年左右的時間里,作為一名軟件工程師,我所參與的所有web后端開發大部分都是以Ruby on Rails(Rails是使用Ruby語言編寫的網頁程序開發框架,目的是為開發者提供常用組件)開發的。不要誤會我,我熱愛Ruby on Rails,我相信它是一個令人著迷的開發環境,但一段時間后,你開始以Ruby的方式思考和設計系統,忘了如何高效和原本可以利用多線程、并行、快速執行和小的內存消耗來簡化軟件架構。多年來,我是一個C / C++、Delphi和C #開發人員,我剛剛意識到,用合適的工具來完成工作可能會降低事情的復雜度。

我不太熱衷于開發語言和框架的戰爭,網站之間總是為此爭吵。我相信效率、生產率和代碼的可維護性主要取決于如何簡單地構建解決方案。 問題

當我們在一個匿名的遙測和分析系統上工作時,我們的目標是能夠處理來自數百萬終端的大量的POST請求。Web處理程序將接收一個JSON文檔,其中可能包含需要寫入Amazon S3的許多有效負載的集合,這是為了使map-reduce系統稍后操作這個數據。

傳統上,我們將研究創造一個一階作業者架構,利用諸如:

  • Sidekiq
  • Resque
  • DelayedJob
  • Elasticbeanstalk Worker Tier
  • RabbitMQ
  • 等等…

設置2個不同的集群,一個用于web前端,另一個用于作業者,這樣會擴大可以處理的后臺工作的數量。

但從一開始,我們的團隊就知道應該這樣做,因為在討論階段,我們預見這可能是一個非常大的流量系統。我使用Go語言大約2年左右的時間,我們開發了一些在用的系統,但是沒有一個系統能得到這么多的負載。

首先通過創建一些structure,定義通過POST調用來接收到的web請求負載,還有一個上傳請求負載到S3 bucket的函數。

如何用Go語言每分鐘處理100萬個請求

Go語言程序的單純方法

最初我們采取了一個非常單純的POST處理方式,僅僅試圖將任務并行化處理放到一個簡單的goroutine:

如何用Go語言每分鐘處理100萬個請求

對于中等負載來說,這可能對大多數人是有效的,但這很快證明在大型負載時,效果不太好。我們預期有很多的請求,但當我們部署***個版本到產品中時,并沒有看到這個數量級的請求。我們完全低估了流量。

上面的方法在幾個方面都不好,沒有辦法控制我們正在大量生產的Go程序要產生多少個例程。由于我們每分鐘收到100萬個POST請求,理所當然的,這段代碼很快就崩潰了。

再次嘗試

我們需要尋找一個不同的方式。從一開始,我們就討論如何保持請求處理程序的生命周期非常短,并在后臺生成處理進程。當然,這是必須在Ruby on Rails領域要做的,否則這將限制所有可用的web處理器,無論你使用的是puma, unicorn, passenger中的哪一個(請不要參加JRuby討論)。那么我們就需要利用通用的解決方案去做這個,例如Resque, Sidekiq, SQS,等等。清單還可以繼續列下去,因為有很多方法可以做到這一點。

所以第二個版本是創建一個緩存通道,在這里我們可以對一些作業進行排隊并上傳到S3,由于我們可以控制隊列中的***項目數,在內存中我們有足夠多的RAM對任務進行排隊,我們認為只在通道隊列中緩存作業是可以的。

如何用Go語言每分鐘處理100萬個請求

然后實際上的作業出列和處理,我們使用的是類似的函數:

如何用Go語言每分鐘處理100萬個請求

說實話,我不知道我們在想什么。這一定是一個充滿紅牛的深夜。這種方法沒有給我們帶來任何好處,我們用緩沖隊列來交換有缺陷的并發,也只是推遲了問題的產生時間而已。我們的同步處理器一次只上傳一個有效負載到S3,而且由于傳入請求的速率比單處理器上傳到S3的能力大得多,所以緩沖通道很快就達到了極限,限制了請求處理程序來排隊更多項目的能力。

我們只是簡單地回避這個問題,最終導致系統的死亡。在我們部署了這個有缺陷的版本之后,我們的延遲率以不變的速率持續增長。

如何用Go語言每分鐘處理100萬個請求

更好的解決方案

當使用Go語言通道時,我們決定利用通用模式以便創造一個2階的通道系統,一個用于作業排隊,另外一個控制多少作業者同時在JobQueue上操作。

這個想法是以某種可持續的速度并行上傳到S3,它既不會削弱機器性能,也不會從S3開始生成連接錯誤。所以我們選擇了創建一個作業/作業者模式。對那些熟悉java,C#等語言的人來說,可以考慮采用Go語言實現通道方式而不是作業者線程池的方式。

如何用Go語言每分鐘處理100萬個請求如何用Go語言每分鐘處理100萬個請求如何用Go語言每分鐘處理100萬個請求

我們修改了Web請求處理程序,創建一個帶負載的jobstruct實例,發送到JobQueue通道,便于作業者去拾取。

如何用Go語言每分鐘處理100萬個請求

在網站服務器初始化過程中,我們創建一個Dispatcher,調用Run()去創建一個作業者池,開始偵聽出現在JobQueue的作業。

 

  1. dispatcher := NewDispatcher(MaxWorker)  
  2. dispatcher.Run() 

下面是用于dispatcher執行的代碼:

如何用Go語言每分鐘處理100萬個請求如何用Go語言每分鐘處理100萬個請求

注意,我們會提供被實例化和被添加到作業者池的***的作業者量。 因為我們這個帶有dockerized Go環境的項目使用了亞馬遜Elasticbeanstalk,我們總是設法遵循12要素方法論來配置生產中的系統,從環境變量中讀取這些數值。這樣就可以控制有多少作業者和作業隊列的***值,因此,我們可以快速地調整這些值,而不需要重新部署集群。

 

  1. var (  
  2. MaxWorker = os.Getenv(“MAX_WORKERS”)  
  3. MaxQueue = os.Getenv(“MAX_QUEUE”)  

在部署完它之后,我們立刻發現所有的延遲率都降到了無關緊要的數字,系統處理請求的能力急劇上升。

如何用Go語言每分鐘處理100萬個請求

彈性負載均衡完全預熱幾分鐘后,我們看到ElasticBeanstalk應用服務每分鐘逼近100萬個請求。通常在早晨的幾個小時里,流量高峰會超過每分鐘100萬個請求。

一旦我們部署了新的代碼,服務器的數量從100臺減少到大約20臺。

如何用Go語言每分鐘處理100萬個請求

在恰當地配置了集群和自動縮放設置以后,我們能夠把它降低到僅有4x EC2 c4。如果CPU連續5分鐘超過90%,大型實例和彈性自動縮放設置就生成一個新實例。

如何用Go語言每分鐘處理100萬個請求

結論

簡單總是在我的字典里獲勝。我們可以設計一個復雜系統,它具有多隊列,后臺作業者,復雜部署的特點。但是相反我們決定利用Elasticbeanstalk的自動縮放和高效簡單的方式去并發,Go語言很好的提供了這些功能。

并不是每天你僅有四臺機器的集群,去處理每分鐘寫入到亞馬遜S3 bucket的100萬個POST請求,這可能比我***的MacBook Pro功能強大的多。

總有合適的工具適合這項工作。有時,當您的Ruby on Rails系統需要一個非常強大的web處理程序時,可以稍微考慮一下Ruby生態系統之外的更簡單、更強大的替代解決方案。

責任編輯:未麗燕 來源: ITeye
相關推薦

2019-07-02 14:05:23

Go語言高并發

2023-10-31 07:52:10

2021-07-27 06:05:07

網絡犯罪網絡攻擊網絡威脅

2013-08-19 11:27:24

谷歌宕機損失

2022-10-08 00:05:00

HammerDB自動化測試

2025-03-13 08:33:37

RPMTPM代碼

2011-09-05 10:07:49

聯想激光打印機

2011-09-06 08:42:58

惠普激光打印機

2011-11-23 13:54:21

惠普激光打印機

2011-09-19 13:27:36

惠普激光打印機

2012-02-23 14:10:16

惠普激光打印機

2012-05-24 11:38:00

惠普激光打印機

2012-01-09 15:14:41

惠普激光打印機

2012-08-07 14:33:49

打印機

2021-08-26 06:58:14

Http請求url

2010-08-26 17:39:48

谷歌

2012-08-01 10:18:47

打印機

2012-04-20 14:42:45

夏普復合一體機

2012-06-04 11:18:02

HP激光打印機

2011-11-25 13:39:55

聯想激光打印機
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国内精品一区二区 | 日韩欧美精品在线 | 九七午夜剧场福利写真 | 91社区在线高清 | 中文在线а√在线8 | 久久伊人精品 | 亚洲精品美女视频 | a在线免费观看 | 中日韩毛片 | 国产精品日产欧美久久久久 | 久久久久久久久久久久久久久久久久久久 | 亚洲高清av | 日韩成人在线播放 | 日韩欧美在线观看一区 | 日韩中文字幕在线观看视频 | 日韩欧美精品一区 | 中文精品视频 | 一区二区欧美在线 | 国产99免费视频 | 国产小视频自拍 | 亚洲福利一区二区 | 国产精品高潮呻吟久久 | 国产黄色小视频在线观看 | 在线免费91 | 婷婷综合久久 | 黄色电影在线免费观看 | 婷婷激情五月网 | 性欧美精品一区二区三区在线播放 | 欧美成人a∨高清免费观看 色999日韩 | 国产精品美女久久久久aⅴ国产馆 | 久久久久久a | av无遮挡 | 91伦理片 | 国产一区二区三区免费观看视频 | 日本色婷婷 | 精品久久久久久久久久久久久久久久久 | 欧美久久一区二区 | 99视频在线播放 | 国产91丝袜 | 成人在线a | 全部免费毛片在线播放网站 |