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