$30 off During Our Annual Pro Sale. View Details »

Turso を Deno Deploy で触ってみる

Turso を Deno Deploy で触ってみる

エッジむけデータベースサービス Turso をDeno Deploy から使う。

- Turso is 何?
- エッジ向けの分散データベースの利点
- 実験
- フォーラムで質問してみた
- そのほかフォーラムで質問してわかったこと
- 接続URLでの速度比較
- まとめ

More Decks by 虎の穴ラボ株式会社

Other Decks in Technology

Transcript

  1. Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved. T

    O R A N O A N A L a b Turso を Deno Deploy で触ってみる 2023/05/17 Toranaona.deno #12 虎の穴ラボ 奥谷 一陽
  2. Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved. 自己紹介

    奥谷 一陽 所属:虎の穴ラボ株式会社 担当:Fantiaなど新規事業系の開発 興味:TypeScript、Deno おすすめコンテンツ:   『王様戦隊キングオージャー』   『PSYCHO-PASS シリーズ』 Twitter:@okutann88
  3. Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved. Turso

    : トゥルソ
 正式名称 イク・トゥルソ
 フィンランド神話の悪意のある海の怪物 らしい
 

  4. Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved. T

    O R A N O A N A L a b https://chiselstrike.com/
  5. Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved. Trusoは、

    - エッジ向けの分散データベース - SQLite をフォークした libSQLを基盤に開発 - 書き込みと読み込み行うプライマリDBと、 読み込みを担当するリードDBが分散配置される ※ 必ずしもどちらかに 2分されるわけでなく、グレーゾーンがある
  6. Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved. エッジ向けの分散データベースの利点

    コンピューティングとデータベースが物理的に近くにある可能性が上がる => 物理的距離に依存したレイテンシは下がるはず 例えば、  実行される Deno Deploy の近くに、データベースが置ける可能性  日本からのアクセス(日本のエッジがよく使われる)のに、  データベース本体はアメリカにある  というケースを部分的に防げるかもしれない ※ 必ずしもどちらかに 2分されるわけでなく、グレーゾーンがある
  7. 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 } );
  8. Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved. 実験

    日本からアクセス  select: 20ms  insert: 11ms アメリカ バージニア州 からアクセス  select: 658ms  insert: 162ms =>フォーラムで質問 あれっ?

  9. Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved. フォーラムで質問してみた

    回答:レプリカ DBを作成していないのでは? - Turso は、エッジにデータをコピーする - しかし、コピーの展開先となるレプリカDBは自動的に作成されない =>バージニアリージョンにデータベースを作成 再テスト  select: 7ms  insert: 184ms 大きく改善! $ turso db replicate [プライマリのデータベース名] iad
  10. Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved. そのほかフォーラムで質問してわかったこと

    接続URLによる違い Turso は、https://~ とlibsql://~ でアクセスできる。 - https:// はステートレスなアクセス - libsql:// はwebsocket でのアクセスになる。 ということはこの2つでもレイテンシが変わる可能性がありそう。
  11. 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 } );
  12. 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倍早い
  13. 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:// である必要がある。 一貫性が要求されないデータの書き込みでも 積極的にトランザクション使う方が速度的に有利な可能性
  14. Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved. まとめ

    - Turso というエッジ向けデータベースを紹介 - Deno Deployから使うことも意識されている。 - サービスの利用を日本だけに想定するなら、 レプリカの機能はあまり有効ではないかも - 「速度出ないなー」と思ったら、 接続URLを変えてみるのはオススメ - Turso は頻繁に改修/リリースが入っていて非常に活発 レプリカ機能が有効でないケースでも活躍する舞台が来るかも