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

關(guān)于Channel Server 做隊(duì)列后,內(nèi)存一直增長(zhǎng)的問題

zgh419566

問題描述

以前我的業(yè)務(wù)邏輯一直寫在基于workerman的tcp服務(wù)端程序里面,如果需要修改業(yè)務(wù)邏輯,就會(huì)導(dǎo)致整個(gè)程序需要重啟,會(huì)導(dǎo)致成百上千的機(jī)器TCP需要重連。

自從看了gateway的源碼以后,深受里將gateway和business服務(wù)分開的啟發(fā)

因此我也想將tcp服務(wù)和業(yè)務(wù)邏輯分開,于是想到了使用channel做跳轉(zhuǎn)(類似于gateway的注冊(cè)中心register)

之前我使用了Channel做進(jìn)程間通信,一直用的事件機(jī)制(publish模式),對(duì)方使用on進(jìn)行掛鉤回調(diào)
但這會(huì)帶來一個(gè)問題:為避免消息復(fù)雜,只能給channel的event名稱使用進(jìn)程名字分開,不然所有后端進(jìn)程都會(huì)收到同樣的事件通知。

于是想到了使用channel的消息隊(duì)列模式,即:前端的tcp服務(wù)用來做報(bào)文解析和加密解密,通過channel將指令傳給后端的多臺(tái)服務(wù)器去做業(yè)務(wù)邏輯處理。

這樣的好處是:
1、不同的業(yè)務(wù)邏輯可以發(fā)給不同的后端服務(wù)器群處理,用queue名稱進(jìn)行區(qū)分;
2、當(dāng)某臺(tái)后端掛掉時(shí)可以做到不影響業(yè)務(wù)邏輯,對(duì)用戶無感;
3、可以實(shí)現(xiàn)多臺(tái)服務(wù)器共同監(jiān)聽某個(gè)隊(duì)列,做任務(wù)的負(fù)載分擔(dān)。

初期,所有的前端事件,都通過同一個(gè)隊(duì)列往后端扔,后端多個(gè)進(jìn)程也共同監(jiān)聽同一隊(duì)列,但遇到一個(gè)問題:
channel服務(wù)器的內(nèi)存不再像之前那一直保持4M的使用,而是一直在增加

至今沒有找到原因,麻煩各位幫解答一下。
此外:我只用channel來做通訊和任務(wù)輪詢,丟一些數(shù)據(jù)可以接受。
我確認(rèn)生產(chǎn)者發(fā)的內(nèi)容均已被消費(fèi)者消費(fèi)掉。

----------------------------------------------GLOBAL STATUS----------------------------------------------------
Workerman version:4.0.30 PHP version:7.4.28
start time:2023-04-03 08:45:32 run 0 days 5 hours
load average: 0.16, 0.12, 0.13 event-loop:\Workerman\Events\Event
1 workers 1 processes
worker_name exit_status exit_count
ChannelServer 0 0
----------------------------------------------PROCESS STATUS---------------------------------------------------
pid memory listening worker_name connections send_fail timers total_request qps status
141714 52M frame://0.0.0.0:12206 ChannelServer 98 0 0 11357962 0 [idle]
----------------------------------------------PROCESS STATUS---------------------------------------------------
Summary 52M - - 98 0 0 11357962 0 [Summary]

程序代碼或配置

<?php
生產(chǎn)者:
Channel\Client::enqueue($event_name , $report_json_data);

消費(fèi)者:
Channel\Client::watch($event_name, function($event_str)use(){
        $event_data = json_decode($event_str , true);
});

重現(xiàn)問題的步驟

操作系統(tǒng)環(huán)境及workerman/webman等具體版本

CentOS7.9
Workerman version:4.0.30
PHP version:7.4.28

908 1 0
1個(gè)回答

zgh419566

再補(bǔ)充問兩個(gè)問題:
1、否因?yàn)橛幸恍?shù)據(jù)在內(nèi)存中,沒有被消費(fèi),所以導(dǎo)致內(nèi)存增長(zhǎng)?
2、能否將channel設(shè)置為沒有匹配到消費(fèi)者自動(dòng)丟棄?

  • walkor 2023-04-03

    1、如果數(shù)據(jù)沒消費(fèi),就會(huì)一直占用內(nèi)存,如果沒消費(fèi)的數(shù)據(jù)越來越多,占用內(nèi)存就越來越大
    2、channel生產(chǎn)和消費(fèi)是其它開發(fā)者提交的功能,不確認(rèn)是否有這個(gè)功能

    另外PHP在運(yùn)行過程中申請(qǐng)的內(nèi)存不一定會(huì)及時(shí)交還給系統(tǒng),而是會(huì)留著復(fù)用提升性能。例如當(dāng)處理一個(gè)大請(qǐng)求或者從存儲(chǔ)中讀取大數(shù)據(jù)后內(nèi)存會(huì)有明顯增長(zhǎng),并不一定是內(nèi)存泄漏

  • zgh419566 2023-04-04

    收到,感謝

    我在channel 1.1.0的基礎(chǔ)上對(duì) publish方法增加了參數(shù),在channel Server.php中增加了publishLoop指令類型,這個(gè)問題已經(jīng)解決。

    支持從眾多訂閱進(jìn)程中順序選擇一個(gè)發(fā)送數(shù)據(jù),實(shí)現(xiàn)類似于rabbitmq那樣的輪詢投遞機(jī)制。

    Channel\Client::publish($event_name, $data_arr , true);

年代過于久遠(yuǎn),無法發(fā)表回答
??