Erlang/OTP をベースとした軽量タスクキューで、SQLite で後援し、過剰な設計を行わないもの。

2026/06/10 22:45

Erlang/OTP をベースとした軽量タスクキューで、SQLite で後援し、過剰な設計を行わないもの。

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

EZRA は Erlang/OTP および SQLite を基盤とした軽量なシングルノードタスクキューであり、外部の Redis サーバーまたは複雑なランタイム環境を必要とせず、Redis の機能を実装しています。本書は単一著者がメンテナンスしており、プラーリクエストは受け付けておらず、大規模なエンタープライズクラスターではなく、孤立したアプリケーション向けのシンプルさを重視しています。開発者は Mac (Apple Silicon)、Linux x86_64、Linux arm64、Docker 向けのプレビルトバイナリを使用して EZRA をデプロイすることもできますし、Mix を通じて Elixir アプリケーション内に直接埋め込むこともできます。自己完結型のバイナリのサイズは約 20MB です。EZRA は内部の RESP3 プロトコルと一意のワーカー名を利用することでアクティブなジョブを追跡し、複数のワーカーおよびプロデューサーをサポートし、動的なタスク分配によって高スループットワークロードに対応します。スループットはストレージメディアに依存し、SSD 上で約 15k–30k タスク/秒、NVMe 上では 40k–80k タスク/秒を達成でき、エンジン側のオーバーヘッドは呼び出しあたり约 1–5µs です。EZRA は "at-least-once" ロジックを採用することで信頼性の高いデータ配信を確保しており、タスクは決して無視されて削除されることはありません。「available」から「in-flight」、そして最大試行回数(デフォルト 3 回)を超えた場合は「dead」状態へ移行し、専用の

dead
キューより読み出すことができます。再試行が尽きた失敗したタスクは「available」キューに戻され、反復して失敗した場合には
dead
キューに移動されます。EZRA は XADD、XREADGROUP、XACK、XDEL、XNACK という特定の Redis Streams コマンドをサポートしますが、GET、SET、pub/sub など他の標準的な Redis 操作に対してはエラーを返します。優先順位キュー、遅延タスク、クросスキュー間のトランザクション、ネイティブのファンアウトといった高度な機能はサポートされていません。パフォーマンス維持のためには SQLite の効率性を確保するためにレコメンデドペイロードサイズ制限(100KB)が推奨されており、大規模なデータセットについては外部に保管し、タスクペイロード内へ参照を保存する必要があります。すべてのデータは単一の SQLite ファイル (
ezra.db
) に格納されるため、マルチノード構成での高可用性には不適切ですが、
rsync
などのツールの使用によってバックアップやレプリケーションは容易に行えます。

本文

EZRA:ゼロロス・リレーエージェントによるメッセージエクスチェンジ

プロジェクト概要

EZRA は、永続的なタスクキューです。以下の特性を備えています。

  • プッシュ/プルモデル: 複数のサービス(プロデューサー)がタスクをプッシュし、複数のワーカーが処理します。
  • 完全な可視化と追跡: 完了確認までのすべてのタスクが追跡可能です。「サイレント・ドロップ」(消え失せること)も**「ファイア・アンド・フォーゲット」**(放置すること)もありません。
  • 簡潔なバックエンド: SQLite を使用し、Erlang/OTP ランタイム によって動作します。
  • 言語非依存: どの言語のRedis クライアントでも接続でき(Redis サーバーは不要)、新規 SDK のインストールも不要です。

注意: このプロジェクトは単一著者によって維持されており、プルリクエストはお受けできません。バグや質問に関する Issue は大歓迎です。


目次

  1. クイックスタート
  2. 全体像とパフォーマンス
  3. なぜ EZRA が存在するのか?
  4. 仕組みとライフサイクル
  5. トラブル時の挙動
  6. マルチワーカー・プロデューサー
  7. トレードオフ(制約事項)
  8. 適切なユースケース
  9. インストールと起動
  10. 用語解説

クイックスタート

サーバーを起動するには、以下の Docker コマンドを実行します。

docker run -d --name ezra \
  -p 42002:42002 \
  -v ezra_data:/data \
  ghcr.io/entgriff/ezra

この後、ローカルホスト(

localhost
)のポート
42002
に対して以下の処理を行います。

プロデューサー:タスクをプッシュする (Python 例)

import redis

# EZRA サーバーに接続(ポート 42002)
r = redis.Redis(host="localhost", port=42002, decode_responses=True, protocol=3)

# "emails" というキューへタスクをプッシュします。
# キューは事前に作成する必要はありません。最初のプッシュが自動的に作成します。
r.xadd("emails", {"payload": '{"to": "alice@example.com"}'})

ワーカー:タスクを取得して処理する (Python 例)

import redis

r = redis.Redis(host="localhost", port=42002, decode_responses=True, protocol=3)

while True:
    # Ezra から"emails"キューの次のタスクを要求します。
    # "workers": ワイヤープロトコル上のコンシューマーグループ名です(EZRA では無視されます)。
    # "worker-1": このワーカーの一意の識別子です。
    # {"emails": ">"}: このキューから未配信の次のタスクをください。
    # block=0: 接続を維持し、タスクが到着する瞬間に即時配信します。
    
    results = r.xreadgroup("workers", "worker-1", {"emails": ">"}, count=1, block=0)

    if results:
        for task_id, fields in results["emails"][0]:
            send_email(fields["payload"])  # ここに処理のロジックを追加

            # 成功を報告します。この手順は必須です。
            # 報告しないと、可視化タイムアウト(デフォルト 30 秒)後に EZRA がタスクを再配信します。
            r.xack("emails", "workers", task_id)

対応言語: Python, Node.js, Go, Ruby, Java などで動作可能です。Redis クライアントの設定先をポート

6379
から
42002
に変更するだけで利用可能です。


全体像とパフォーマンス

  • アーキテクチャ: サービスやワーカーはどのマシン、どの言語でも動作します。ワーカーはアイドル時でも接続を維持し、タスクが到着した瞬間に即時処理を開始します。
  • 永続性: すべてのデータはサーバー上の
    ezra.db
    永続化されます。

パフォーマンス指標

項目
接続ワーカーあたりのメモリ使用量~2 KB (OS スレッドではない)
ベースラインメモリ使用量~20 MB
通常クラウド VM (SSD) スループット~15k – 30k タスク/秒
NVMe ディスク スループット~40k – 80k タスク/秒
バイナリサイズ~20 MB(自完)

補足: スループットは SQLite の書き込み速度(ディスクに依存)によって制限されます。エンジン自体のオーバーヘッドは、1 コールあたり約 1–5 µs です。


なぜ EZRA が存在するのか?

多くのアプリでは、ユーザーへのレスポンスを即座に返したまま、バックグラウンドで重い処理(メール送信、PDF 生成など)を行う必要があります。EZRA は以下の課題を解決します。

  • 失敗の管理: 失敗した場合の再試行ロジックを提供します。
  • 永続性: サーバー再起動時でもデータが失われることはありません。
  • 過剰設計への対抗: クラスターの調達や専用サーバーの設定などの重荷を負うことなく、大規模なリクエスト処理(100 万 RPS など)を必要としない実用的な規模をカバーします。

EZRA は以下の軽量な代替案を提供します。

  • シンプル: 1 つのバイナリ、1 つの SQLite ファイル。
  • 無依存: 事前設定やクラスター化不要。
  • 監視容易: SQLite ブラウザでデータベースを開き、キューの内容を直接確認できます。

仕組みとライフサイクル

EZRA は Redis が使用するRESP3プロトコル(ワイヤーフォーマット)を採用しています。既存の Redis クライアントはそのまま使用可能です。

実装されているコマンド

Redis Streams に由来する主要な機能を実装しています:

  • XADD
    : ナメッドキューへタスクをプッシュします。
  • XREADGROUP
    : 次のタスクを取得し、ワーカー識別子下で占有します(ポーリング不要)。
  • XACK
    : 処理完了の報告です。
  • XDEL
    : 失敗時の削除(EZRA では再試行のために保持します)。
  • XNACK
    : SDK から直接コマンドを送信する際の使用。

制限: Redis の他機能(GET, SET, pub/sub など)はエラーを返します。EZRA は Redis のコピーではなく、タスクキューに特化したプロトコルです。

タスクライフサイクル図

stateDiagram-v2
    [*] --> available : push
    available --> in_flight : pop
    in_flight --> available : crash, timeout, or nack with retries left
    in_flight --> done : ack
    in_flight --> dead : nack or timeout, no retries left
    dead --> [*] : readable via queue::dead

ライフサイクルの詳細

  1. プッシュ: 常に
    available
    ステートへ追加されます。
  2. ポップ: ワーカーが取得し、
    in_flight
    ステートになります(タスクは削除されません)。
  3. 完了 (ACK): ワーカーが処理を完了させ、EZRA に通知すると
    done
    となります。
  4. 失敗/タイムアウト: ワーカーが応答しない場合や
    NACK
    した場合:
    • タイムアウト発生後(デフォルト 30 秒)、タスクは再び
      available
      に戻り、他のワーカーに再配信されます。
    • 最大回数を尽くしても失敗(
      NACK
      )すると
      dead
      ステートへ移動します(デフォルト:3 回)。

ゼロロスの保証:

  • サーバーが再起動した場合でも、起動時点で
    in_flight
    のタスクはすべて即時
    available
    に戻されます。データは一切失われません。
  • ワーカーが失敗したタスクも、同じ識別子で再取得可能か、または別のワーカーが拾うまで保持されます。

トラブル時の挙動

シナリオ挙動
ワーカーのクラッシュ
in_flight
のタスクは可視化タイムアウト後、EZRA 側で回収され再配信されます(最大回数増加分)。
EZRA サーバーのクラッシュTCP 切断を検知し、再起動時に即座に全ての
in_flight
タスクを
available
にリセットします。「アット・least・オンス」保証のため、障害でもデータはロスしません。
タスクの連続失敗
max_attempts
を超えると
dead
ステートへ移動し、
queue::dead
キューに格納されます。ここで確認可能です。
ワーカーの遅延タイムアウトまで処理が完了しない場合、他のワーカーが受け取ります。キューごとに最適な
visibility_timeout
を設定してください(最悪ケースを基準)。

マルチワーカー・プロデューサー

EZRA は TCP ベースの API であり、登録や複雑な構成は不要です。以下の特性があります。

  • 任意数のクライアント: 複数のプロデューサーが同時にプッシュできます。
  • 公平な分配: 複数のワーカーがいる場合、タスクは自動的に最も軽いワーカーへ割り当てられます(ラウンドロビンではなく、即時処理可能な者へ)。
  • 一意の識別子: ワーカーには一意の名前が必要(例:
    worker-1
    ,
    worker-2
    )です。EZRA はこれを使ってどのプロセスがタスクを担当しているか追跡します。
  • 非同期スケーリング: 追加ワーカーを起動するだけでスケールでき、構成変更は不要です。

注記: EZRA 単体では SQLite を使用するため、実質的にはシングルスノードです。データは EZRA が動作するマシン上のファイルとして存在します。


トレードオフ(制約事項)

項目内容と代替案
シングルスノードデータは 1 マシンに限定。そのマシンのダウンはキューの停止を意味します。対応策: SQLite ファイル自体の単純なバックアップ(rsync など)。
アット・least・オンス配信タイムアウトで処理が完了していない場合、重複実行が発生する可能性があります。対応策: ワーカー側に重複処理(イデンプト)への耐性を設計する。
可視化タイムアウトの遅延クラッシュ直後の即時回収ではなく、設定秒数後に回収されます(将来的に改善予定)。
タスクの蓄積完了タスクは永久に残ります。対応策:
retention_seconds
オプションまたはプッシュ時の
ttl_seconds
を設定する。
ファノウト機能なし1 つのタスクは 1 つのワーカーへしか送られません。ブロードキャストには複数タスクのプッシュが必要。
優先度キューなし
jobs.high
,
jobs.low
という別のキューを作成し、それぞれ消費させるワークアラウンドが必要です。
遅延配信(スケジュール)なし即時プッシュが必須です(将来的にサポート予定)。
ペイロード制限推奨は 100KB。大規模な BLOB は外部ストレージへ置いて参照のみを渡すのが望ましい。
クロス・キュートランザクションなし複数のキューへのアトミックなプッシュはサポートされません。

適切なユースケース

✅ ゴッドフィット(推奨)

  • バックグラウンドジョブ: メール配信、PDF 生成、画像リサイズ、Webhook 送信など。
  • 信頼性の高い非同期処理: マイクロ秒の超低遅延よりも、確実な実行と再試行が求められる場合。
  • マルチ言語チーム: Go や Python でバックグランド処理を、Elixir や Node.js でフロントエンドを行い、1 つのキューで連携したい場合。
  • スタートアップ/初期製品: Kafka や RabbitMQ を導入するとリソースや複雑さ釣り合いが悪くなる段階での代替案。

❌ ゴッドフィットではない(不推奨)

  • ハイアベイラビリティが必要な分散環境: ノード間でデータ整合性が厳しく、マルチマシンの完全冗長化が必須の場合。
  • Pub/Sub パターン: 同じメッセージを複数のコンシューマーに同時に届ける場合。
  • 超高速スループット: 単一ディスクの書き込み性能限界を超える必要がある場合(例:80k/秒を超えたい)。
  • イベントソーシング: ストリーム自体を主たるデータモデルとして監査ログなどに利用する場合。
  • 複雑なルティング: メッセージのフィルタリングやブロードキャストルーティングがブローカー側で必須の場合。

インストールと起動

環境確認

ランタイムは不要です。バイナリのみダウンロードして実行すれば動作します(サイズ ~20 MB)。

ダウンロードコマンド

以下のいずれかのコマンドを実行してください。

# macOS (Apple Silicon)
curl -Lo ezra https://github.com/entgriff/ezra/releases/latest/download/ezra-macos_arm64
chmod +x ezra

# Linux x86_64
curl -Lo ezra https://github.com/entgriff/ezra/releases/latest/download/ezra-linux_x86_64
chmod +x ezra

# Linux arm64
curl -Lo ezra https://github.com/entgriff/ezra/releases/latest/download/ezra-linux_arm64
chmod +x ezra

サーバー起動方法

初回実行時にデータディレクトリに

ezra.db
が作成されます。

./ezra --data-dir /var/ezra

環境変数による設定:

EZRA_DATA_DIR=/var/ezra EZRA_PORT=42002 ./ezra

停止するには Ctrl+C または SIGTERM を送ります。EZRA は処理中のタスクを完了させてからクリーンにシャットダウンします。詳細なオプションと Docker 設定は docs/usage.md にあります。


用語解説

  • Push: キューに新しいタスクを追加します。
  • Pop: 次のタスクを取得し、ワーカー側で作業に取り掛かる準備をします。削除されるのではなく、
    in_flight
    というステータスで一時的に占有されます。
  • Ack (Acknowledge): 「処理完了」を EZRA に報告します。これでタスクは
    done
    状態になり、他の誰にも渡されません(ただし永続的に記録されます)。
  • Nack (Negative Acknowledge): 「失敗しました」と報告します。EZRA はこのタスクを
    available
    に戻して、別のワーカーが再試行できるようにします(
    max_attempts
    回まで)。
  • In-Flight: ワーカーに渡されつつあり、完了確認されていない状態です。ワーカーから応答がない場合、可視化タイムアウト後に EZRA が回収します。

おすすめドキュメントとリソース

  • GitHub Examples: 動作する Docker Compose デモ(Python, Node.js)。
  • Usage Docs: 言語クライアント、完全な例、Docker、オプション参照、systemd セットアップ。
  • Architecture Docs: ストレージスキーマ、モジュールマップ、ワイヤープロトコル。
  • Elixir Client Docs: Elixir ライブラリモードでの利用例。

同じ日のほかのニュース

一覧に戻る →

2026/06/13 14:57

Mozilla を辞める

## 日本語翻訳: サマリー:著者は、組織の現在のリーダーシップと社原本来のコミュニティ主導のミッションとの間にある増大する断絶による心身の消耗を理由に、モジラから退任することを表明しています。著者は、最近の「スタートアップ的な」思考への転換——透明性よりも生々しいユーザー成長数の優先——が、firefox が信頼できるブラウザとしての核心的強みを損ないつつあると主張しています。重要な批判点は、リーダーらが現在は無償の貢献者を単なる顧客として扱っており、歴史的に製品を形成してまいれた深いコミュニティ関与の価値を無視していることです。さらに、人工知能や制限的なエンタープライズ標準といったトレンド対応型機能への追求が、技術的負債を生み出し、根本的な信頼性の問題を解決する注意力から逸らしています。グーグルの資金提供がこれらの欠陥のあるプロジェクトを継続可能にしているものの、この戦略は、単に動作しプライバシー重視のブラウザを求めるユーザーを遠ざけるリスクがあります。モジラがレガシーなボランティア精神と企業のスケーラビリティの間にある文化的対立に対処しない場合、業界ではユーザーが本物の代替手段を探して churn が増加するようになり、大規模テック巨頭への支配強化につながる可能性があります。

2026/06/13 7:08

レアエース不使用電動モーター

## Japanese Translation: ルノーグループは、希土類磁石に依存しない高効率モーターを量産することで電気移動の先駆けとして自らの位置を確立しており、市場において EV の 90%が永久磁石同期モーターを使用するという状況と対照的な成果を挙げています。磁石ではなく巻線ローターを利用する EESM テクノロジー(Evolutionary Electric System Motor)は、世界の希土類供給の大半を掌握する中国への依存を回避します。ルノーはこの革新を 2012 年に Zoe などでの商品化を開始し、以降明確な世代ごとに技術を進化させてきました。第一世代(文献 5A/5AL)は Kangoo Z.E や Twingo Electric でデビューし、第二世代(文献 6A/6AM)は最高 160 kW の出力を特徴としており、現在のフラッグシップモデルである Megane E-Tech、Scenic E-Tech、そして今後の Renault 4 で採用されています。新しい第三世代モーター(文献 E7A)が現在準備就绪しており、2027 年発売に向けて仕様が確定しています。この高度化されたバージョンは重大なアップグレードを指向しており、オールインワンアーキテクチャにより寸法を 30%削減しながら 200 kW の電力と 400 Nm のトルクを提供します。極めて重要な点として、800 ボルトシステムで動作することで急速充電を可能にし、炭素への影響を 30%削減し、性能を損なうことなく最大 92%の効率を実現します。

2026/06/13 9:51

米国政府が「Fable 5」と「Mythos 5」へのアクセス停止に関する声明

## Japanese Translation: 米国政府は、国家安全保障上の懸念を理由に、Anthropic に高度な Fable 5 および Mythos 5 AI モデルへのアクセスを外国籍の人物に対して即時に停止することを命じた。同社はこれらの特定のモデルと制限付きツールの利用を無効化する一方で、他のすべてのモデルの稼働は引き続き維持することが必要となった。当局は、Fable 5 の安全性の safeguards を回避しうる「jailbreaking」手法が存在すると見ているが、Anthropic はこの評価に異議を唱え、想定されている脆弱性は OpenAI の GPT-5.5 を含め他の業界モデルにもすでに存在しており、その展開に対して独自に脅威をもたらすものではないと主張している。限られた調査に基づいた誤解に基づくものであるにもかかわらず、Anthropic は技術的な見解の相違があるものの、法的指図に従い展開を停止しなければならない結果、アクセス制限の影響を受ける顧客に対し即座にサービス中断が引き起こされた。同社は謝罪し、24 時間以内により詳細な情報を共有すると約束した。この事件は、急速に変化する技術的風景における AI セーフティの現実的な課題と厳格な規制措置の間で高まる緊張関係を示している。