很多朋友可能知道Go語言的優(yōu)勢在哪,卻不知道Go語言適合用于哪些地方。
創(chuàng)新互聯(lián)專注于周至企業(yè)網(wǎng)站建設(shè),成都響應式網(wǎng)站建設(shè)公司,電子商務商城網(wǎng)站建設(shè)。周至網(wǎng)站建設(shè)公司,為周至等地區(qū)提供建站服務。全流程按需策劃,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務
1、 Go語言作為服務器編程語言,很適合處理日志、數(shù)據(jù)打包、虛擬機處理、文件系統(tǒng)、分布式系統(tǒng)、數(shù)據(jù)庫代理等;網(wǎng)絡編程方面。Go語言廣泛應用于Web應用、API應用、下載應用等;除此之外,Go語言還可用于內(nèi)存數(shù)據(jù)庫和云平臺領(lǐng)域,目前國外很多云平臺都是采用Go開發(fā)。
2、 其實Go語言主要用作服務器端開發(fā)。其定位是用來開發(fā)"大型軟件"的,適合于很多程序員一起開發(fā)大型軟件,并且開發(fā)周期長,支持云計算的網(wǎng)絡服務。Go語言能夠讓程序員快速開發(fā),并且在軟件不斷的增長過程中,它能讓程序員更容易地進行維護和修改。它融合了傳統(tǒng)編譯型語言的高效性和腳本語言的易用性和富于表達性。
3、 Go語言成功案例。Nsq:Nsq是由Go語言開發(fā)的高性能、高可用消息隊列系統(tǒng),性能非常高,每天能處理數(shù)十億條的消息;
4、 Docker:基于lxc的一個虛擬打包工具,能夠?qū)崿F(xiàn)PAAS平臺的組建。
5、 Packer:用來生成不同平臺的鏡像文件,例如VM、vbox、AWS等,作者是vagrant的作者
6、 Skynet:分布式調(diào)度框架。
7、 Doozer:分布式同步工具,類似ZooKeeper。
8、 Heka:mazila開源的日志處理系統(tǒng)。
9、 Cbfs:couchbase開源的分布式文件系統(tǒng)。
10、 Tsuru:開源的PAAS平臺,和SAE實現(xiàn)的功能一模一樣。
11、 Groupcache:memcahe作者寫的用于Google下載系統(tǒng)的緩存系統(tǒng)。
12、 God:類似redis的緩存系統(tǒng),但是支持分布式和擴展性。
13、 Gor:網(wǎng)絡流量抓包和重放工具。
以上的就是關(guān)于go語言能做什么的內(nèi)容介紹了。
有個服務會大量使用延遲消息,進行事件處理。隨著業(yè)務量不斷上漲。在晚間、節(jié)假日等流量高峰期消息延遲消息隊列限流會導致事件丟失,影響業(yè)務。與下游溝通后給上調(diào)到了最大限流值,問題依然存在,于是決定自己搞一套降級方案。
下游服務觸發(fā)限流時,能降級部分流量到本地延遲隊列,把業(yè)務損失降到最低。
本地延遲隊列承接部分mq流量
流程如下:
1. 使用zset 存儲延遲消息,其中:score為執(zhí)行時間,value為消息體
2. 啟動協(xié)程輪詢zset,獲取score最小的10條數(shù)據(jù),協(xié)程執(zhí)行間隔時間xs
如果最小分值小于等于當前時間戳,則發(fā)送消息
若最小分值大于當前時間戳,sleep等待執(zhí)行
需要對key進行hash,打散到多個分片中,避免大key和熱key問題,官方大key定義
因此,需保證每個key中value數(shù)量n5000,單個value大小不超過 10240/n kb
假設(shè)承接10w qps,如何處理?
10w qps延遲120s時,最開始消息隊列會積累100000*120=12000000條消息
假如每條消息大小500b,需占用存儲6000000kb = 6000Mb = 6GB
為避免大key問題,每個zset存放4000個元素,需要哈希到3000(3000是key的數(shù)量,可配置)個zset中。
整個集群假設(shè)500臺實例,每個處理qps平均在200左右。
單實例消費能力計算:
遍歷每個zset,針對每個zset起goroutine處理,此示例中需要 起3000個
但是每秒能處理成功的只有200個,其他都在空跑
綜上:
將redis key分片數(shù)n和每次處理的消息數(shù)m進行動態(tài)配置,便于調(diào)整
當流量上漲時,調(diào)大分片數(shù)n和單實例單分片并發(fā)數(shù)m即可,假如消費間隔200ms,集群處理能力為n*m*5 qps
n = (qps * 120) / 4000
若qps=q,則計算公式如下
zadd = q
zRange = 500 * 5 * n / 500
zRemove = q
setNx = 500 * 5 * n
若10w qps,則
讀qps = 15000 + 500*3000*5 =7515000,寫 20w
pros
redis 讀寫性能好,可支持較大并發(fā)量,zrange可直接取出到達執(zhí)行時間的消息
cons
redis 大key問題導致對數(shù)據(jù)量有一定的限制
分片數(shù)量擴縮容會漏消費,會導致事件丟失,業(yè)務有損
key分片數(shù)量過多時,redis讀寫壓力較大
機器資源浪費,3000個協(xié)程,單實例同一秒只有200個針對處理,其他都在空跑
流程如下:
使用帶緩沖的channel來實現(xiàn)延遲隊列,channel中存放的數(shù)據(jù)為消息體(包括執(zhí)行時間),channel能保證先進先出
從channel中取出數(shù)據(jù)后,判斷是否到達執(zhí)行時間
到達,同步發(fā)送mq
未到達,sleep 剩余執(zhí)行時間,然后再次執(zhí)行
從channel讀出的數(shù)據(jù)如果未到達執(zhí)行時間,無法再次放入channel中,需要協(xié)程sleep(執(zhí)行時間-當前時間)
10w qps延遲120s時,最開始消息隊列會積累100000*120=12000000條消息,假設(shè)每條消息大小500b,需要6G存儲空間
channel 大小 = (qps*120)/ c , c=集群實例數(shù),c=500 = channel大小為24000,占用12M內(nèi)存
要處理10w qps,分攤到每個機器的處理速度為 100000/500 = 200,假設(shè)單協(xié)程處理10qps,開20個即可。
pros:
本地存儲,相比redis,讀寫速度更快;協(xié)程數(shù)量少,開銷低;資源利用率較方案一高
cons:
穩(wěn)定性不如redis,實例故障可能導致數(shù)據(jù)丟失;worker池和channel擴縮容依賴服務重啟,成本高速度慢
綜上,我們以10w qps為例,對比兩種方案在以下指標差異,選擇方案二。
附上demo
最近一直在尋找一個高性能,高可用的消息隊列做內(nèi)部服務之間的通訊。一開始想到用zeromq,但在查找資料的過程中,意外的發(fā)現(xiàn)了Nsq這個由golang開發(fā)的消息隊列,畢竟是golang原汁原味的東西,功能齊全,關(guān)鍵是性能還不錯。其中支持動態(tài)拓展,消除單點故障等特性, 都可以很好的滿足我的需求
下面上一張Nsq與其他mq的對比圖,看上去的確強大。下面簡單記錄一下Nsq的使用方法
圖片來自golang2017開發(fā)者大會
在使用Nsq服務之前,還是有必要了解一下Nsq的幾個核心組件
整個Nsq服務包含三個主要部分
先看看官方的原話是怎么說:
nsqlookupd是守護進程負責管理拓撲信息??蛻舳送ㄟ^查詢 nsqlookupd 來發(fā)現(xiàn)指定話題(topic)的生產(chǎn)者,并且 nsqd 節(jié)點廣播話題(topic)和通道(channel)信息
簡單的說nsqlookupd就是中心管理服務,它使用tcp(默認端口4160)管理nsqd服務,使用http(默認端口4161)管理nsqadmin服務。同時為客戶端提供查詢功能
總的來說,nsqlookupd具有以下功能或特性
官方原話:是一套 WEB UI,用來匯集集群的實時統(tǒng)計,并執(zhí)行不同的管理任務
總的來說,nsqadmin具有以下功能或特性
nsqadmin默認的訪問地址是
官方原話:nsqd 是一個守護進程,負責接收,排隊,投遞消息給客戶端
簡單的說,真正干活的就是這個服務,它主要負責message的收發(fā),隊列的維護。nsqd會默認監(jiān)聽一個tcp端口(4150)和一個http端口(4151)以及一個可選的https端口
總的來說,nsqd 具有以下功能或特性
這是官方的圖,第一個channel(meteics)因為有多個消費者,所以觸發(fā)了負載均衡機制。后面兩個channel由于沒有消費者,所有的message均會被緩存在相應的隊列里,直到消費者出現(xiàn)
這里想到一個問題是,如果一個channel只有生產(chǎn)者不停的在投遞message,會不會導致服務器資源被耗盡?也許nsqd內(nèi)部做了相應處理,但還是要避免這種情況的出現(xiàn)
了解nsqlookupd,nsqd與客戶端中消費者和生產(chǎn)者的關(guān)系
消費者有兩種方式與nsqd建立連接
生產(chǎn)者必須直連nsqd去投遞message(網(wǎng)上說,可以連接到nsqlookupd,讓nsqlookupd自動選擇一個nsqd去完成投遞,但是我用Producer的tcp是連不上nsqlookupd的,不知道http可不可以…),
這里有一個問題就是如果生產(chǎn)者所連接的nsqd炸了,那么message就會投遞失敗,所以在客戶端必須自己實現(xiàn)相應的備用方案
執(zhí)行完后檢查godep是否已經(jīng)安裝在bin目錄下,一般都會自動安裝,如果沒有,用go install手動安裝下
如果安裝成功,bin目錄里就會出現(xiàn)一大堆nsq_…開頭的可執(zhí)行文件
nsqd是一個獨立的服務,啟動一個nsqd就可以完成message的收發(fā),啟動一個單機的nsqd,很簡單
客戶端可以使用http,也可以使用tcp,這里我使用是官方的go-nsq包做客戶端,使用tcp進行message的收發(fā)
//Nsq發(fā)送測試
//Nsq接收測試
重點提示:
這樣我們就啟動了一個 nsqd 的實例
編寫一個消息生產(chǎn)者
nsq_single_product.go
編寫一個消息消費者
nsq_single_consumer.go
添加第一個實例
添加第二個實例
消息生產(chǎn)者
nsq_cluster_product.go
消息消費者
nsq_cluster_consumer.go
網(wǎng)頁題目:go語言消息隊列 go語言開發(fā)的消息隊列
網(wǎng)站地址:http://jinyejixie.com/article40/dodoseo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、響應式網(wǎng)站、商城網(wǎng)站、用戶體驗、電子商務、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)