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

關于Channel Server 做隊列后,內(nèi)存一直增長的問題

zgh419566

問題描述

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

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

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

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

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

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

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

至今沒有找到原因,麻煩各位幫解答一下。
此外:我只用channel來做通訊和任務輪詢,丟一些數(shù)據(jù)可以接受。
我確認生產(chǎn)者發(fā)的內(nè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);

消費者:
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

867 1 0
1個回答

zgh419566

再補充問兩個問題:
1、否因為有一些數(shù)據(jù)在內(nèi)存中,沒有被消費,所以導致內(nèi)存增長?
2、能否將channel設置為沒有匹配到消費者自動丟棄?

  • walkor 2023-04-03

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

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

  • zgh419566 2023-04-04

    收到,感謝

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

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

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

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