如何在CDN(例如Cloudflare的CDN)之上实现请求计费?

问题描述 投票:0回答:1

Cloudflare R2 是一种类似于 AWS S3 的 Blob 托管服务。如果您添加自定义域,它会使用 CDN我可能会使用 Cloudflare R2,但如果这是跨 CDN(如 s3 等)的一般问题/解决方案,则这个问题不需要与此相关。

假设我使用 R2 和可能的 CDN 构建了一个应用程序,其中托管一堆公共域 PDF 或书籍甚至图像或其他内容。是否有可能围绕 Cloudflare R2/CDN 构建一个系统,按请求数量向用户收费(例如 100 万个请求,价格为 5 美元)。或者可能按请求+下载 GB 收费?为了简单起见,假设只获取数据,不保存。

我的第一个想法是通过 Express.js 应用程序等应用程序传输图像/PDF/文件,并在那里进行跟踪/检查。我的意思是,应用程序将检查用户是否超出了他们的计划限制,或者以其他方式增加请求计数器和 GB 跟踪器数量。但我认为这会消除 CDN 的好处! (CDN 的确切架构及其内部工作原理目前我还不清楚,但不知何故,它把事情置于“边缘”并更快地将其提供给客户,而使其通过应用程序将消除这种好处)。

那么有没有办法以某种方式跟踪 Cloudflare 系统中的请求/下载量?也许您可以在每次请求文件时获取事件挂钩,然后 ping 应用程序以便跟踪它。但您需要的不仅仅是这些,如果请求达到限制,您需要停止请求,因此您需要连接到 Cloudflare 的 CDN 系统,并针对您的应用程序运行一些与 CDN 关联的数据库查询代码。我怀疑这可能。

那么有什么方法可以实现这一点,还是不可能呢?

cloudflare cdn
1个回答
0
投票

看来 Cloudflare Workers 可以在 R2 级别挂钩,然后您可以在那里添加授权逻辑。

export default {
  async fetch(request, env) {
    const url = new URL(request.url);
    const key = url.pathname.slice(1);

    switch (request.method) {
      case 'PUT':
        await env.MY_BUCKET.put(key, request.body);
        return new Response(`Put ${key} successfully!`);
      case 'GET':
        const object = await env.MY_BUCKET.get(key);

        if (object === null) {
          return new Response('Object Not Found', { status: 404 });
        }

        const headers = new Headers();
        object.writeHttpMetadata(headers);
        headers.set('etag', object.httpEtag);

        return new Response(object.body, {
          headers,
        });
      case 'DELETE':
        await env.MY_BUCKET.delete(key);
        return new Response('Deleted!');

      default:
        return new Response('Method Not Allowed', {
          status: 405,
          headers: {
            Allow: 'PUT, GET, DELETE',
          },
        });
    }
  },
};

注意,如果您想使用外部节点模块,您需要使用 Webpack 或 Rollup 等工具将它们与工作脚本捆绑在一起。这会将依赖项打包到与 Workers 运行时兼容的单个 JavaScript 文件中。

© www.soinside.com 2019 - 2024. All rights reserved.