go語(yǔ)言mongoapi go語(yǔ)言和python哪個(gè)好

為什么go語(yǔ)言適合開發(fā)網(wǎng)游服務(wù)器端

前段時(shí)間在golang-China讀到這個(gè)貼:

創(chuàng)新互聯(lián)建站主要為客戶提供服務(wù)項(xiàng)目涵蓋了網(wǎng)頁(yè)視覺設(shè)計(jì)、VI標(biāo)志設(shè)計(jì)、營(yíng)銷網(wǎng)站、網(wǎng)站程序開發(fā)、HTML5響應(yīng)式成都網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站建設(shè)、微商城、網(wǎng)站托管及網(wǎng)頁(yè)維護(hù)、WEB系統(tǒng)開發(fā)、域名注冊(cè)、國(guó)內(nèi)外服務(wù)器租用、視頻、平面設(shè)計(jì)、SEO優(yōu)化排名。設(shè)計(jì)、前端、后端三個(gè)建站步驟的完善服務(wù)體系。一人跟蹤測(cè)試的建站服務(wù)標(biāo)準(zhǔn)。已經(jīng)為木屋行業(yè)客戶提供了網(wǎng)站營(yíng)銷推廣服務(wù)。

個(gè)人覺得golang十分適合進(jìn)行網(wǎng)游服務(wù)器端開發(fā),寫下這篇文章總結(jié)一下。

從網(wǎng)游的角度看:

要成功的運(yùn)營(yíng)一款網(wǎng)游,很大程度上依賴于玩家自發(fā)形成的社區(qū)。只有玩家自發(fā)形成一個(gè)穩(wěn)定的生態(tài)系統(tǒng),游戲才能持續(xù)下去,避免鬼城的出現(xiàn)。而這就需要多次大量導(dǎo)入用戶,在同時(shí)在線用戶量達(dá)到某個(gè)臨界點(diǎn)的時(shí)候,才有可能完成。因此,多人同時(shí)在線十分有必要。

再來看網(wǎng)游的常見玩法,除了排行榜這類統(tǒng)計(jì)和數(shù)據(jù)匯總的功能外,基本沒有需要大量CPU時(shí)間的應(yīng)用。以前的項(xiàng)目里,即時(shí)戰(zhàn)斗產(chǎn)生的各種傷害計(jì)算對(duì)CPU的消耗也不大。玩家要完成一次操作,需要通過客戶端-服務(wù)器端-客戶端這樣一個(gè)來回,為了獲得高響應(yīng)速度,滿足玩家體驗(yàn),服務(wù)器端的處理也不能占用太多時(shí)間。所以,每次請(qǐng)求對(duì)應(yīng)的CPU占用是比較小的。

網(wǎng)游的IO主要分兩個(gè)方面,一個(gè)是網(wǎng)絡(luò)IO,一個(gè)是磁盤IO。網(wǎng)絡(luò)IO方面,可以分成美術(shù)資源的IO和游戲邏輯指令的IO,這里主要分析游戲邏輯的IO。游戲邏輯的IO跟CPU占用的情況相似,每次請(qǐng)求的字節(jié)數(shù)很小,但由于多人同時(shí)在線,因此并發(fā)數(shù)相當(dāng)高。另外,地圖信息的廣播也會(huì)帶來比較頻繁的網(wǎng)絡(luò)通信。磁盤IO方面,主要是游戲數(shù)據(jù)的保存。采用不同的數(shù)據(jù)庫(kù),會(huì)有比較大的區(qū)別。以前的項(xiàng)目里,就經(jīng)歷了從MySQL轉(zhuǎn)向MongoDB這種內(nèi)存數(shù)據(jù)庫(kù)的過程,磁盤IO不再是瓶頸??傮w來說,還是用內(nèi)存做一級(jí)緩沖,避免大量小數(shù)據(jù)塊讀寫的方案。

針對(duì)網(wǎng)游的這些特點(diǎn),golang的語(yǔ)言特性十分適合開發(fā)游戲服務(wù)器端。

首先,go語(yǔ)言提供goroutine機(jī)制作為原生的并發(fā)機(jī)制。每個(gè)goroutine所需的內(nèi)存很少,實(shí)際應(yīng)用中可以啟動(dòng)大量的goroutine對(duì)并發(fā)連接進(jìn)行響應(yīng)。goroutine與gevent中的greenlet很相像,遇到IO阻塞的時(shí)候,調(diào)度器就會(huì)自動(dòng)切換到另一個(gè)goroutine執(zhí)行,保證CPU不會(huì)因?yàn)镮O而發(fā)生等待。而goroutine與gevent相比,沒有了python底層的GIL限制,就不需要利用多進(jìn)程來榨取多核機(jī)器的性能了。通過設(shè)置最大線程數(shù),可以控制go所啟動(dòng)的線程,每個(gè)線程執(zhí)行一個(gè)goroutine,讓CPU滿負(fù)載運(yùn)行。

同時(shí),go語(yǔ)言為goroutine提供了獨(dú)到的通信機(jī)制channel。channel發(fā)生讀寫的時(shí)候,也會(huì)掛起當(dāng)前操作channel的goroutine,是一種同步阻塞通信。這樣既達(dá)到了通信的目的,又實(shí)現(xiàn)同步,用CSP模型的觀點(diǎn)看,并發(fā)模型就是通過一組進(jìn)程和進(jìn)程間的事件觸發(fā)解決任務(wù)的。雖然說,主流的編程語(yǔ)言之間,只要是圖靈完備的,他們就都能實(shí)現(xiàn)相同的功能。但go語(yǔ)言提供的這種協(xié)程間通信機(jī)制,十分優(yōu)雅地揭示了協(xié)程通信的本質(zhì),避免了以往鎖的顯式使用帶給程序員的心理負(fù)擔(dān),確是一大優(yōu)勢(shì)。進(jìn)行網(wǎng)游開發(fā)的程序員,可以將游戲邏輯按照單線程阻塞式的寫,不需要額外考慮線程調(diào)度的問題,以及線程間數(shù)據(jù)依賴的問題。因?yàn)?,線程間的channel通信,已經(jīng)表達(dá)了線程間的數(shù)據(jù)依賴關(guān)系了,而go的調(diào)度器會(huì)給予妥善的處理。

另外,go語(yǔ)言提供的gc機(jī)制,以及對(duì)指針的保護(hù)式使用,可以大大減輕程序員的開發(fā)壓力,提高開發(fā)效率。

展望未來,我期待go語(yǔ)言社區(qū)能夠提供更多的goroutine間的隔離機(jī)制。個(gè)人十分推崇erlang社區(qū)的脆崩哲學(xué),推動(dòng)應(yīng)用發(fā)生預(yù)期外行為時(shí),盡早崩潰,再fork出新進(jìn)程處理新的請(qǐng)求。對(duì)于協(xié)程機(jī)制,需要由程序員保證執(zhí)行的函數(shù)不會(huì)發(fā)生死循環(huán),導(dǎo)致線程卡死。如果能夠定制goroutine所執(zhí)行函數(shù)的最大CPU執(zhí)行時(shí)間,及所能使用的最大內(nèi)存空間,對(duì)于提升系統(tǒng)的魯棒性,大有裨益。

如何將api數(shù)據(jù)導(dǎo)入mongodb

在完成了集群的搭建工作之后,需要做的就是建立一個(gè)數(shù)據(jù)庫(kù),建立表,設(shè)置分片主鍵來初始化數(shù)據(jù)了!

(1)建立WLB數(shù)據(jù)庫(kù),設(shè)置分表wlb_orders

D:/mongodb-win32-i386-1.8.0/cmdcd d:/mongodb-win32-i386-1.8.0/bin

D:/mongodb-win32-i386-1.8.0/bincall mongo.exe 127.0.0.1:50000

MongoDB shell version: 1.8.0

connecting to: 127.0.0.1:50000/test

use admin

switched to db admin

printShardingStatus()

--- Sharding Status ---

sharding version: { "_id" : 1, "version" : 3 }

shards:

{

"_id" : "ShardSetA",

"host" : "setA/127.0.0.1:10000,127.0.0.1:10001,127.0.0.1:10002"

}

{

"_id" : "ShardSetB",

"host" : "setB/127.0.0.1:20000,127.0.0.1:20001,127.0.0.1:20002"

開源數(shù)據(jù)統(tǒng)計(jì)平臺(tái) -- GoAnalytics

本項(xiàng)目用于移動(dòng)端的數(shù)據(jù)統(tǒng)計(jì),項(xiàng)目地址: 。開源的數(shù)據(jù)統(tǒng)計(jì)countly做的很好,但是基礎(chǔ)免費(fèi)版的功能實(shí)在不夠看,因此我就決定用go語(yǔ)言來寫了這個(gè)項(xiàng)目,一來可以在實(shí)踐中學(xué)習(xí)go語(yǔ)言,二來也可以開發(fā)功能完整的開源平臺(tái)。該項(xiàng)目正在開發(fā)中,歡迎有興趣的gopher一起參與。

數(shù)據(jù)存儲(chǔ)方面使用的是mongodb。由于數(shù)據(jù)統(tǒng)計(jì)業(yè)務(wù)幾乎不涉及到事務(wù)以及嚴(yán)格的一致性場(chǎng)景,而且mongodb的自動(dòng)分片功能可以支撐較大的數(shù)據(jù)量。使用大數(shù)據(jù)的存儲(chǔ)組件的話就太過于重了。因此選用mongodb。

業(yè)務(wù)邏輯整體基于事件的發(fā)布訂閱。當(dāng)收到客戶端請(qǐng)求, frontend 會(huì)對(duì)請(qǐng)求數(shù)據(jù)進(jìn)行處理,然后發(fā)布響應(yīng)的事件。 backend 收到事件后進(jìn)行統(tǒng)計(jì)處理。

后臺(tái)展示基于Vue-Admin-Template開發(fā),本人前端能力基本就是依葫蘆畫瓢,希望有前端大神來開發(fā)后臺(tái)頁(yè)面,項(xiàng)目地址:

目前客戶端API僅有2個(gè)。一個(gè)是上報(bào) openApp 打開APP時(shí)間,一個(gè)是上報(bào) usageTime 一次啟動(dòng)使用時(shí)長(zhǎng)事件。SDK方面也需要移動(dòng)端的大神開發(fā),感興趣的大佬可以一起開發(fā)。

下面放一點(diǎn)后臺(tái)頁(yè)面的效果圖:

GoAnalytics是基于go實(shí)現(xiàn)的一個(gè)數(shù)據(jù)統(tǒng)計(jì)平臺(tái),用于統(tǒng)計(jì)移動(dòng)端的數(shù)據(jù)指標(biāo),比如啟動(dòng)次數(shù)、用戶增長(zhǎng)、活躍用戶、留存等指標(biāo)分析。前端數(shù)據(jù)展示項(xiàng)目是 goanalytics-web 。目前正在積極開發(fā)中,歡迎提交新的需求和pull request。

Go版本需要支持module,本地開發(fā)測(cè)試

cmd/goanalytics_kafka 和 goanalytics_rmq 是分別基于 kafka 和 rocketmq 的發(fā)布訂閱功能做的數(shù)據(jù)發(fā)布

和訂閱處理,橫向擴(kuò)展能力比 local 高。另外由于 rocketmq 還沒有原生基于 go 的客戶端(原生客戶端正在開發(fā)中

2.0.0 road map ),可能會(huì)存在問題。

項(xiàng)目結(jié)構(gòu)

├── README.md

├── api

│ ├── authentication 用戶認(rèn)證、管理API

│ ├── middlewares GIN 中間件

│ └── router API route

├── cmd

│ ├── account 生成admin賬號(hào)命令

│ ├── analytic_local 不依賴消息系統(tǒng)的goanalytics

│ ├── goanalytics_kafka 基于kafak的goanalytics

│ ├── goanalytics_rmq 基于rocketmq的goanalytics

│ └── test_data 生成測(cè)試數(shù)據(jù)命令

├── common

│ └── data.go

├── conf 配置

│ └── conf.go

├── event

│ ├── codec 數(shù)據(jù)編解碼

│ └── pubsub 消息發(fā)布訂閱

├── go.mod

├── go.sum

├── metric 所有的統(tǒng)計(jì)指標(biāo)在這里實(shí)現(xiàn)

│ ├── init.go

│ └── user 用戶相關(guān)指標(biāo)的實(shí)現(xiàn)

├── schedule

│ └── schedule.go 定時(shí)任務(wù)調(diào)度

├── storage 存儲(chǔ)模塊

│ ├── counter.go 計(jì)數(shù)器接口

│ ├── data.go

│ └── mongodb 基于mongodb實(shí)現(xiàn)的存儲(chǔ)及計(jì)數(shù)器

└── utils

├── date.go

├── date_test.go

├── errors.go

└── key.go

golang使用mgo操作mongoDB遇到奇葩問題,求教

這個(gè)似乎不是那么容易解答的,首先你要把數(shù)據(jù)從mongodb查出來,你要確保已經(jīng)安裝了go語(yǔ)言的mongodb驅(qū)動(dòng)。然后對(duì)查出來的數(shù)據(jù)進(jìn)行解析,查出來的數(shù)據(jù)是類似json的數(shù)據(jù),這個(gè)解析代碼需要相關(guān)的庫(kù)或者你自己寫的。然后再把數(shù)據(jù)相應(yīng)的插入mysql里,這里你也要安裝go語(yǔ)言的mysql驅(qū)動(dòng)和odbc

組件分享之后端組件——基于Golang實(shí)現(xiàn)的高性能和彈性的流處理器benthos

近期正在探索前端、后端、系統(tǒng)端各類常用組件與工具,對(duì)其一些常見的組件進(jìn)行再次整理一下,形成標(biāo)準(zhǔn)化組件專題,后續(xù)該專題將包含各類語(yǔ)言中的一些常用組件。歡迎大家進(jìn)行持續(xù)關(guān)注。

本節(jié)我們分享的是基于Golang實(shí)現(xiàn)的高性能和彈性的流處理器 benthos ,它能夠以各種代理模式連接各種 源 和 接收器,并對(duì)有效負(fù)載執(zhí)行 水合、濃縮、轉(zhuǎn)換和過濾 。

它帶有 強(qiáng)大的映射語(yǔ)言 ,易于部署和監(jiān)控,并且可以作為靜態(tài)二進(jìn)制文件、docker 映像或 無服務(wù)器函數(shù) 放入您的管道,使其成為云原生。

Benthos 是完全聲明性的,流管道在單個(gè)配置文件中定義,允許您指定連接器和處理階段列表:

Apache Pulsar, AWS (DynamoDB, Kinesis, S3, SQS, SNS), Azure (Blob storage, Queue storage, Table storage), Cassandra, Elasticsearch, File, GCP (Pub/Sub, Cloud storage), HDFS, HTTP (server and client, including websockets), Kafka, Memcached, MQTT, Nanomsg, NATS, NATS JetStream, NATS Streaming, NSQ, AMQP 0.91 (RabbitMQ), AMQP 1, Redis (streams, list, pubsub, hashes), MongoDB, SQL (MySQL, PostgreSQL, Clickhouse, MSSQL), Stdin/Stdout, TCP UDP, sockets and ZMQ4.

1、docker安裝

具體使用方式可以參見該 文檔

有關(guān)如何配置更高級(jí)的流處理概念(例如流連接、擴(kuò)充工作流等)的指導(dǎo),請(qǐng)查看 說明書部分。

有關(guān)在 Go 中構(gòu)建您自己的自定義插件的指導(dǎo),請(qǐng)查看 公共 API。

使用AggregationOptions作磁盤緩存,mongo版本為3.6.4,outputmode過時(shí),請(qǐng)問這個(gè)如何解決?

mongo聚合的java實(shí)現(xiàn),mongo API提供兩種的實(shí)現(xiàn)方式:

1.基于mongotemplate提供的聚合接口:aggregate(arg1,arg2....)等不同參數(shù)的方法,讀者可以按需調(diào)用;特點(diǎn)是該API封裝了mongo底層的聚合操作符,比如$match,$project等,暴露出來的對(duì)應(yīng)為project()、match()等接口;所以這種方法更適合初學(xué)者使用;使用該接口不會(huì)出現(xiàn)我們標(biāo)題說的那個(gè)錯(cuò)誤;

2.基于比較底層提供的DBCollection提供的aggregate接口(arg1,arg2....);該方法要求對(duì)mongo的nosql比較熟悉,因?yàn)樵摻涌谌雲(yún)⑹荄BObject,所以需要我們自己寫mongo的聚合操作符:$match等操作符,所以要求比較高;和我們這里相關(guān)臉的問題是,該接口內(nèi)部調(diào)用mongo底層的數(shù)據(jù)默認(rèn)的輸出格式是INLINE,所以會(huì)出現(xiàn)我們標(biāo)題的那個(gè)錯(cuò)誤;后面會(huì)分析;

新聞標(biāo)題:go語(yǔ)言mongoapi go語(yǔ)言和python哪個(gè)好
本文URL:http://muchs.cn/article28/dosdicp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、全網(wǎng)營(yíng)銷推廣、網(wǎng)站收錄、關(guān)鍵詞優(yōu)化、自適應(yīng)網(wǎng)站、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(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í)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)