使用PM2和Nodejs在多个进程之间共享的单个用户列表

时间:2017-02-13 05:18:23

标签: javascript node.js pm2

在多个进程之间共享一个用户列表的最佳方法是什么?使用PM2启动流程。

进程可以访问列表,以便添加,删除和检查列表中是否存在用户。

3 个答案:

答案 0 :(得分:2)

最简单的方法是使用redis(或memocache,甚至是mongodb)来存储这些用户列表。

或者你必须在你的情况下处理非常复杂的IPC,因为pm2使用基于child_process的节点cluter。

答案 1 :(得分:1)

您可以使用像Redis这样的内存数据存储。

Redis作为单独的进程运行,并在TCP端口上提供请求(默认为6379)。 Redis是一个键值数据存储,可供所有节点进程使用。

以下是如何做到的:

  1. 列表项
  2. 安装redis。 (https://redis.io/
  3. 安装redis的节点客户端:
  4.   

    npm install --save redis

    1. 现在,您可以使用redis存储应用程序状态数据并在整个进程中共享它。
    2. 请参阅this链接以获取代码示例。

答案 2 :(得分:0)

我刚刚使用Redis为最多1200个实例的大型Web爬网程序编写了一个作业跟踪记录器。

好!开始吧!

首先,您需要对其进行定义:

const redis = require("redis");
const client_redis = redis.createClient({
  retry_strategy: function(options) {
    if (options.error && options.error.code === "ECONNREFUSED") {
      // End reconnecting on a specific error and flush all commands with
      // a individual error
      return new Error("The server refused the connection");
    }
    if (options.total_retry_time > 1000 * 60 * 60) {
      // End reconnecting after a specific timeout and flush all commands
      // with a individual error
      return new Error("Retry time exhausted");
    }
    if (options.attempt > 10) {
      // End reconnecting with built in error
      return undefined;
    }
    // reconnect after
    return Math.min(options.attempt * 100, 3000);
  },
});

此功能用于更新和创建日志。

function create_and_update_log(productName2, url2, proc, msg) {
    var data_value = {
        id: 'BESTBUY::DATA_LOG::'+md5(productName2 + url2),
        totalrv: 'WAIT',
        product: productName2,
        url: url2,
        process: proc,
        task: msg,
        timestamp: moment().format('DD/MM/YYYY HH:mm:ss')
    };

    client_redis.set('BESTBUY::DATA_LOG::'+md5(productName2 + url2), JSON.stringify(data_value));
}

此功能可查询所有数据

async function get_log_redis() {
    return new Promise(function(resolve, reject) {
        try {
            var logger_data = {
                logger: []
            };
            client_redis.multi()
                .keys('BESTBUY::DATA_LOG::*', function(err, replies) {
                    replies.forEach(function(reply, index) {
                        client_redis.get(reply, function(err, data) {
                            if (!data.includes("Total reviews left: 0")) {
                                logger_data.logger.push(JSON.parse(data));
                            }

                            if (index == replies.length - 1) {
                                resolve(logger_data);
                            }
                        });
                    });

                })
                .exec(function(err, replies) {});
        } catch (err) {
            console.log(err);
        }
    });
}

记住要替换:

BESTBUY::DATA_LOG::

...以及要定义的内容。

最后是如何获取属于我的键名的所有日志,以“ BESTBUY :: DATA_LOG ::”开头

            var log_obj_data = "";
            (async () => {
                var log_obj_data = await get_log_redis();

                response.writeHead(200, {
                    "Content-Type": "application/json"
                });
                response.end(JSON.stringify(log_obj_data));
            })();