成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

go語言消息隊列 go語言開發(fā)的消息隊列

go語言能做什么?

很多朋友可能知道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)容介紹了。

golang實現(xiàn)本地延遲隊列

有個服務會大量使用延遲消息,進行事件處理。隨著業(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

nsq介紹和使用

最近一直在尋找一個高性能,高可用的消息隊列做內(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接收測試

Go語言使用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)

h5響應式網(wǎng)站建設(shè)
和顺县| 沙坪坝区| 平和县| 蒲城县| 乌鲁木齐市| 福泉市| 天峻县| 富蕴县| 内江市| 徐闻县| 青田县| 莎车县| 齐河县| 贡嘎县| 绥滨县| 天等县| 翁牛特旗| 资源县| 财经| 额尔古纳市| 麦盖提县| 安平县| 浦江县| 蒲江县| 九寨沟县| 扶余县| 寿光市| 临清市| 长海县| 响水县| 古交市| 楚雄市| 孝昌县| 五河县| 灵寿县| 满城县| 南郑县| 望奎县| 习水县| 琼中| 罗源县|