1. 程式人生 > >lotou詳解一:基本概念

lotou詳解一:基本概念

lotou是一個基於golang的支援分散式的輕量級遊戲伺服器框架,主要提供遊戲伺服器叢集的訊息轉發程式碼倉庫
lotou提供了三種不同的訊息傳送方式:
1.Send 用於普通的訊息推送,不需要返回,傳送之後就不再關注
2.Request 非同步非阻塞請求響應模式,request接收一個回撥函式和一個超時時間,當遠端服務通過respond響應或者遠端服務響應超時的時候,回撥函式會被喚醒。
3.Call 同步阻塞請求響應模式,call阻塞當前goroutinue,知道請求超時或者遠端服務響應才返回,返回值為遠端服務響應函式的返回值和一個error。

Service

service指遊戲中的一個服務或者是一個模組,lotou訊息轉發的基本單位為服務,所有訊息都是在服務之間進行轉發。
傳送到服務的訊息被push到service的msgChan裡面,service在啟動的時候開啟一個goroutinue來分發msgChan接收到的訊息,並根據需要啟動一個timer來執行mainloop。
非特殊情況,不要在service的主goroutinue裡面呼叫阻塞式的訊息傳送模式(Call),因為一旦主goroutinue被阻塞,service將無法繼續分發接收到的msg。

Message

lotou中訊息的載體最終是一個Message的結構體,Message包含如下幾個成員

  1. Src message sender
  2. Dst message receiver
  3. Type message type (normal、request、respond、call、ret…)
  4. EncType 目前支援不編碼和gob,其中gob是lotou中實現的一種編碼方式,不是golang自帶的gob package。
  5. Cmd 訊息的名字或者是命令,lotou的使用者可以通過registerHandlerFunc來註冊cmd處理函式,當service接收到對應的訊息的時候,會進行正確的訊息分發
  6. Id 如果message是一個request、call或者是respond、ret的時候,該Id代表請求或者call的ID,或者是respond ret響應的是哪一個id的請求或者call。
  7. Data具體傳送的資料,是一個interface{}的slice,對於gob編碼方式,data的第一個元素就是編碼之後的[]byte。

Node(節點)

lotou支援分散式程式設計,可以將service分佈在多臺電腦上得多個應用中,這裡lotou每一個程序就是lotou中的一個節點。
在所有節點中,會有一個master節點和多個slave節點,所有的slave節點都會和master節點建立連線,並向master發起註冊,master會為每一個slave節點分配一個nodeId。
當lotou處於多節點模式下的時候,message會根據Dst是本地節點還是遠端節點,進行適當的訊息轉發。

Master

對於一個多節點lotou網路,只能存在一個唯一的master 節點,該節點負責為每一個slave節點分配一個唯一的nodeid,並且對不同的節點的訊息進行轉發

Slave

對於一個多節點lotou網路,有N個slave節點,slave節點啟動的時候會先向master節點申請nodeid。

serviceId

lotou為系統中每一個service分配一個唯一的serviceid。為了保證serviceid的唯一性,serviceid由兩部分組成:
nodeid << (64 - 16) | id
其中nodeid佔16為,id佔48位
nodeid是上面提到的由master分配的節點Id
id是每一個節點為service分配的id,其中節點中保證不同的service不會有相同的id

agent服務

lotou中將tcp伺服器中的客戶端連線稱為agent,每一個tcp連線都對應一個agent,agent服務會把從tcp上接收到的資料傳送給其繫結的hostService,同時hostService也可以通過agent向tcp客戶端傳送資料

client服務

lotou中將tcp客戶端稱為client,client把從tcp上收到的資料傳送給其繫結的hostService,同時hostService通過client向tcp伺服器傳送資料

timer

lotou內部實現一個定時器排程邏輯,定時器只針對具有主迴圈的service,如果一個service沒有主迴圈(即啟動的時候沒有設定loopDuration),則無法註冊timer,timer的最小排程週期即為一個loopDuration,單位為毫秒。
如果loopDuration為100,timer的間隔為10,則每一次主迴圈將會呼叫timer的回撥10次,不建議使用比loopDuration小的timer間隔,如果需要更精確的timer,請提高mainLoop的精度。

Module

Module是lotou中service對外的介面,使用者通過實現一個Module的介面,然後通過func StartService(name string, m Module) ServiceID 可以啟動一個service。

Skeleton

skeleton是lotou中對Module的一個預設實現,對lotou的功能進行了一定程度的封裝。

總結

本章主要講解了lotou中使用到的基本概念,下一章將會繼續對lotou訊息分發的講解。

相關推薦

lotou基本概念

lotou是一個基於golang的支援分散式的輕量級遊戲伺服器框架,主要提供遊戲伺服器叢集的訊息轉發程式碼倉庫 lotou提供了三種不同的訊息傳送方式: 1.Send 用於普通的訊息推送,不需要返回,傳送之後就不再關注 2.Request 非同步非阻塞請

Masonry自動佈局基本用法

說到iOS自動佈局,有很多的解決辦法。有的人使用xib/storyboard自動佈局,也有人使用frame來適配。對於前者,筆者並不喜歡,也不支援。對於後者,更是麻煩,到處計算高度、寬度等,千萬大量程式碼的冗餘,對維護和開發的效率都很低。 筆者在這裡介紹純程式碼

應用負載均衡之LVS()基本概念和三種模式

保存 訪問 方式 video big key vhdl cisc vid 網站架構中,負載均衡技術是實現網站架構伸縮性的主要手段之一。所謂"伸縮性",是指可以不斷向集群中添加新的服務器來提升性能、緩解不斷增加的並發用戶訪問壓力。通俗地講,就是一頭牛拉不動時,就用兩頭、三

高可用之KeepAlived()基本概念和配置文件分析

leg bold touch event radius chm present ket temp KeepAlived系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 本文目錄:1. 概述2. VRRP協

python 對象類型數字(上)

結果 dom 運行 精度 升級 方法 函數 般的 代碼 一:python 的數字類型: a)整數和浮點數 b)復數 c)固定精度的十進制數 d)有理分數 e)集合 f)布爾類型 g)無窮的整數精度 h)各種數字內置函數和模塊 二:各種數字類型的詳解   1,數字常量:pyt

python學習筆記()基本概念

單引號 網絡爬蟲 解釋型 g模式 deb 恢復 判斷語句 安裝 bubuko ---恢復內容開始--- 一.python簡介 pyhthon是解釋型語言,python可以用來網絡爬蟲、數據分析、web開發、人工智能、嵌入式、自動化測試、自動化運維等,所有語言中,地方放庫最多

JS - Promise使用1(基本概念、使用優點)

一、promises相關概念 promises 的概念是由 CommonJS 小組的成員在 Promises/A 規範中提出來的。   1,then()方法介紹 根據 Promise/A 規範,promi

P2P技術()NAT——詳細原理、P2P簡介(轉再)

這是一篇介紹NAT技術要點的精華文章,來自華3通訊官方資料庫,文中對NAT技術原理的介紹很全面也很權威,對網路應用的應用層開發人員而言有很高的參考價值。   《P2P技術詳解》系列文章 ➊ 本文是《P2P理論詳解》系列文章中的第2篇,總目錄如下:   ➋

Python並行程式設計()基本概念

  1、執行緒和程序       程序是應用程式的一個執行例項,比如,在桌面上雙擊瀏覽器將會執行一個瀏覽器。執行緒是一個控制流程,可以在程序內與其他活躍的執行緒同時執行。控制流程指的是順序執行一些機器指令。程序可以包含多個執行緒,所以開啟一個瀏覽器,作業系統將建立一個程序,並開始執行這個程序的主執行緒。每一

Kafka學習筆記基本概念

1、Kafka是什麼 Kafka是最初由Linkedin公司開發,是一個分散式、分割槽的、多副本的、多訂閱者,基於zookeeper協調的分散式日誌系統(也可以當做MQ系統),常見可以用於web/nginx日誌、訪問日誌,訊息服務等等,Linkedin於2010年貢獻給了Apache基金會併成為

MongoDB入門基本概念

一.資料庫的分類 目前的資料庫主要分為關係型資料庫和非關係型資料。 關係型資料庫: 通過SQL結構化查詢和儲存語句,最常見的就是Oracle和MySQL 保持資料一致性理論,遵循ACID原理 非關係型資料庫: - Not Only SQL,是對不同於

平衡二叉樹各種演算法紅黑樹

平衡二叉樹(Balanced Binary Tree)具有以下性質:它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。平衡二叉樹的常用演算法有紅黑樹、AVL、Treap、伸展樹、SBT等。最小二叉平衡樹的節點的公式如下 F(n)=

Netty4理解Netty的設計理念NIO

有一套統一的API來處理非同步和同步程式設計模式使用非常靈活簡單但卻強大的執行緒機制業務元件分離方便重用極小的縮減不必要的Memory Copy     Netty開始-理解Netty的設計理念NIONetty開始-理解Netty的設計理念NIO 二、非同步程式設計模式設計      一般來說網路程式設

ES6複習ES5 新增內容

ES5 新增內容 ES6 最近炒得火熱,準備寫一下ES6規範的主要內容。在這之前先複習一下ES5相關的內容。 ES5 總體來說改動很少,最重要的是如下幾個改動: use strict 可以在函式定義的第一行通過一個字串語法把這個函式宣告為 嚴格模式

iOS/OS X記憶體管理()基本概念與原理

在Objective-C的記憶體管理中,其實就是引用計數(reference count)的管理。記憶體管理就是在程式需要時程式設計師分配一段記憶體空間,而當使用完之後將它釋放。如果程式設計師對記憶體資源使用不當,有時不僅會造成記憶體資源浪費,甚至會導致程式crach。我們將會從引用計數和記憶體管理

幾個基本概念“標準差&標準誤差,方差&均方差”

對於從事資料工作的人來說,經常需要用到方差、標準差、均方差等概念,但即使是一個數學專業的畢業生(比如我自己),經常也會被這幾個概念弄得頭暈腦脹,使用的時候也是清楚的少,碰運氣的多。 這裡,我

java ioFile類

File 類:檔案和目錄路徑名的抽象表示。 注意:File 類只能操作檔案的屬性,檔案的內容是不能操作的。   1、File 類的欄位     我們知道,各個平臺之間的路徑分隔符是不一樣的。   ①、對於UNIX平臺,絕對路徑名的字首始終為"/" 。

Flex佈局(基本概念和容器屬性)

前言 算上來快2個月沒寫部落格呢,一是趕專案,二是中途接到一個朋友公司需要幫忙,週末都在TA們公司兼職,然後空下來就快12月初,然後又陸陸續續發生一些大事小事,當然最令人記憶猶新就是借錢。 這個月初由於財務出了點問題,找了幾個朋友借錢,當然也包括自己借過錢的

VRTK外掛鐳射和移動

反過來說Play Space Falling 選項是在玩家頭盔在一個物件上方時會自動傳送到一個物件的頂部,這一點在模擬爬梯子時很有用,不需要使用指標光束定位。如果這個選項關閉,玩家就能在他們所站在的物件的同樣y高度的空中行走(也就是有一部分遊玩區在物件外部)。 (adsbygoog

【原創】Junit4Junit總體介紹

1 package abstractions.domain; 2 3 import static org.hamcrest.Matchers.is; 4 import static org.junit.Assert.assertThat; 5 6