出站请求缓存服务

时间:2019-10-02 16:32:40

标签: proxy architecture microservices http-proxy

我的应用程序中有各种服务,这些服务向Web发出外部请求以刮取某些数据,如Service A向imdb.com/query发出请求,而Service B向reddit.com/query发出请求。我想在这些服务和网络之间为这些外发请求添加服务,以便

  • 服务可以使用可配置的缓存周期来缓存响应。

  • 服务是可检查的,它可以记录请求,响应时间和与请求相关的各种元数据,可能还带有选择缓存后端的选项(在内存db,rdbms,文件中?)

  • 服务不应关心请求的模式,除非它们是出站http / https请求,(客户端接口不应更改,除了它正在发送请求的目标外)

我可以集中缓存,并以此方式记录日志

尽管在我看来这是非常普遍的情况,但搜索后找不到任何有用的东西。 (我原本以为使用转发代理,但是如果我错了,它们就很难设置和扩展-告诉我)。不确定这种情况是否有更好的用语(请参见标题:))

在某个地方可以满足这些需求的工具,saas和OSS吗?也许我是从完全错误的角度考虑问题?

2 个答案:

答案 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);
                    });
                }
            });
        }
    });
};