エッジむけデータベースサービス Turso をDeno Deploy から使う。
- Turso is 何? - エッジ向けの分散データベースの利点 - 実験 - フォーラムで質問してみた - そのほかフォーラムで質問してわかったこと - 接続URLでの速度比較 - まとめ
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.T O R A N O A N A L a bTurso を Deno Deploy で触ってみる2023/05/17Toranaona.deno #12虎の穴ラボ 奥谷 一陽
View Slide
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.自己紹介奥谷 一陽所属:虎の穴ラボ株式会社担当:Fantiaなど新規事業系の開発興味:TypeScript、Denoおすすめコンテンツ: 『王様戦隊キングオージャー』 『PSYCHO-PASS シリーズ』Twitter:@okutann88
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.Turso is 何?
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.Turso : トゥルソ 正式名称 イク・トゥルソ フィンランド神話の悪意のある海の怪物 らしい
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.その名を冠したエッジ向けデータベースサービス
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.T O R A N O A N A L a bhttps://chiselstrike.com/
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.Trusoは、- エッジ向けの分散データベース- SQLite をフォークした libSQLを基盤に開発- 書き込みと読み込み行うプライマリDBと、読み込みを担当するリードDBが分散配置される※ 必ずしもどちらかに2分されるわけでなく、グレーゾーンがある
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.エッジ向けの分散データベースの利点コンピューティングとデータベースが物理的に近くにある可能性が上がる=> 物理的距離に依存したレイテンシは下がるはず例えば、 実行される Deno Deploy の近くに、データベースが置ける可能性 日本からのアクセス(日本のエッジがよく使われる)のに、 データベース本体はアメリカにある というケースを部分的に防げるかもしれない※ 必ずしもどちらかに2分されるわけでなく、グレーゾーンがある
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.本当?
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.やってみよう
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.Turso を Deno Deploy で使うDeno Deploy に次の動作の実装でデプロイ- Turso に作ったデータベースに SELECT する- Turso に作ったデータベースに INSERT するTURSO_DB_URL、TURSO_AUTH_TOKEN は、turso cliで確認できます。import "https://deno.land/[email protected]/dotenv/load.ts";import { serve } from "https://deno.land/[email protected]/http/server.ts";import { type Config, createClient } from "https://esm.sh/@libsql/client";const config = {url: Deno.env.get("TURSO_DB_URL"),authToken: Deno.env.get("TURSO_AUTH_TOKEN"),} as Config;const db = createClient(config);await serve(async (request) => {console.time('select');const selectResult = await db.execute("SELECT * FROM items");console.timeEnd('select');console.time('insert');await db.execute({sql: "INSERT INTO items(name) VALUES(?)",args: [`USER${selectResult.rows.length}`],});console.timeEnd('insert');return new Response(JSON.stringify({ items: selectResult.rows }), {headers: { "content-type": "application/json" },});},{ port: 8000 });
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.実験日本からアクセス select: 20ms insert: 11msアメリカ バージニア州 からアクセス select: 658ms insert: 162ms=>フォーラムで質問あれっ?
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.フォーラムで質問してみた回答:レプリカ DBを作成していないのでは?- Turso は、エッジにデータをコピーする- しかし、コピーの展開先となるレプリカDBは自動的に作成されない=>バージニアリージョンにデータベースを作成再テスト select: 7ms insert: 184ms大きく改善!$ turso db replicate [プライマリのデータベース名] iad
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.そのほかフォーラムで質問してわかったこと接続URLによる違いTurso は、https://~ とlibsql://~ でアクセスできる。- https:// はステートレスなアクセス- libsql:// はwebsocket でのアクセスになる。ということはこの2つでもレイテンシが変わる可能性がありそう。
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.接続URLで速度比較// 書き込みimport "https://deno.land/[email protected]/dotenv/load.ts";import { serve } from"https://deno.land/[email protected]/http/server.ts";import { type Config, createClient } from"https://esm.sh/@libsql/client";const config = {url: Deno.env.get("TURSO_DB_URL"),authToken: Deno.env.get("TURSO_AUTH_TOKEN"),} as Config;const db = createClient(config);await serve(async (request) => {console.time("insert");for await (const i of Array(100).keys()) {await db.execute({sql: "INSERT INTO items(name) VALUES(?)",args: [`USER${i}`],});}console.timeEnd("insert");return new Response(JSON.stringify({ items: [1, 2, 3] }), {headers: { "content-type": "application/json" },});},{ port: 8000 });// 読み込みimport "https://deno.land/[email protected]/dotenv/load.ts";import { serve } from"https://deno.land/[email protected]/http/server.ts";import { type Config, createClient } from"https://esm.sh/@libsql/client";const config = {url: Deno.env.get("TURSO_DB_URL"),authToken: Deno.env.get("TURSO_AUTH_TOKEN"),} as Config;const db = createClient(config);await serve(async (request) => {console.time("select");for await (const _ of Array(100).keys()) {await db.execute("SELECT * FROM items");}console.timeEnd("select");return new Response(JSON.stringify({ items: [1, 2, 3] }), {headers: { "content-type": "application/json" },});},{ port: 8000 });
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.接続URLで速度比較 - 結果 -書き込み https: 1088ms ~ 1306ms libsql: 2487ms ~ 3282ms読み込み https: 6532ms ~ 10197ms libsql: 4960ms ~ 6836ms=>今回のケースではlibsql:// で接続したとき読み込みが1.5~2倍早いhttps:// で接続する方が書き込みが1.5~2倍早い
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.接続URLで速度比較(補足)// 書き込み トランザクション使用import "https://deno.land/[email protected]/dotenv/load.ts";import { serve } from "https://deno.land/[email protected]/http/server.ts";import { type Config, createClient } from "https://esm.sh/@libsql/client";const config = {url: Deno.env.get("TURSO_DB_URL"),authToken: Deno.env.get("TURSO_AUTH_TOKEN"),} as Config;const db = createClient(config);await serve(async (request) => {console.time("insert");const tran = await db.transaction();for await (const i of Array(100).keys()) {await tran.execute({sql: "INSERT INTO items(name) VALUES(?)",args: [`USER${i}`],});}await tran.commit();console.timeEnd("insert");return new Response(JSON.stringify({ items: [1, 2, 3] }), {headers: { "content-type": "application/json" },});},{ port: 8000 });トランザクションを使うと100件の書き込みが、2487ms ~ 3282ms から、297ms ~ 328ms に短縮。ただし、libsql:// である必要がある。一貫性が要求されないデータの書き込みでも積極的にトランザクション使う方が速度的に有利な可能性
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.まとめ- Turso というエッジ向けデータベースを紹介- Deno Deployから使うことも意識されている。- サービスの利用を日本だけに想定するなら、レプリカの機能はあまり有効ではないかも- 「速度出ないなー」と思ったら、接続URLを変えてみるのはオススメ- Turso は頻繁に改修/リリースが入っていて非常に活発レプリカ機能が有効でないケースでも活躍する舞台が来るかも
Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.ありがとうございました!