国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

Gateway/Workman模式下的消息"插隊"情況

wytj0304

我使用Gateway/worker模式搭建了一個應(yīng)用.其中g(shù)atway->count=4,worker->count=1.在實際使用中發(fā)現(xiàn),在極少的情況下會發(fā)生消息(message)插隊的情況.即clientA發(fā)送給服務(wù)器數(shù)據(jù)123456789,同時clientB發(fā)送給服務(wù)器987654321.但是服務(wù)器收到的數(shù)據(jù)是123459876543216789,即clientB的數(shù)據(jù)包插入在clientA數(shù)據(jù)包內(nèi).導(dǎo)致解析出錯.
請問下此情況是不是跟gateway非阻塞模式有關(guān)?
如果我將gateway->count調(diào)整至1是不是可以解決這個問題?
另外,如果gateway非阻塞模型在多進程高并發(fā)數(shù)據(jù)通訊的情況下會有消息插隊問題,怎樣才能有一個相對完備的方案?
謝謝!

5278 8 0
8個回答

wytj0304

gateway使用的tcp協(xié)議,socket數(shù)據(jù)"粘包"我已經(jīng)通過程序處理,但是這種插隊問題感覺無法通過程序代碼解決

  • 暫無評論
walkor 打賞

不會出現(xiàn)插隊
gateway不能用tcp,使用現(xiàn)有協(xié)議或者參考手冊寫一個協(xié)議,否則會粘包,導(dǎo)致數(shù)據(jù)連在一起

  • 暫無評論
wytj0304

我在event.php中的onMessage函數(shù)里面每個$message記錄了下來,之前所說的數(shù)據(jù)包"插隊"問題的場景是這樣的:
有兩個客戶端同時向服務(wù)器不停的發(fā)送數(shù)據(jù),架設(shè)兩個客戶端在一段時間內(nèi)都向服務(wù)器發(fā)送了3個數(shù)據(jù)包.在一些情況下客戶端A會將數(shù)據(jù)以2.5+0.5的方式發(fā)送,即$message中現(xiàn)接受到A的2.5個數(shù)據(jù)包,然后接收0.5個剩余數(shù)據(jù)包.但同時客戶端B向服務(wù)器連續(xù)發(fā)送了3個數(shù)據(jù)包(按照1+1+1)方式.
最終在onMessage函數(shù)里面每個$message的順序為: 2.5(A) 1(B) 1(B) 1(B) 0.5(A).就是我說的插隊現(xiàn)象.

  • 暫無評論
wytj0304

原先我在每個數(shù)據(jù)包頭中增加了長度來處理粘包問題.現(xiàn)在想來那只是針對單個sock_id才有用,對于現(xiàn)在多個客戶端同時推送服務(wù)器信息的情景.可能需要對每個sock_id設(shè)置獨立的緩沖區(qū).
假如我按照你的建議寫一個協(xié)議,是否可以解決我說的問題?

  • 暫無評論
wytj0304

補充一下,不知道我表達的是否明確
架設(shè)網(wǎng)關(guān)收到的數(shù)據(jù)包順序: 2.5(A) 1(B) 1(B) 1(B) 0.5(A)
使用多連接共用緩沖區(qū)在解析第三個數(shù)據(jù)報文時,會將A客戶端的0.5個報文合并到B客戶端報文上,導(dǎo)致整體出錯.
使用自定義協(xié)議的話,能否避免這個問題?

  • 暫無評論
walkor 打賞

去參考手冊搞個協(xié)議就好了
或者直接用workerman的Text協(xié)議
協(xié)議格式為 數(shù)據(jù)包+換行符

  • 暫無評論
wytj0304

問題已經(jīng)解決,重新寫了一個協(xié)議.
原來對gateway/worker的運行方式理解有誤導(dǎo)致,多謝指導(dǎo)哈

  • 暫無評論
walkor 打賞

不客氣

  • 暫無評論
年代過于久遠,無法發(fā)表回答
??