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