- 論壇徽章:
- 36
|
本帖最后由 cokeboL 于 2013-09-27 10:35 編輯
1. 這種記錄的數(shù)據(jù)是要消耗內(nèi)存的,包量越大消耗也越大(當(dāng)然內(nèi)存對現(xiàn)在服務(wù)器來講不是大問題,但能減少消耗肯定最好了)
每臺機器應(yīng)該有自己能轉(zhuǎn)發(fā)的列表,以及上游下游的區(qū)分比如
a的
transmit_map =
{
//key value attr
'b', ip + port, pre/behind
}
b的
transmit_map =
{
//key value attr
'a', ip + port, pre/behind
'c', ip + port, pre/behind
}
依此推
a發(fā)一個請求的時候,請求包里包含一個請求序列棧
包頭里包含一個請求序列棧長,request_stack_len
接收請求時,如果本機不是最后該請求所需到達(dá)的最后一臺機器,就把本機id入棧,
把request_stack_len ++,并且轉(zhuǎn)發(fā)給下一臺機器
如果是最后一個機器,比如d,作為終結(jié)者,根據(jù)請求序列棧,把所查詢的數(shù)據(jù)返回給上家
也就是請求的時候只發(fā)請求命令和請求序列,從最后一臺機器開始返回數(shù)據(jù),前面每臺把自己的
數(shù)據(jù)加到其中,比如
a發(fā)請求給b:
[
... ,
request_stack_len = 1,
'a'
]
b收到繼續(xù)轉(zhuǎn)發(fā)給c
[
... ,
request_stack_len = 2,
'a',
'b'
]
c收到繼續(xù)轉(zhuǎn)發(fā)給d
[
... ,
request_stack_len = 3,
'a',
'b',
'c'
]
d收到后因為自己是最后一臺,就取出序列棧尾c,并返回數(shù)據(jù)給c
[
... ,
return_stack_len = 2,
'a',
'b',
data_len = n,
[data]
]
c收到后把自己的數(shù)據(jù)加到里面返回給b
[
... ,
return_stack_len = 1,
'a',
data_len = n,
[data] //數(shù)據(jù)加到里面
]
|
|