Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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
    虎の穴ラボ 奥谷 一陽

    View Slide

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

    View Slide

  3. Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
    Turso is 何?

    View Slide

  4. Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
    Turso : トゥルソ

    正式名称 イク・トゥルソ

    フィンランド神話の悪意のある海の怪物 らしい


    View Slide

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

    View Slide

  6. Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
    その名を冠したエッジ向けデータベースサービス


    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  10. Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
    本当?

    View Slide

  11. Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
    やってみよう

    View Slide

  12. 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 }
    );

    View Slide

  13. Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
    実験
    日本からアクセス
     select: 20ms
     insert: 11ms
    アメリカ バージニア州 からアクセス
     select: 658ms
     insert: 162ms
    =>フォーラムで質問
    あれっ?


    View Slide

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

    View Slide

  15. Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
    そのほかフォーラムで質問してわかったこと
    接続URLによる違い
    Turso は、https://~ とlibsql://~ でアクセスできる。
    - https:// はステートレスなアクセス
    - libsql:// はwebsocket でのアクセスになる。
    ということはこの2つでもレイテンシが変わる可能性がありそう。

    View Slide

  16. 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 }
    );

    View Slide

  17. 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倍早い

    View Slide

  18. 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:// である必要がある。
    一貫性が要求されないデータの書き込みでも
    積極的にトランザクション使う方が速度的に有利な可能性

    View Slide

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

    View Slide

  20. Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved.
    ありがとうございました!

    View Slide