1 ポイント 投稿者 GN⁺ 4 시간 전 | 1件のコメント | WhatsAppで共有
  • 耐久実行の本質はインフラそのものではなく、ワークフロー状態の保持にあり、進行状態が残っていれば再実行と復旧が可能
  • Obelisk はワークフローの進行を実行ログに保存し、永続化された履歴から再生することで、アクティビティの再試行に適した構造を持つ
  • SQLite は別個のデータベースサービス、ネットワークホップ、追加のコントロールプレーンなしに、ローカルファイルでトランザクションベースの耐久状態を提供する
  • Litestream は SQLite の変更を S3 互換オブジェクトストレージへ非同期ストリーミングするが、コピー前にボリュームが消失すると最新の書き込みを失う可能性がある
  • Obelisk は Postgres もサポートしており、より高い可用性・共有スケーラビリティ・ネットワークデータベースの特性が必要な場合により適している

SQLiteとLitestreamの運用モデル

  • Litestream は SQLite の変更を S3 互換オブジェクトストレージへ非同期ストリーミングできる
  • 実行環境の近くにジョブ状態を置きつつ、バックアップ・マイグレーション・検査用としてデータベースを外部へコピーできる
  • 非同期レプリケーションの性質上、SQLite ボリュームがコピー前に消失すると、復元時に最新のローカル書き込みを失う可能性がある
  • Obelisk サーバーを SQLite データベースと一緒に実行し、Litestream でバックアップし、必要なときにオブザーバーが必要なデータベースを取得する構成である
  • 同じ SQLite ファイルはローカル再生、デバッグ、エージェントが実際に行った作業の理解に利用できる

適した利用範囲とPostgres選択の基準

  • AI エージェントと AI 生成ワークフローはバースト性があり、実験的な場合も多いため、エージェントやテナントごとに小さな独立状態単位を持つ構成は理解しやすい
  • マイクロVMやコンテナ内の小さなサーバーがそれぞれ SQLite データベースとオブジェクトストレージのバックアップを持つ方式は、1つの大きな常時稼働の共有システムよりもシンプルで安価であり、障害分離にも優れる可能性がある
  • オブジェクトストレージへの非同期レプリケーションが求める耐久性モデルではない場合や、より高い可用性・より広い共有スケーラビリティ・ネットワークデータベースの特性が必要であれば、Postgres の方が適している
  • 多くのワークフローシステムは初日からそのレベルのインフラを必要とせず、状態要件を上回る大規模なインフラで始める必要はない
  • ローカル SQLite データベース、S3 への Litestream バックアップ、低コストなワーカーの組み合わせだけでも、少ないインフラで耐久システムを構築でき、AI エージェント領域では合理的なデフォルトになりうる

1件のコメント

 
GN⁺ 4 시간 전
Hacker Newsのコメント
  • Temporal でワークフローを構築し始めたが、ローカルアプリとしてはかなり軽量にデプロイでき、分離されたローカル環境では SQLite を使っている。
    API のリトライ処理、ワークフローやジョブの整理が本当にシンプルになるので、一度試してみることを勧める。思想的にはこの記事が提案していることとまさに同じ方向だが、エージェントが扱いやすい非常に豊富で柔軟なインターフェースが加わる。Web UI でワークフローを確認したり、エージェント実行を見直したりするのも簡単だ。
    Temporal はシステムにずっと高い信頼性を、ほとんどただ同然で加えてくれる。分散かつ信頼性の高いシステムは難しいので、車輪の再発明は避けたほうがいいと思う。
    SQLite データベースを簡単にのぞいて、ワークフローで何が起きているかを把握し、個々のジョブを組み合わせ、ワークフローを手軽に呼び出せるようにしたいなら、Temporal は検討に値する。
    これに合わせて、エージェント用のファイル利用はほとんどやめた。Markdown や JSON も良いが、小さなローカルアプリを作るときには落とし穴のように感じる。LLM は SQLite をうまく扱えるし、そこから Markdown や JSON など好きな形式にレンダリングできる。エージェントが jq を実行したり Markdown を grep したりする代わりに特定の行だけを問い合わせられれば、トークンもかなり節約できる。複数のファイルよりも、データ構造をより規律あるものにしやすい、移植性の高い自己完結型のデータ管理システムを得られる。小さなローカルプロジェクトが大きくなったり、より正式なものになったりすれば MySQL/Postgres にもつなげられ、しかもすでにスキーマとデータ規律を備えた状態になっている。

    • 主に 単一マシン で動かしているように聞こえる。
      Temporal は規模が大きくなるとずっと複雑になる。Cassandra の運用は楽しくないし、Ringpop と TChannel は問題が起きたときのデバッグが難しい。SQL バックエンド対応は整合性要件のため水平スケール用レプリカをサポートせず、単一インスタンスしか使えない。
      コードの書き方によっては、ワークフローに埋め込まれたコードの修正も複雑になる。履歴イベントの順序を変える変更は、すでにデプロイ済みのワーカーの決定性を壊してしまう。
      私たちは Temporal をかなり使っているが、単純なスクリプトや自動化から始めた人たちは皆これを気に入っていて、その上に実運用システムを作った人たちは皆嫌っている。運用の未熟さかもしれないが、ここのコメント欄で見えるバラ色のイメージと自分の経験は一致しなかった。
    • HN で聞く話では、Temporal のマネージドソリューションに予想以上の金を払うか、結局は非常に重いシステムを自前で運用して かなりの運用負担 を背負うことになるらしい。
      自分ではやったことがないが、実際の経験談をもっと聞いてみたい。
    • Markdown を jq や grep する代わりに SQLite を使う具体例を挙げてもらえる?
    • Temporal の広告みたいに読める :)
    • ファイルとデータベースのアプローチの話は興味深い。自分も行ったり来たりした末に、結局 データベース に落ち着いた。
  • 実運用アプリに SQLite を使おうという執着は理解できない。SQLite は組み込みデータベースであり、同時実行性の管理にはまったく向いていない
    こういうことのために Postgres や MySQL のようなデータベースサーバーがある。これらの本来の役割は、複数のプロセスが別々のマシンから同時にデータを更新できるようにすることだ
    これはコンピュータサイエンスの基本原則であり、「何でも SQLite」と叫ぶ側は少し経験不足に見える

    • どの種類の 同時実行性 があり、その要件をどう満たすべきかについての理解がかなり限定的に見える。サーバーかどうかはこの議論ではそれほど重要ではない
      SQLite は多くの実際のワークロードで優れた本番用データベースであり、それは広く文書化されている。Postgres とは大きく異なるため、まったく別の技術として学ぶ必要がある
      ひとつの見方として、システム内で自然に強いパーティショニングが生まれる部分には SQLite が適している場合がある
    • SQLite と同時実行性フロントエンド、たとえば Go の net/http サーバーの組み合わせだけでも、ある種のサービスが想定しうる負荷をすべて処理できることは多い。時間とともにハードウェアを増強できるならなおさらで、SQLite は数十万 TPS まで簡単にスケール可能だ
      実際に手放すことになるのは 高可用性/フェイルオーバー や災害復旧くらいだが、これにも解決策はある。単一サーバーのシステムはたいてい驚くほど堅牢だ。複雑な制御プレーンがなければ、システムは増えるほど稼働率が下がることが多いからだ
    • SQLite はさまざまな用途に向いているが、おそらくネットワークデータベースやシャーディングが必要な 大規模 Web アプリ に主に時間を使っているのだろう。それも興味深い分野だが、他にも多くの領域がある
      技術の変化を踏まえて既存の「ベストプラクティス」を再評価するのが好きだ。特に単純さを高める方向ならなおさらだ。家族向けのソーシャルメディアサイトを VPS 1 台の SQLite DB で動かすのは素晴らしい。ユーザーは約 15 人で、保守はほとんど不要だ。FreshRSS インスタンスと “now” ページも SQLite で動かしている
      職場でもここ数十年、SQLite をあらゆる用途に使ってきた。一時的な作業キュー、ローカルで大量のログを高速に取り込み・照会する仕組み、そして simonw のすばらしい https://github.com/simonw/datasette を使ったリアルタイム表示・フィルタリングなどに使ってきた
      「何でも SQLite」というより、「思っているよりはるかに多くの場所で SQLite」に近いと考えている
      kentonv/Cloudflare のエッジ SQLite の取り組みがこの考えをもう少し一般化したのかもしれないが、もともと存在していた流れだ。https://blog.cloudflare.com/sqlite-in-durable-objects/
      こうした小さく有用な事例を知り、それを活用したいと思うことは、経験不足ではなく、むしろ経験の指標かもしれない
    • だからこそ 数十億個の SQLite データベース が存在するのではないか?
      SQLite は、他のすべてのデータベースエンジンを合わせたよりも多く使われている可能性が高い。実世界には数十億もの SQLite のコピーが存在する。Android デバイス、iPhone や iOS デバイス、Mac、Windows 10/11 のインストール環境、Firefox/Chrome/Safari、Skype、iTunes、Dropbox クライアント、TurboTax と QuickBooks、PHP と Python、ほとんどのテレビとセットトップボックス、ほとんどの車載マルチメディアシステム、そして数え切れないほど多くのアプリケーションに組み込まれている
      https://sqlite.org/mostdeployed.html
    • データが自然に シャーディング され、書き込みが単一シャード内で発生するなら、並列性は容易になる。リクエストはユーザーのデータがあるシャードにルーティングされ、ローカルで読み書きされる
      こうするとスケーラビリティははるかに理解しやすくなる。分割して配置し、さらに分割して配置すればよい。ユーザー N 人ごとにシャードを 1 つ追加するイメージだ
      その代わり、クロスシャードクエリ、たとえば分析、そしてユーザーの離脱や陳腐化が進んだときに負荷をどう平準化するかといった別の問題が生じる
      しかし、大規模ユーザー数において挿入/更新によって生じる共有インデックスのスケーリング問題全体は回避できる
      もはやリレーショナルデータベースというより、階層型データベースになる
  • 次のものをすべて Go + SQLite に置き換えた: Intercom、Zendesk、メールマーケティング、Kanban、Todo、決済スタック、イシュートラッカー、フォーラム、稼働時間モニター、PagerDuty クローン
    販売している製品が数十個あるので、いっそ全部自分で作ればいいのではと思った
    すべて同じサーバー上で動いており、メモリ消費も非常に少ない。使っていた SaaS ツールを全部これらで置き換えた
    専用サーバーへ移行することで、管理型クラウドソリューションに払っていた費用の約 1/10 に減らせたうえ、同じ高可用性を維持しながらレイテンシもさらに低くなった。VPS の noisy neighbor によってテールレイテンシが悪化していたことも一因だった
    以前はこうしたものに大金を使っていたが、いまは運用 4 か月目で、必要だったのは細かなアップデートだけだった
    デプロイは本当に単純。Docker も Kubernetes も使わず、systemd サービスと開発マシンでビルドして配布したバイナリだけ
    MaxMind や IPData のようなサービスにもお金を払っていたが、自前で IP ジオロケーションサービスを作り、テストでは既存の大半のソリューションより性能が良かった
    始まりは Uptime Robot の置き換えで、その後自信がついて PagerDuty を置き換えた。さらに Intercom も置き換えた
    最後に、「決済スタックは自作するな」といつも言われていたが、YOLO だと思ってその失敗を自分でやってみることにした。既存の決済ソリューションを調べて自分で開発・デプロイし、今のところ問題はまったく起きていない
    フロントには Caddy を置いている
    ほとんどの SaaS 製品で提供される機能のうち、実際に使っていたのは 1〜5% にすぎず、本当に必要な機能はこうした「エンタープライズ級」プラットフォームの中でますます深く埋もれて、ワークフローを難しくしていることに気づいた
    商用製品は、パートナーや顧客が私の安さを知るのを好まないだろうから見せないが、私はこれをやりくり上手だと呼んでいる
    無料アプリなら見せられる。最近リリースしたもので、ユーザーは 2 万人以上いる: https://macrocodex.app/
    このアプリでは Zendesk クローンだけを使っている。メールは Cloudflare ルーティングで処理しているので、運用コストはほとんどかからない

    • 稼働時間モニターを自作したとのことですが、地域分散 や住宅回線テストはどのように違って扱っていますか?
  • ファイルからマルチパーティション・データベースまでには大きな隔たりがある。本番運用がかかった状況でデータベースをコンテナで動かすのは自分の好みではない
    個人的には、多くの ETL はエンタープライズデータベースを持ち込まずにローカルで処理できる。そういう場合、DuckDB は SQLite より 5〜10 倍優れており、専用の Postgres データベースを立ち上げるよりはるかに単純で高速だ
    一般的なスクリプティングでは、20 行の awk スクリプトと、DuckDB ベースのはるかにクリーンで堅牢かつ保守しやすい同等の SQL スクリプトとは比べものにならない
    MotherDuck が IPO のためにパンプ・アンド・ダンプをしなければならないような状況でないことを願う。ありふれた企業の強欲さのせいでこのツールを失うことになれば悲しいだろう

    • DuckDB のデベロッパーリレーション担当です。まずは好意的な言葉をありがとう :)
      20 行の awk スクリプトの話は面白い。昨日 Ubuntu Summit でほぼ同じ主張をした。ある時点を超えると GNU coreutils でシェルスクリプトを書くのは非現実的になり、DuckDB の SQL スクリプトのほうが複雑さや保守性、そしてしばしば性能の面でもうまくスケールする。スライドはこちら: https://blobs.duckdb.org/slides/duckdb-ubuntu-summit-2026.pd... ページ 32〜36
      また MotherDuck は DuckDB 上でクローズドソースの DBaaS を開発している。DuckDB 上に構築され、DuckDB から MotherDuck に接続できるが、シアトルに本社を置く別個の VC 出資企業だ
      DuckDB はアムステルダムのブートストラップ企業、つまり売上ベースの会社である DuckLabs が開発している。プロジェクトの知的財産は、3 つ目の組織であるオランダの非営利団体 DuckDB Foundation が保有している。詳しくは https://duckdb.org/faq#how-are-duckdb-the-duckdb-foundation-... を参照
  • S3 上の SQLite DB を安全に 同時更新 できるようにするライブラリを作った[0]
    あまり知られていない SQLite sessions 拡張と、小さなメタデータファイルに対する S3 compare-and-swap を使って、かなり効率的かつ安全に動作するようにしている。Lambda 関数に状態保存用 DB が必要だが、データベースインスタンス全体のコストは払いたくない小規模プロジェクトで楽しく使っている
    [0]: https://github.com/psanford/s3db

  • SQLite は 単一ノードアプリケーション では Postgres と比べても驚くほど高性能だ
    Postgres はメモリをはるかに多く使い、入出力はプロセス間通信を経由しなければならない。一方 SQLite は共有接続プールを通じて、すべてをプロセス内に置ける
    エージェントハーネス用に複数のストレージエンジンをテストしているが、SQLite では単一 vCPU で同時セッション 7,500 まで可能だったのに対し、Postgres はクラッシュするか接続が枯渇した
    [0] https://github.com/impalasys/talon/pull/23#issuecomment-4577...

    • 正しく使えば、SQLite は実質的に プロセス内メソッド呼び出し だ。残る障害物がランタイム、カーネル、ファイルシステム、ローカル NVMe ストレージだけなら、ホスティング型の代替手段より圧倒的に速くなりうる
      現在のスレッドを外れた瞬間、レイテンシの観点では負けゲームになる。スレッド間通信を強制しないなら、SQLite はマイクロ秒単位で動作できる
    • SQLite が非常に優れたソフトウェアだという前提に立てば、単一ノードアプリケーションで Postgres と比べて性能が良いのは予想されることではないか?
      単一ノードという文脈では Postgres はやりすぎだ。SQLite と競うものとして期待すべきではない
      ほぼ、インメモリの HashMap と Redis をベンチマークして、理想条件で HashMap の結果が良いことに驚くようなものだ
  • 何年もSQLiteの話を読んでいて、自宅プロジェクトで使ってみたが、Postgresから来ると型システムがあまりにも貧弱で衝撃を受けた。
    本当に劣っているのに、なぜあそこまで称賛されているのかわからない。
    https://sqlite.org/datatype3.html
    https://www.postgresql.org/docs/current/datatype.html
    日付/時刻の扱いは30年前のデータベースを使っているような感覚で、挿入時にも何も強制されない。なぜこれほど多くの人が好むのか、誰か説明してほしい。

    • STRICTテーブルを使える: https://sqlite.org/stricttables.html
    • その通りで、SQLiteで実質的に唯一不満な部分だ。厳格な型システムを備えたSQLiteなら素晴らしいだろう。
    • これは後方互換性のせいであり、その代償でもある。ほとんどのSQLiteユーザーは各接続ごとにいくつかのpragmaを実行しなければならない。
      PRAGMA journal_mode = WAL
      PRAGMA foreign_keys = ON

      Something non-null

      PRAGMA busy_timeout = 1000

      This is fine for most applications, but see the manual

      PRAGMA synchronous = NORMAL

      If you use it as a file format

      PRAGMA trusted_schema = OFF
      バインディングによっては追加オプションが必要になる場合もある。たとえばPythonアプリケーションはsqlite3モジュールのデフォルト値を使うべきではない。そのデフォルトは単純に間違っている。3.12以前は、標準ライブラリ外のバインディングを使う以外に代替手段もなかった: https://docs.python.org/3/library/sqlite3.html#transaction-c...
      strict tableも使うべきだ。 https://www.sqlite.org/stricttables.html
      使い勝手は悪いが、CHECK制約も使える。たとえばSQLite組み込みの日付サポートで不可能ではないが不格好だ:
      CHECK (
      date(my_date_col) IS NOT NULL
      AND my_date_col = date(my_date_col)
      )
      IS NOT NULLが必要なのは、dateが不正な日付に対してNULLを返すためだ。もう一方の検査はユリウス日も受け入れてしまうので、date('2026')は紀元前4707年のある時点になってしまう。
    • 単一ファイルだから。
    • 型システム以外の点で称賛されている。
      特にstrict table以前は期待外れだったという点には同意する。
      DuckDBを見るべきだ。ちゃんとした型を持つSQLiteに近い。ただしOLTP、つまり配列の構造体ではなく、OLAP、つまり構造体の配列なので、一般的なSQLiteの負荷では性能が悪くなる可能性がある。実際にどちらかを検討するアプリケーションなら、大きな違いはない気もする。
  • 複数の大規模なPostgresクラスタを使った後でSQLiteに移行し、月間アクティブユーザーが7桁のサービス全体がSQLite durable objectsで支えられている。
    アクセスパターンは違う考え方が必要だが、その利点には十分価値があった。

  • いい切り口だ。主要な問題がワークフロー状態を永続的に保存し、可視化できて、簡単に復旧できるようにすることなら、SQLiteで十分な場合は多い。

  • このアイデアの次の反復として、「永続的なワークフローにはログさえあればよい」が出てくるのを早く見たい。

    • もう待つ必要はない。すでに起きている。
      「ログさえあればよい」式のソリューションが失敗しうる理由の一つは、信頼できないログが注入攻撃になる場合だ[1]。
      SBOMを確認し、CI/CDパイプラインも含めるのを忘れないようにすべきだ[2]。
      [1] https://news.ycombinator.com/item?id=48315440
      [2] https://github.com/jqwik-team/jqwik/issues/708#issuecomment-...
    • 真面目な話、「永続的なワークフローにはS3さえあればよい」は受け入れられるし、S3からS3へデータを移すデータ処理アプリケーションには使うと思う。
    • ログだけで永続的なワークフローに十分なのか? よくわからない。ログの上で入れ子になった、あるいは関連するデータをどう永続化してクエリするのか? ここで言うログとは、ElasticsearchやMeilisearchのようなものを指しているのか?
    • その次には「永続的なワークフローにはソケットさえあればよい」が来て、最後には「永続的なワークフローにはカーネルの基本要素さえあればよい」になるだろう。
      真面目な話、専門家であるということは、その仕事に合った道具を使うことだ。