前段時間在golang-China讀到這個貼:
創(chuàng)新互聯(lián)建站主要為客戶提供服務項目涵蓋了網(wǎng)頁視覺設計、VI標志設計、營銷網(wǎng)站、網(wǎng)站程序開發(fā)、HTML5響應式成都網(wǎng)站建設、移動網(wǎng)站建設、微商城、網(wǎng)站托管及網(wǎng)頁維護、WEB系統(tǒng)開發(fā)、域名注冊、國內(nèi)外服務器租用、視頻、平面設計、SEO優(yōu)化排名。設計、前端、后端三個建站步驟的完善服務體系。一人跟蹤測試的建站服務標準。已經(jīng)為木屋行業(yè)客戶提供了網(wǎng)站營銷推廣服務。
個人覺得golang十分適合進行網(wǎng)游服務器端開發(fā),寫下這篇文章總結(jié)一下。
從網(wǎng)游的角度看:
要成功的運營一款網(wǎng)游,很大程度上依賴于玩家自發(fā)形成的社區(qū)。只有玩家自發(fā)形成一個穩(wěn)定的生態(tài)系統(tǒng),游戲才能持續(xù)下去,避免鬼城的出現(xiàn)。而這就需要多次大量導入用戶,在同時在線用戶量達到某個臨界點的時候,才有可能完成。因此,多人同時在線十分有必要。
再來看網(wǎng)游的常見玩法,除了排行榜這類統(tǒng)計和數(shù)據(jù)匯總的功能外,基本沒有需要大量CPU時間的應用。以前的項目里,即時戰(zhàn)斗產(chǎn)生的各種傷害計算對CPU的消耗也不大。玩家要完成一次操作,需要通過客戶端-服務器端-客戶端這樣一個來回,為了獲得高響應速度,滿足玩家體驗,服務器端的處理也不能占用太多時間。所以,每次請求對應的CPU占用是比較小的。
網(wǎng)游的IO主要分兩個方面,一個是網(wǎng)絡IO,一個是磁盤IO。網(wǎng)絡IO方面,可以分成美術資源的IO和游戲邏輯指令的IO,這里主要分析游戲邏輯的IO。游戲邏輯的IO跟CPU占用的情況相似,每次請求的字節(jié)數(shù)很小,但由于多人同時在線,因此并發(fā)數(shù)相當高。另外,地圖信息的廣播也會帶來比較頻繁的網(wǎng)絡通信。磁盤IO方面,主要是游戲數(shù)據(jù)的保存。采用不同的數(shù)據(jù)庫,會有比較大的區(qū)別。以前的項目里,就經(jīng)歷了從MySQL轉(zhuǎn)向MongoDB這種內(nèi)存數(shù)據(jù)庫的過程,磁盤IO不再是瓶頸??傮w來說,還是用內(nèi)存做一級緩沖,避免大量小數(shù)據(jù)塊讀寫的方案。
針對網(wǎng)游的這些特點,golang的語言特性十分適合開發(fā)游戲服務器端。
首先,go語言提供goroutine機制作為原生的并發(fā)機制。每個goroutine所需的內(nèi)存很少,實際應用中可以啟動大量的goroutine對并發(fā)連接進行響應。goroutine與gevent中的greenlet很相像,遇到IO阻塞的時候,調(diào)度器就會自動切換到另一個goroutine執(zhí)行,保證CPU不會因為IO而發(fā)生等待。而goroutine與gevent相比,沒有了python底層的GIL限制,就不需要利用多進程來榨取多核機器的性能了。通過設置最大線程數(shù),可以控制go所啟動的線程,每個線程執(zhí)行一個goroutine,讓CPU滿負載運行。
同時,go語言為goroutine提供了獨到的通信機制channel。channel發(fā)生讀寫的時候,也會掛起當前操作channel的goroutine,是一種同步阻塞通信。這樣既達到了通信的目的,又實現(xiàn)同步,用CSP模型的觀點看,并發(fā)模型就是通過一組進程和進程間的事件觸發(fā)解決任務的。雖然說,主流的編程語言之間,只要是圖靈完備的,他們就都能實現(xiàn)相同的功能。但go語言提供的這種協(xié)程間通信機制,十分優(yōu)雅地揭示了協(xié)程通信的本質(zhì),避免了以往鎖的顯式使用帶給程序員的心理負擔,確是一大優(yōu)勢。進行網(wǎng)游開發(fā)的程序員,可以將游戲邏輯按照單線程阻塞式的寫,不需要額外考慮線程調(diào)度的問題,以及線程間數(shù)據(jù)依賴的問題。因為,線程間的channel通信,已經(jīng)表達了線程間的數(shù)據(jù)依賴關系了,而go的調(diào)度器會給予妥善的處理。
另外,go語言提供的gc機制,以及對指針的保護式使用,可以大大減輕程序員的開發(fā)壓力,提高開發(fā)效率。
展望未來,我期待go語言社區(qū)能夠提供更多的goroutine間的隔離機制。個人十分推崇erlang社區(qū)的脆崩哲學,推動應用發(fā)生預期外行為時,盡早崩潰,再fork出新進程處理新的請求。對于協(xié)程機制,需要由程序員保證執(zhí)行的函數(shù)不會發(fā)生死循環(huán),導致線程卡死。如果能夠定制goroutine所執(zhí)行函數(shù)的最大CPU執(zhí)行時間,及所能使用的最大內(nèi)存空間,對于提升系統(tǒng)的魯棒性,大有裨益。
在完成了集群的搭建工作之后,需要做的就是建立一個數(shù)據(jù)庫,建立表,設置分片主鍵來初始化數(shù)據(jù)了!
(1)建立WLB數(shù)據(jù)庫,設置分表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)計,項目地址: 。開源的數(shù)據(jù)統(tǒng)計countly做的很好,但是基礎免費版的功能實在不夠看,因此我就決定用go語言來寫了這個項目,一來可以在實踐中學習go語言,二來也可以開發(fā)功能完整的開源平臺。該項目正在開發(fā)中,歡迎有興趣的gopher一起參與。
數(shù)據(jù)存儲方面使用的是mongodb。由于數(shù)據(jù)統(tǒng)計業(yè)務幾乎不涉及到事務以及嚴格的一致性場景,而且mongodb的自動分片功能可以支撐較大的數(shù)據(jù)量。使用大數(shù)據(jù)的存儲組件的話就太過于重了。因此選用mongodb。
業(yè)務邏輯整體基于事件的發(fā)布訂閱。當收到客戶端請求, frontend 會對請求數(shù)據(jù)進行處理,然后發(fā)布響應的事件。 backend 收到事件后進行統(tǒng)計處理。
后臺展示基于Vue-Admin-Template開發(fā),本人前端能力基本就是依葫蘆畫瓢,希望有前端大神來開發(fā)后臺頁面,項目地址:
目前客戶端API僅有2個。一個是上報 openApp 打開APP時間,一個是上報 usageTime 一次啟動使用時長事件。SDK方面也需要移動端的大神開發(fā),感興趣的大佬可以一起開發(fā)。
下面放一點后臺頁面的效果圖:
GoAnalytics是基于go實現(xiàn)的一個數(shù)據(jù)統(tǒng)計平臺,用于統(tǒng)計移動端的數(shù)據(jù)指標,比如啟動次數(shù)、用戶增長、活躍用戶、留存等指標分析。前端數(shù)據(jù)展示項目是 goanalytics-web 。目前正在積極開發(fā)中,歡迎提交新的需求和pull request。
Go版本需要支持module,本地開發(fā)測試
cmd/goanalytics_kafka 和 goanalytics_rmq 是分別基于 kafka 和 rocketmq 的發(fā)布訂閱功能做的數(shù)據(jù)發(fā)布
和訂閱處理,橫向擴展能力比 local 高。另外由于 rocketmq 還沒有原生基于 go 的客戶端(原生客戶端正在開發(fā)中
2.0.0 road map ),可能會存在問題。
項目結(jié)構(gòu)
├── README.md
├── api
│ ├── authentication 用戶認證、管理API
│ ├── middlewares GIN 中間件
│ └── router API route
├── cmd
│ ├── account 生成admin賬號命令
│ ├── analytic_local 不依賴消息系統(tǒng)的goanalytics
│ ├── goanalytics_kafka 基于kafak的goanalytics
│ ├── goanalytics_rmq 基于rocketmq的goanalytics
│ └── test_data 生成測試數(shù)據(jù)命令
├── common
│ └── data.go
├── conf 配置
│ └── conf.go
├── event
│ ├── codec 數(shù)據(jù)編解碼
│ └── pubsub 消息發(fā)布訂閱
├── go.mod
├── go.sum
├── metric 所有的統(tǒng)計指標在這里實現(xiàn)
│ ├── init.go
│ └── user 用戶相關指標的實現(xiàn)
├── schedule
│ └── schedule.go 定時任務調(diào)度
├── storage 存儲模塊
│ ├── counter.go 計數(shù)器接口
│ ├── data.go
│ └── mongodb 基于mongodb實現(xiàn)的存儲及計數(shù)器
└── utils
├── date.go
├── date_test.go
├── errors.go
└── key.go
這個似乎不是那么容易解答的,首先你要把數(shù)據(jù)從mongodb查出來,你要確保已經(jīng)安裝了go語言的mongodb驅(qū)動。然后對查出來的數(shù)據(jù)進行解析,查出來的數(shù)據(jù)是類似json的數(shù)據(jù),這個解析代碼需要相關的庫或者你自己寫的。然后再把數(shù)據(jù)相應的插入mysql里,這里你也要安裝go語言的mysql驅(qū)動和odbc
近期正在探索前端、后端、系統(tǒng)端各類常用組件與工具,對其一些常見的組件進行再次整理一下,形成標準化組件專題,后續(xù)該專題將包含各類語言中的一些常用組件。歡迎大家進行持續(xù)關注。
本節(jié)我們分享的是基于Golang實現(xiàn)的高性能和彈性的流處理器 benthos ,它能夠以各種代理模式連接各種 源 和 接收器,并對有效負載執(zhí)行 水合、濃縮、轉(zhuǎn)換和過濾 。
它帶有 強大的映射語言 ,易于部署和監(jiān)控,并且可以作為靜態(tài)二進制文件、docker 映像或 無服務器函數(shù) 放入您的管道,使其成為云原生。
Benthos 是完全聲明性的,流管道在單個配置文件中定義,允許您指定連接器和處理階段列表:
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安裝
具體使用方式可以參見該 文檔
有關如何配置更高級的流處理概念(例如流連接、擴充工作流等)的指導,請查看 說明書部分。
有關在 Go 中構(gòu)建您自己的自定義插件的指導,請查看 公共 API。
mongo聚合的java實現(xiàn),mongo API提供兩種的實現(xiàn)方式:
1.基于mongotemplate提供的聚合接口:aggregate(arg1,arg2....)等不同參數(shù)的方法,讀者可以按需調(diào)用;特點是該API封裝了mongo底層的聚合操作符,比如$match,$project等,暴露出來的對應為project()、match()等接口;所以這種方法更適合初學者使用;使用該接口不會出現(xiàn)我們標題說的那個錯誤;
2.基于比較底層提供的DBCollection提供的aggregate接口(arg1,arg2....);該方法要求對mongo的nosql比較熟悉,因為該接口入?yún)⑹荄BObject,所以需要我們自己寫mongo的聚合操作符:$match等操作符,所以要求比較高;和我們這里相關臉的問題是,該接口內(nèi)部調(diào)用mongo底層的數(shù)據(jù)默認的輸出格式是INLINE,所以會出現(xiàn)我們標題的那個錯誤;后面會分析;
新聞標題:go語言mongoapi go語言和python哪個好
本文URL:http://sd-ha.com/article28/dosdicp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供建站公司、全網(wǎng)營銷推廣、網(wǎng)站收錄、關鍵詞優(yōu)化、自適應網(wǎng)站、網(wǎng)站內(nèi)鏈
聲明:本網(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)