Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

Copyright (C) 2023 Toranoana Lab Inc. All Rights Reserved. Turso : トゥルソ
 正式名称 イク・トゥルソ
 フィンランド神話の悪意のある海の怪物 らしい
 


Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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


Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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


Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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