- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对node.js和socket.io都很陌生,但我正在尝试构建一个简单的服务来监听Redis通知(由PHP应用程序提供),并将它们广播给当前登录、连接的任何用户到 socket.io 房间,例如“站点名称:用户:用户 ID”。
我可以正常工作,但是 Node 应用程序的内存占用很快变得越来越大,很快就从 100mb 增加到 200+mb,大约有 100 个用户在线并积极浏览,我想知道我是否设置了一些东西这里错了。
PM2 正在处理 Node 应用程序,并且 nginx 设置为反向代理。
服务器端:
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var redis = require('redis');
var redisClient = redis.createClient();
var allClients = [];
server.listen(8890);
io.sockets.on('connection', function (socket) {
allClients.push(socket);
socket.on('subscribe', function(data) {
console.log('Joining room', data.room);
socket.join(data.room);
redisClient.subscribe(data.room);
})
socket.on('disconnect', function() {
console.log('Disconnect');
var i = allClients.indexOf(socket);
delete allClients[i];
});
});
// Watch for connection errors and log
redisClient.on('error', function (err) {
console.log('Error event - ' + redisClient.host + ':' + redisClient.port + ' - ' + err);
});
redisClient.on('message', function(room, message) {
console.log('New message: ' + message + '. In room: ' + room);
io.sockets.in(room).emit('message', message);
});
客户端:
// connect to socket
socket = io.connect('http://localhost:8890');
// subscribe to user's room once connected
socket.on('connect', function(data){
socket.emit('subscribe', { room: site_name + ':user:' + user_id });
});
// show messages from user's "room" via redis notifications
socket.on('message', function (response) {
var json = new Hash(JSON.decode(response, true) || {});
roar.alert(json.title, json.message, { link: json.link });
});
看起来这应该是一个非常精简的应用程序,不是吗?简单的 Node.js 应用程序的正常内存占用是多少?
服务器以 41mb 启动,但即使没有人连接到它,内存也会缓慢增加,大约每分钟 1mb。一旦我开始连接用户,它就会迅速膨胀到 200+mb,直到我将其杀死。
我不清楚如何在用户连接和断开连接时最好地处理 redisClient 和套接字连接,我认为这可能是问题所在。但看到它在闲置时爬行令人不安。
非常感谢任何帮助。
最佳答案
我有一个类似的设置,尽管它尚未发布并且尚未进行压力测试...但这里有一个想法给您:
使用redis模块进行socketio(是否比redisClient更好)。它使用不同的客户端进行发布和订阅。子客户端使用 detector_buffers。
var redisModule = require('socket.io-redis');
var redisAdapter= redisModule({
host: redisClient.options.host
, port: redisClient.options.port
, pubClient: redisClient
//, subClient: ... separate client that uses detect_buffers
});
io.adapter(redisAdapter);
然后订阅/断开连接看起来像这样:
socket.on('subscribe', function(room) {
socket.join(room);
});
socket.on('disconnect', function() {
console.log('user disconnected');
});
我也多次读到,在某一点上,socketio 并不是最好的,而是使用 sockjs。不知道情况是否仍然如此。
而且......自从我意识到已经过去两个多月了。您是否找到了可以减少内存占用的方法?
关于Node.js + Socket.io + Redis 应用程序通过 PM2,内存占用较大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33085303/
我正在通过 PHP 将 .csv 中的两行插入到表中。 我还会跟踪任何错误,如果发生错误,我不会提交事务。插入表后,我检索结果行的 ID(全部在一个事务中提交),并且 csv 的第一行对应于第二个 I
一个应用程序托管一个具有三个接口(interface)的 Web 服务,用于三个单独且独立的操作,所有这些操作都在应用程序的不同组件中实现,彼此独立,例如在不同的包等中,所以他们对彼此了解不多,只共享
我希望在单击特定表格数据单元格时同时选中单选按钮和单选按钮单击事件。我已经使用以下方法实现了这一点: $(document).ready(function() { $("td").click(
JSFiddle:https://jsfiddle.net/oyp1zxaq/ 本质上,我只是想在较大的 div 中放置四个具有定义宽度的较小 div,但我希望它们在其中间隔开。 我想知道是否有一种方
我在一个布局中有两个 View 。我将分别称它们为 View A 和 View B。 ┌──────┐ │┌─┐┌─┐│ ││A││B││ │└─┘└─┘│ └──────┘ 父布局(包括View A
我是一名优秀的程序员,十分优秀!