CloudflareワーカーとのRedis@Edge
エッジでのコンピューティングは、近年最もエキサイティングな機能の1つです。 CDNを使用すると、ファイルをユーザーに近づけることができます。エッジコンピューティングを使用すると、アプリケーションをユーザーの近くで実行できます。これは、開発者がグローバルに分散されたパフォーマンスの高いアプリケーションを構築するのに役立ちます。
Cloudflare Workersは、現在この分野の主要製品です。コールドスタートのないサーバーレス処理環境を提供します。 Cloudflareのグローバルネットワークを活用して、アプリケーションのレイテンシーを最小限に抑えます。関数はJavascript、Rust、C、C++で記述できます。
サーバーレス機能(AWS Lambdaなど)と同様に、Cloudflareワーカーはステートレスです。 Cloudflareの調査でわかるように、開発者はEdge関数からデータベースを接続する方法を求めています。残念ながら、ほとんどのデータベースはサーバーレス環境向けに設計されていないため、永続的な接続が必要です。サーバーレスエッジ関数が可能な限り最も簡単で最速の方法でUpstashにアクセスできるようにするために、Redisを介してRESTAPIを開発しました。
Cloudflareには、Edge関数の状態を保存するために使用できる基本的なKeyValueストアがあります。 Upstash Redisは、いくつかの点でCloudflareKVに対して優れています。
- Cloudflare KVは、基本的な取得/設定/削除機能のみを提供します。 Upstashは、はるかに高度な機能(ハッシュ、リスト、SortedSets、範囲、追加、増分など)を構築できるすべてのRedisデータ構造を提供します。
- Cloudflare KVは、Cloudflareエコシステムからアクセスできるように設計されていますが、RedisとREST APIの両方をサポートしているため、どこからでもUpstashRedisにアクセスして利用できます。データをEdgeからRedisにオフロードしてから、任意のRedisクライアントで処理できます。
- Cloudflare KVは、読み取りが多いアプリケーション向けに最適化されています。書き込みが他の場所に複製されるまでに60秒かかる場合があります。 Upstashの書き込みレイテンシはミリ秒単位です。
それでは、CloudflareとRedisの組み合わせの力を紹介する簡単な例を書いてみましょう。
Web分析は、すべてのWebサイト所有者にとって非常に一般的なニーズです。 Google Analyticsは強力ですが、多くの開発者はトラフィックデータをGoogleと共有したり、ユーザーのブラウザにCookieを挿入したりすることを好みません。 WebサイトのトラフィックはCDNを経由するため、Edgeレイヤーでトラフィックを簡単に追跡できます。ここでは、Cloudflareワーカーからのユーザートラフィックの追跡を紹介する非常に簡単な例を実装します。 Cloudflareワーカーのトラフィックをインターセプトし、ユーザーリクエストをUpstashRedisに保存します。次に、リクエストを分析し、選択した日に次の情報を提供する基本的なスタンドアロンアプリケーションを作成します。
- ページビュー
- ユニークな訪問者
- 訪問者数が最も多い上位の国
- 最も訪問されたページ
データベースがない場合は、このガイドに従ってデータベースを作成してください。データベースページで、[REST API]ボタンをクリックし、RESTURLをコピーします。 Cloudflareアカウントをお持ちの場合は、Workers関数を作成することも、アカウントなしでプレイグラウンドを使用することもできます。
:::noteSelectグローバルデータベース Upstashデータベースの作成中。グローバルデータベースは、データを複数のリージョンに複製して、エッジ関数からのレイテンシーを削減します。:::
Cloudflareワーカー関数はrequest
を受け入れます パラメータとして。 UpstashのRESTAPIを使用して、リクエストをRedisリストに記録します。現在の日付をRedisリストのキーとして使用します。そのため、1日あたりのリクエストを別々のリストに記録します。
Upstash REST APIには、エンドポイントとトークンが必要です。データベースを作成したら、コンソールからREST API
をクリックしてエンドポイントとトークンをコピーできます。 ボタン。 Cloudflareワーカー関数を以下のコードで更新し、エンドポイントとトークンを置き換えます:
const endpoint = "REPLACE_UPSTASH_REST_ENDPOINT";
const token = "REPLACE_UPSTASH_REST_TOKEN";
async function recordRequest(request) {
let d = new Date();
let datestr = d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate();
let data = [["url", request.url], ...request.headers];
let url = endpoint + "/lpush/" + datestr;
const init = {
body: JSON.stringify(data),
method: "POST",
headers: {
Authorization: "Bearer " + token,
},
};
return await fetch(url, init);
}
async function handleRequest(request) {
recordRequest(request);
return new Response("My Awesome Website");
}
addEventListener("fetch", (event) => {
event.respondWith(
handleRequest(event.request).catch(
(err) => new Response(err.stack, { status: 500 })
)
);
});
次に、日付を引数として取り、分析データを返す簡単なコマンドラインアプリケーションを作成しましょう。フォルダを作成し、npm init
を実行します 。次に、npm install ioredis
を使用してRedisクライアントをインストールします 。 .env.example
をコピーします .env
として ファイルを作成し、Redis URL(ioredis)を設定します。 index.jsを以下で更新します:
const Redis = require("ioredis");
require("dotenv").config();
console.log("EDGE analytics with CloudFlare Workers and Upstash Redis.");
let redis = new Redis(process.env.REDIS_URL);
let dateArg = process.argv[2];
let datestr;
if (dateArg) {
datestr = dateArg;
} else {
let d = new Date();
datestr = d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate();
}
redis.lrange(datestr, "0", "-1", function (err, result) {
let pageview = 0;
let users = new Set();
let countries = new Map();
let paths = new Map();
if (err) {
console.log("Could not connect to Redis.");
console.error(err);
} else {
console.log(
"Upstash Redis Connection Successful. Analyzing the access logs..."
);
if (!result || result.length === 0) {
console.log("Could not find any access logs for the date:" + datestr);
} else {
for (const elem of result) {
let entries = JSON.parse(elem);
for (let entry of entries) {
if (entry[0] === "accept") {
if (entry[1].startsWith("text")) pageview++;
}
if (entry[0] === "cf-ipcountry") {
let temp = countries.get(entry[1]);
if (!temp) {
temp = 0;
}
countries.set(entry[1], temp + 1);
}
if (entry[0] === "url") {
let temp = paths.get(entry[1]);
if (!temp) {
temp = 0;
}
paths.set(entry[1], temp + 1);
}
if (entry[0] === "x-real-ip") {
users.add(entry[1]);
}
}
}
countries = new Map([...countries.entries()].sort((a, b) => b[1] - a[1]));
paths = new Map([...paths.entries()].sort((a, b) => b[1] - a[1]));
console.log("\nDATE: " + datestr);
console.log("\nPAGE VIEWS: " + pageview);
console.log("\nUNIQUE VISITORS: " + users.size);
logMap("TOP COUNTRIES", countries);
logMap("TOP PAGES", paths);
}
}
});
function logMap(title, data) {
console.log("\n" + title);
console.log("----------------");
console.log(mapEntriesToString(data));
}
function mapEntriesToString(entries) {
return Array.from(entries, ([k, v]) => `${k} : ${v}\n`).join("");
}
これで、node index 2021-6-16
を使用してアプリケーションを実行できます。 または単にnode index
。後者は今日クエリします。
この例は出発点と考えることができます。分析のニーズに応じて、チャートとテーブルを備えたリッチWebアプリケーションを開発できます。他のRedisデータ構造を使用して、より強力な分析を行うことができます。
UpstashEdgeロードマップ
REST APIは、Edgeストーリーの最初のステップです。今年は2つの重要な開発を計画しています。
- エッジキャッシング:(更新:これはリリースされています。詳細をご覧ください)現在、すべてのRESTリクエストはデータベースリージョンに送信されます。間もなくエッジキャッシングがサポートされるため、RESTリクエストはグローバルなすべてのエッジロケーションにキャッシュされます。これにより、UpstashRedisはCloudflareKVのように世界中で低レイテンシを提供できるようになります。
- グローバルレプリケートデータベース:(更新:これはリリースされています。詳細)グローバル(マルチリージョン)レプリケーションは、データを複数のリージョンにレプリケートします。したがって、すべてのリクエスト(RedisとREST APIの両方)は最も近い場所に送信されます。これにより、一貫性の犠牲を最小限に抑えながら、グローバルに低レイテンシを実現できます。
Edgeロードマップ専用のブログ投稿を書く予定です。しばらくお待ちください。Twitterでフォローしてください。
-
CloudflareワーカーとサーバーレスRedisを使用して、Webサイト用の独自の待合室を構築します
このブログ投稿では、あなたのウェブサイトの待合室ページを実装します。 なぜですか? あなたのウェブサイトの訪問者の数が多いことは一般的に良いことですが、常にではありません。突然の高トラフィックは、アプリケーションを簡単に圧倒し、サービスを完全に中断させる可能性があります。待合室は、トラフィックを制御し、トラフィックの急増時にリソースを保護するのに役立つソリューションです。 Cloudflareの待合室は優れたソリューションですが、ビジネスアカウントとエンタープライズアカウントでのみ利用できます。心配しないでください。このブログでは、CloudflareWorkersとUpstashRedis
-
エッジキャッシングを使用した5ミリ秒のグローバルRedisレイテンシ
データベースとクライアントが同じリージョンにある場合、Redisを使用すると1ミリ秒のレイテンシーが簡単になります。ただし、クライアントをグローバルに分散させたい場合は、遅延が100ミリ秒を超えて増加します。これを克服するためにEdgeCachingを構築しました。 エッジキャッシング エッジキャッシングを使用すると、REST応答は、CDNと同様に、世界中のエッジロケーションにキャッシュされます。エッジキャッシングが有効になっている場合、平均で5msのグローバルレイテンシが見られます。 10の異なるリージョンにあるクライアントからのレイテンシー数を記録するベンチマークアプリケーションを参照し