日本語版
最新ニュース
科学&テクノロジー

マイクロスケールよりもハイパースケールで優れています

私たちは、新しいオープンソースの自己ホスト可能なサーバーレスプラットフォームであるリベットです。私たちは最近、sqlite-on-the-Serverと雑草に携わっています。 Githubの星をください、すぐにSQLiteについてもっと多くを共有します! ありました 多くの議論 最近、サーバー上のSQLiteの長所と短所について。これらの会話の多くを読んだ後、私はサーバーオンザサーバーの力に関する私の視点は、一般的な意見から偏っていることに気付きました。 大規模なSQLiteの利点に関する私の視点に飛び込む前に、マイクロスケールアプリのSqlite-on-serverの背景を理解することは役立ちます。 ほとんどの開発者は、サーバー側のSQLiteを小規模アプリケーションのシンプルで費用対効果の高い選択肢と考えています。それはしばしば次のことを評価しています: これらの特性により、SQLiteは個人プロジェクト、軽量アプリケーション、およびプロトタイプにとって魅力的なオプションです。 のようなツール Litefs、 ライトストリーム、 rqlite、 dqlite、 そして 岩盤 マイクロスケールの展開の複製と高可用性でSQLiteを強化します。 ただし、この投稿には焦点が当てられています CloudFlare耐久性のあるオブジェクト そして トーチ 大規模なSQLiteの頻繁に見過ごされている利点を強調します。 高スケールシステムでは、企業は頻繁にデータベースのスケーリングに苦労しています ポストグレス または mysql。代わりに、彼らはしばしばなどのシャードされたデータベースに頼ります カサンドラ、 scylladb、 dynamodb、 スピーディ (Sharded mysql)、および 他の (シャードされたポストグレス)。 これらのシステムは、パーティションキーを使用して、関連するデータと同様に構造化されたデータを共同配置します。たとえば、Cassandraの典型的なチャットアプリケーションは次のように定義する場合があります。 CREATE TABLE chat_channel (…

マイクロスケールよりもハイパースケールで優れています

1742164261
2025-03-13 10:37:00

私たちは、新しいオープンソースの自己ホスト可能なサーバーレスプラットフォームであるリベットです。私たちは最近、sqlite-on-the-Serverと雑草に携わっています。 Githubの星をください、すぐにSQLiteについてもっと多くを共有します!

ありました 多くの議論 最近、サーバー上のSQLiteの長所と短所について。これらの会話の多くを読んだ後、私はサーバーオンザサーバーの力に関する私の視点は、一般的な意見から偏っていることに気付きました。


大規模なSQLiteの利点に関する私の視点に飛び込む前に、マイクロスケールアプリのSqlite-on-serverの背景を理解することは役立ちます。

ほとんどの開発者は、サーバー側のSQLiteを小規模アプリケーションのシンプルで費用対効果の高い選択肢と考えています。それはしばしば次のことを評価しています:

これらの特性により、SQLiteは個人プロジェクト、軽量アプリケーション、およびプロトタイプにとって魅力的なオプションです。

のようなツール Litefsライトストリームrqlitedqlite、 そして 岩盤 マイクロスケールの展開の複製と高可用性でSQLiteを強化します。

ただし、この投稿には焦点が当てられています CloudFlare耐久性のあるオブジェクト そして トーチ 大規模なSQLiteの頻繁に見過ごされている利点を強調します。


高スケールシステムでは、企業は頻繁にデータベースのスケーリングに苦労しています ポストグレス または mysql。代わりに、彼らはしばしばなどのシャードされたデータベースに頼ります カサンドラscylladbdynamodbスピーディ (Sharded mysql)、および 他の (シャードされたポストグレス)。

これらのシステムは、パーティションキーを使用して、関連するデータと同様に構造化されたデータを共同配置します。たとえば、Cassandraの典型的なチャットアプリケーションは次のように定義する場合があります。

CREATE TABLE chat_channel (
    -- Partition Key: Groups all messages for a single chat in the same partition
    channel_id UUID,

    -- Clustering Key: Orders messages within the chat (think ORDER BY)
    sent_at TIMESTAMP,
    message_id UUID,

    -- Row data
    message TEXT,

    PRIMARY KEY (channel_id, sent_at, message_id)
) WITH CLUSTERING ORDER BY (sent_at ASC, message_id ASC);

このパーティションからメッセージを照会するには、次のことを書くことができます。

SELECT * FROM user_chat WHERE channel_id = ? ORDER BY sent_at ASC, message_id ASC;

シャードされたデータベースは、ほとんどすべての大手ハイテク企業を提供しているため、

  • 効率的なバッチは、同じパーティションでグループ化されたデータを使用して読み取ります。
  • ノード全体でデータをパーティション化することによる水平スケーラビリティ。
  • 高摂取ワークロードのための最適化された書き込み

分割戦略はスケーラビリティを改善しますが、重要な課題を導入します。

  • 厳格なスキーマ:PostgresやMySQLとは異なり、スキーマは意図したクエリパターンと正確に一致し、柔軟性を制限する必要があります。
  • 複雑なスキーマの変更:新しいインデックスまたは関係を追加するには、ライブシステムに新しいテーブルを作成および埋めるために、重要な運用オーバーヘッドが必要です。
  • 複雑なクロスパーティ操作:パーティション全体に酸性特性を実施することは困難です。企業はしばしば複雑に頼ります 二相コミット または、許容可能なレベルのデータの矛盾を伴う設計。
  • データの不一致:テーブルとパーティション間の強い制約がなければ、取引が中断されたり、変化の伝播に失敗したため、データは頻繁に「汚れ」になります。

CloudFlare耐久性のあるオブジェクト そして トーチ SQLiteが将来ハイパースケールのアプリケーションをどのように設計するかをどのように変えるかを示します。

これらのデータベースは次のことを提供します。

  • 動的スケーリング:エンティティごとにデータベースを即座に提供し、インフラストラクチャの複雑さを減らします。
  • 無限の安価なデータベース:パーティションと同様に、作成と管理が非常に安価であるため、無限の数のSQLiteデータベースを生成できます。
  • グローバル分布:データベースはユーザーの近くに配置され、クエリパフォーマンスが向上します。
  • 組み込みの複製と耐久性:従来のSQLiteとは異なり、これらのサービスは、複数の地域でデータを複製して、高可用性を高めます。

CloudFlare耐久性のあるオブジェクトとTursoを使用してSQLiteを使用すると、エンティティごとにデータベースを定義し、パーティションキーを効果的に置き換えることができます。

チャットログを単一のパーティションに保存する代わりに、各チャットチャネルには、参加者や反応など、より多くのテーブルも含む独自のSQLiteデータベースを持つことができます。サンプルスキーマは次のようになります。

-- Notice there is no channel_id in this table, since all of this data is local
-- to a single SQLite database per channel.
--
-- The channel ID will be specified when defining which Durable Object to
-- connect to below (see )`CHAT_DO.idFromName(channelId)` below.
CREATE TABLE messages (
  id INTEGER PRIMARY KEY,
  sent_at TIMESTAMP,
  sender_id UUID,
  message TEXT
);

CREATE INDEX ON messages (sent_at ASC);

CREATE TABLE participants (
  user_id UUID PRIMARY KEY,
  joined_at TIMESTAMP
);

CloudFlare耐久性のあるオブジェクトまたはTursoから、このSQLiteパーティションデータベースは次のように照会される可能性があります。

// This Durable Object represents one partition
//
// It contains a completely isolated SQLite database
export class ChatChannel extends DurableObject {
  async getMessages() {
    // Execute query
    let result = this.ctx.storage.sql.exec('SELECT * FROM messages ORDER BY sent_at ASC').one();
    return result;
  }
}

function getMessages(channelId: string) {
  // Here, the channel ID corresponds to the database partition
  const id = env.CHAT_CHANNEL_DURABLE_OBJECT.idFromName(channelId);
  const channelDurableObject = c.env.CHAT_CHANNEL_DURABLE_OBJECT.get(id);

  // Execute the query
  return await channelDurableObject.getMessages();
}


その利点にもかかわらず、SQLiteのScliteはいくつかの課題を提示します。


サーバー上のSQLiteは、小規模な展開のための軽量ソリューション以上のものです。これは、従来のパーティション化されたデータベースにますます実行可能な代替品です。 Tursoや耐久性のあるオブジェクトなどのSQLiteパーティションソリューションを活用することにより、開発者は豊富なSQL機能、酸コンプライアンス、および重要な運用上の利点を獲得します。

#マイクロスケールよりもハイパースケールで優れています

Share this:

執筆者について: nipponese

Nipponese News編集部は、国内外のニュースを日本語で分かりやすくお届けします。