为 Redis 端点使用 Node.js 个全局变量
Using Node.js global variables for Redis Endpoints
我们即将开始在弹性缓存中使用redis。我可以用我的端点保存一个配置文件,这很好。但是,如果我们决定添加另一个副本,并且我们正在使用弹性 beantalk,这意味着在所有服务器上重建应用程序只是为了添加它。我可以将它们放在 S3 上的一个文件中,甚至查询 API,(有一个方便的调用来获取有关包含端点的弹性缓存集群的信息。)
但我不想每次都想建立与redis的连接时都这样做。在这种情况下,我正在考虑设置一个包含端点的全局变量,带有时间戳,并每小时或半小时检索一次信息。
我知道有些人认为全局变量令人厌恶,但我想不出任何其他方法来做到这一点。我可以将结果保存在redis本身,但我真的不想在每次调用redis之前先点击redis。
对这种方法的可行性有什么想法,或者有其他方法可以达到同样的目的吗?我想自动发现任何新的 redis/elastic 缓存端点。
因此,我使用 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' ]
}
我们即将开始在弹性缓存中使用redis。我可以用我的端点保存一个配置文件,这很好。但是,如果我们决定添加另一个副本,并且我们正在使用弹性 beantalk,这意味着在所有服务器上重建应用程序只是为了添加它。我可以将它们放在 S3 上的一个文件中,甚至查询 API,(有一个方便的调用来获取有关包含端点的弹性缓存集群的信息。)
但我不想每次都想建立与redis的连接时都这样做。在这种情况下,我正在考虑设置一个包含端点的全局变量,带有时间戳,并每小时或半小时检索一次信息。
我知道有些人认为全局变量令人厌恶,但我想不出任何其他方法来做到这一点。我可以将结果保存在redis本身,但我真的不想在每次调用redis之前先点击redis。
对这种方法的可行性有什么想法,或者有其他方法可以达到同样的目的吗?我想自动发现任何新的 redis/elastic 缓存端点。
因此,我使用 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' ]
}