为Redis端点使用Node.js全局变量

时间:2015-02-20 00:04:41

标签: node.js redis amazon-elasticache

我们即将开始在弹性缓存中使用redis。我可以使用我的端点保存配置文件,这很好。但是如果我们决定添加另一个副本,并且我们使用弹性beanstalk,则意味着在所有服务器上重建应用程序只是为了添加它。我可以将它们放在S3上的文件中,甚至可以查询API,(那里是一个方便的调用来获取有关包含端点的弹性缓存集群的信息。)

但是每次我想建立与redis的连接时我都不想这样做。在这种情况下,我正在考虑设置一个包含端点的全局变量,带有时间戳,并且每小时或半小时检索一次信息。

我知道全局变量被一些人认为是令人讨厌的,但我想不出有任何其他方法可以做到这一点。我可以将结果保存在redis本身,但我不想在每次打电话给redis之前打红色。

对此的可行性或其他实现相同目的的方法有何看法?我想自动发现任何新的redis / elastic cache端点。

1 个答案:

答案 0 :(得分:0)

因此,我使用AWS SDK和setinterval编写了一个非常简单的函数。

aws_config = require("./config/aws_config.json");
AWS = require('aws-sdk');
AWS.config.update(aws_config);

var elasticache = new AWS.ElastiCache();

var elastic_cache_endpoints = {};

redis_end_points = {};

check_redis_endpoints();

setInterval(function ()
{
    check_redis_endpoints();
}, 10000);

function check_redis_endpoints()
{
    elasticache.describeReplicationGroups(
    {
        ReplicationGroupId:'test-dev'
    },
    function(err, data)
    {
        redis_end_points.write_end_point = data["ReplicationGroups"][0]["NodeGroups"][0]["PrimaryEndpoint"]["Address"];

        var replication_groups = data["ReplicationGroups"][0]["NodeGroups"][0]["NodeGroupMembers"];

        var end_points = [];

        Object.keys(replication_groups).forEach(function(element)
        {
            var read_end_point = replication_groups[element]["ReadEndpoint"]["Address"];
            end_points.push(read_end_point);
        });

        if (end_points.length > 0)
                redis_end_points.read_end_points = end_points;
    });
}

这导致一个漂亮的结构每x秒刷新一次。

{
    write_end_point: 'test-dev.ababababababa.cache.amazonaws.com',
    read_end_points: [ 'test-dev-001.ababababab.cache.amazonaws.com', 'test-dev-002.ababababb.cache.amazonaws.com' ]
}