我的应用程序中有各种服务,这些服务向Web发出外部请求以刮取某些数据,如Service A向imdb.com/query发出请求,而Service B向reddit.com/query发出请求。我想在这些服务和网络之间为这些外发请求添加服务,以便
服务可以使用可配置的缓存周期来缓存响应。
服务是可检查的,它可以记录请求,响应时间和与请求相关的各种元数据,可能还带有选择缓存后端的选项(在内存db,rdbms,文件中?)
服务不应关心请求的模式,除非它们是出站http / https请求,(客户端接口不应更改,除了它正在发送请求的目标外)
我可以集中缓存,并以此方式记录日志
尽管在我看来这是非常普遍的情况,但搜索后找不到任何有用的东西。 (我原本以为使用转发代理,但是如果我错了,它们就很难设置和扩展-告诉我)。不确定这种情况是否有更好的用语(请参见标题:))
在某个地方可以满足这些需求的工具,saas和OSS吗?也许我是从完全错误的角度考虑问题?
答案 0 :(得分:0)
This answer推荐了一种名为Squid的工具:
Squid是Web的缓存代理,支持HTTP,HTTPS,FTP等。通过缓存和重用经常请求的网页,它减少了带宽并缩短了响应时间。 Squid具有广泛的访问控制,是一个出色的服务器加速器。它可以在大多数可用的操作系统(包括Windows)上运行,并且已获得GNU GPL的许可。
cntlm似乎是另一种选择(source)。另请参阅this answer,以获取各种HTTP代理工具的详细列表。
这两个都满足您的特定用例吗?
答案 1 :(得分:0)
不确定为什么要为此提供服务。如果将数据与Redis链接,则几乎可以编写自己的缓存服务。
Redis是一个内存数据库,具有出色的响应时间。唯一的事情是,您需要一个永久存储相同数据的存储库,以防万一,Redis崩溃并且您仍然需要访问数据。
提供了一个示例nodeJS,希望对您有所帮助。是的,如果需要,您还可以在此处配置时间段。
module.exports.findURlDataCached = function (db, redis, url, callback) {
redis.get(title, function (err, reply) {
if (err) callback(null);
else if (reply) //Url and response exists in cache
callback(JSON.parse(reply));
else {
//Url doesn't exist in cache - we need to query the main database
db.collection('text').findOne({
title: title
}, function (err, doc) {
if (err || !doc) callback(null);
else {\\Url found in database, save to cache and
return to client
redis.set(url, JSON.stringify(doc), function () {
// Sets the expiry time by 24 hours from current time
redis.expireat(url, parseInt((+new Date)/1000) + 86400);
callback(doc);
});
}
});
}
});
};