**Show HN: Ayder – HTTP ネイティブで耐久性のあるイベントログ(C で実装、cURL をクライアントに使用)**

2026/01/14 2:55

**Show HN: Ayder – HTTP ネイティブで耐久性のあるイベントログ(C で実装、cURL をクライアントに使用)**

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

要約

Japanese Translation:

(Ayderは、JVMやZooKeeperに依存せず単一バイナリで実行できるC言語で書かれた軽量でHTTPネイティブな耐久イベントログ/メッセージバスです。Raftコンセンサスを用いて3/5/7ノードクラスター間の高可用性レプリケーションを実現し、非同期、同期マジョリティ、および同期全体という3種類の書き込みモードに対応しています。フォロワーはHTTP Locationヘッダー経由でリーダーへリダイレクトされます。

実際のネットワーク環境で動作した3ノードクラスターでのベンチマークでは、約50 kメッセージ/秒のスループットとサブミリ秒級のサーバーレイテンシ(P99.999 ≈ 1.22 ms)が確認されました。8 Mオフセットを持つ不正終了からの回復は40〜50秒で完了し、データ損失はありませんでした。Snapdragon X Eliteノートパソコン(WSL2)上でARM64テストを実施した結果、106 kメッセージ/秒のスループットとDigitalOcean VMよりも低いレイテンシが達成されました。

APIは純粋なHTTP/RESTです。curlで直接呼び出せ、ペイロードはバイナリ安全なBase64エンコードされています。エンドポイントには

/topics
/produce
/consume
/commit
/delete-before
、KVストア、および組み込みのストリーム処理(フィルタリング、集計、ウィンドウジョイン)があり、Avro+Protobufなど複数フォーマットをサポートしています。

デプロイメントオプションとしては、Prometheus/Grafanaモニタリング付きDocker Composeスタック、単一バイナリビルド、またはソースコンパイル(

libuv 1.51+
OpenSSL
zlib
liburing
が必要)があります。HAクラスターの設定は環境変数(
RF_HA_ENABLED
RF_HA_NODE_ID
RF_HA_NODES
RF_HA_WRITE_CONCERN
など)で行い、RaftトラフィックにはmTLSもサポートしています。

AyderはMITライセンスの下で公開されており、カザフスタン出身のソロ創業者Aydarbek Romanulyによって開発されました。)

Text to translate

(incorporating missing details and removing unsupported extrapolation):**

Ayder is a lightweight, HTTP‑native durable event log/message bus written in C that runs as a single binary without JVM or ZooKeeper dependencies. It uses Raft consensus for high‑availability replication across 3/5/7 node clusters and supports three write modes—async, sync‑majority, and sync‑all—with followers redirecting to the leader via an HTTP Location header.

Benchmarks on a real‑networked 3‑node cluster show ~50 k messages per second throughput, sub‑millisecond server latency (P99.999 ≈ 1.22 ms), and recovery from an unclean shutdown in 40–50 seconds for 8 M offsets—no data loss. ARM64 tests on a Snapdragon X Elite laptop (WSL2) achieved 106 k msg/s throughput with lower latency than DigitalOcean VMs.

The API is plain HTTP/REST; curl works directly, and payloads are binary‑safe base64 encoded. Endpoints include

/topics
,
/produce
,
/consume
,
/commit
,
/delete-before
, a KV store, and built‑in stream processing (filtering, aggregation, windowed joins) with cross‑format support (Avro+Protobuf).

Deployment options comprise Docker Compose stacks featuring Prometheus/Grafana monitoring, a standalone binary build, or source compilation (requiring

libuv 1.51+
,
OpenSSL
,
zlib
,
liburing
). Configuration for HA clusters is done via environment variables (
RF_HA_ENABLED
,
RF_HA_NODE_ID
,
RF_HA_NODES
,
RF_HA_WRITE_CONCERN
, etc.) and supports mTLS for Raft traffic.

Ayder is licensed under MIT and was authored by Aydarbek Romanuly, a solo founder from Kazakhstan.

本文

Ayder
HTTP ネイティブで永続性のあるイベントログ/メッセージバス – C で書かれています

curl
がクライアントになる、単一バイナリのストリーミングシステム。JVMも ZooKeeper も厚いクライアントライブラリも不要です。

▶️ 1 分デモ: SIGKILL → 再起動 → データはそのまま
https://www.youtube.com/watch?v=c-n0X5t-A9Y


Produce

curl -X POST 'localhost:1109/broker/topics/orders/produce?partition=0' \
  -H 'Authorization: Bearer dev' \
  -d '{"item":"widget"}'

Consume

curl 'localhost:1109/broker/consume/orders/mygroup/0?encoding=b64' \
  -H 'Authorization: Bearer dev'

なぜ Ayder なのか?

機能KafkaRedis StreamsAyder
プロトコルバイナリ(厚いクライアント)RESPHTTP (curl が使える)
耐久性✅ 再複製ログ、非同期レプリケーション⚠️ 非同期のみ、クォーラムなし✅ Raft コンセンサス(同期多数)
運用ZooKeeper/KRaft + JVM チューニング単一ノードまたは Redis Cluster単一バイナリ、依存性ゼロ
レイテンシ (P99)10–50 msN/A(非同期のみ)3.5 ms
復旧時間2+ h(クリーンでないシャットダウン)分単位40–50 s
最初のメッセージ約30分セットアップ約5分約60秒

Kafka は実績がある一方、運用コストが高い。Redis Streams はシンプルで高速だが非同期レプリケーションしか提供しない。Ayder はその中間に位置し、Kafka レベルの耐久性(Raft 同期多数)と Redis のような単純さを兼ね備えています。


何が得られるか

  • パーティションごとのオフセット付き append‑only ログ
  • コミット済みオフセットを持つコンシューマーグループ
  • シールされた append‑only ファイル(AOF)による耐久性とクラッシュリカバリ
  • Raft コンセンサスによる HA レプリケーション(3/5/7 ノードクラスター)
  • CAS と TTL を備えた KV ストア
  • フィルタ、集計、ウィンドウ付きジョイン(Avro+Protobuf など複数フォーマット対応)のストリーム処理

パフォーマンス

すべてのベンチマークは実際のネットワークで行われました。数字はマーケティングではなく真実です。

本番ベンチマーク – 3 ノードクラスター(DigitalOcean、8 vCPU AMD)

メトリッククライアント側サーバー側
スループット49 871 msg/s
P501.60 ms
P993.46 ms
P99.912.94 ms
P99.999154.49 ms1.22 ms

サーバー側の P99.999 の内訳:

  • ハンドラ: 1.22 ms
  • キュー待ち: 0.47 ms
  • HTTP パース: 0.41 ms

スループットテスト –
wrk
(最大スループット)

メトリック
スループット93 807 msg/s
P503.78 ms
P9910.22 ms
Max224.51 ms

ARM64 ベンチマーク – Snapdragon X Elite (WSL2)

メトリッククライアント側サーバー側
スループット106 645 msg/s
P503.57 ms
P997.62 ms
P99.999250.84 ms0.65 ms

サーバー側の P99.999 の内訳:

  • ハンドラ: 0.65 ms
  • キュー待ち: 0.29 ms
  • HTTP パース: 0.29 ms

復旧時間

シナリオKafkaAyder
クラスター再起動(クリーンでない)2+ h(本番報告)40–50 s
ブローカー同期失敗後の修復1 TB データで 181 min秒単位で自動追いつき
50+ブローカーのローリングリスタート2+ h(各ブローカー 2 min)N/A – 単一バイナリ

クラッシュリカバリをテスト:

  1. フォロワーを
    SIGKILL
  2. リーダーは継続、フォロワーはオフセットを失う。
  3. フォロワー再起動 → ローカル AOF を再生し、リーダーから欠損データを要求、40–50 s で追いつく(データロスなし)。

クイックスタート

Docker(最速)

git clone https://github.com/A1darbek/ayder.git
cd ayder
docker compose up -d --build   # Prometheus + Grafana も含む

スタンドアロン

docker build -t ayder .
docker run -p 1109:1109 --shm-size=2g ayder

トピックを作成:

curl -X POST localhost:1109/broker/topics \
  -H 'Authorization: Bearer dev' \
  -H 'Content-Type: application/json' \
  -d '{"name":"events","partitions":4}'

メッセージを公開:

curl -X POST 'localhost:1109/broker/topics/events/produce?partition=0' \
  -H 'Authorization: Bearer dev' \
  -d 'hello world'

ソースからビルド

依存ライブラリ: libuv 1.51+, OpenSSL, zlib, liburing.

make clean && make
./ayder --port 1109

Docker Compose スタック

docker-compose.yml
は次を起動します:

  • Ayder (ポート 1109)
  • Prometheus (ポート 9090、メトリクス収集用)
  • Grafana (ポート 3000、デフォルトパスワード: admin)

API 参照

ヘルス & メトリクス

エンドポイントメソッド説明
/health
GET
{"ok":true}
/ready
GET
{"ready":true}
/metrics
GETPrometheus フォーマット
/metrics_ha
GETHA クラスターのメトリクス

トピック管理

作成

POST /broker/topics
Body: {"name":"events","partitions":8}
Response: {"ok":true,"topic":"events","partitions":8}

Produce(本文は生バイト)

POST /broker/topics/{topic}/produce
Query:
  partition (optional)
  key (URL‑encoded, optional)
  idempotency_key (URL‑encoded, optional)
  timeout_ms (optional)
  timing=1 (optional)
Response:
{
  "ok": true,
  "offset": 123,
  "partition": 0,
  "batch_id": 9991,
  "sealed": true,
  "durable": true,
  "mode": "sealed",
  "synced": true
}

重複検知(

idempotency_key
が一致した場合):

{"ok":true,"offset":123,"partition":0,"sealed":true,"synced":null,"duplicate":true}

Batch produce (

NDJSON
– 行ごとにメッセージ)

POST /broker/topics/{topic}/produce-ndjson
Response:
{
  "ok": true,
  "first_offset": 1000,
  "count": 250,
  "partition": 0,
  "batch_id": 424242,
  "sealed": true,
  "durable": true,
  "mode": "sealed",
  "synced": false
}

Consume

GET /broker/consume/{topic}/{group}/{partition}
Query:
  offset (inclusive, defaults to last committed)
  limit (default 100, max 1000)
  encoding=b64 (binary‑safe base64)
Response:
{
  "messages": [
    {"offset":0,"partition":0,"value_b64":"aGVsbG8=","key_b64":"a2V5"}
  ],
  "count":1,
  "next_offset":1,
  "committed_offset":0,
  "truncated":false
}

Commit

POST /broker/commit
Body: {"topic":"events","group":"g1","partition":0,"offset":124}
Response: { ... }

削除・保持

先頭オフセット以前を削除(ハードフロア):

POST /broker/delete-before
Body: {"topic":"events","partition":0,"before_offset":100000}
Response: {"ok":true,"deleted_count":12345,"freed_bytes":987654}

保持ポリシー設定:

{"topic":"events","partition":0,"ttl_ms":60000,"max_bytes":104857600}   // TTL + サイズ上限
{"topic":"*","ttl_ms":300000}                                            // すべてのトピックに TTL

KV ストア

Put

POST /kv/{namespace}/{key}?cas=<u64>&ttl_ms=<u64>
Body: raw value bytes
Response:
{"ok":true,"cas":2,"sealed":true,"durable":true,"mode":"sealed","synced":true,"batch_id":123}

Get

GET /kv/{namespace}/{key}
Response: {"value":"<base64>","cas":2}

Delete

DELETE /kv/{namespace}/{key}?cas=<u64>
Response: {"ok":true,"deleted":true,"sealed":true,"durable":true,"mode":"sealed","synced":false,"batch_id":456}

ストリーム処理

別サービス不要で組み込み済み。

  • 行フィルタ(eq, ne, lt, gt, in, contains)
  • 集計付き group by(count, sum, avg, min, max)
  • フィールド投影
  • タンブリングウィンドウ
  • ウィンドウ付きジョイン(二つのソース間):
    • ジョイントタイプ: inner / left / right / full
    • 複合キー
    • ウィンドウサイズ & 遅延許容
    • dedupe_once
      オプション
    • Avro + Protobuf を跨ぐフォーマットサポート

HA クラスタリング

3、5、7 ノードのクラスターを Raft レプリケーションでサポート。

書き込みモード

モード確認
asyncリーダーがローカルに書き込み、バックグラウンドでレプリケーション
sync‑majority多数(例: 2/3 ノード)を待つ
sync‑allすべてのノードを待つ

書き込みはリーダーへ行う必要があります。フォロワーに送られた場合、HTTP リダイレクトでリーダーアドレス(

Location
ヘッダー)を返します。

フォロワー復旧: ローカル AOF を再生し、リーダーへ接続して欠損オフセットを要求、データストリームで追いつく。自動追いつき。


実行方法

単一ノード

./ayder --port 1109   # デフォルトポート
# カスタムポートの場合
./ayder --port 7001

HA クラスター(3/5/7 ノード)

環境変数を設定:

変数説明
RF_HA_ENABLED
HA モード有効化 (1)
RF_HA_NODE_ID
ユニークノード ID
RF_HA_NODES
クラスター構成:
id:host:raft_port:priority,...
RF_HA_BOOTSTRAP_LEADER
初期リーダーのみ 1 に設定
RF_HA_WRITE_CONCERN
待機ノード数 (1=リーダーだけ, 2=多数, N=全員)
RF_HA_DEDICATED_WORKER
P99 レイテンシ最適化のため 0 推奨
RF_HA_TLS
Raft の mTLS 有効化 (1)
RF_HA_TLS_CA
,
RF_HA_TLS_CERT
,
RF_HA_TLS_KEY
TLS パス
RF_BEARER_TOKENS
HTTP 認証トークン (
token@scope:token2:...
)

例:3 ノードセットアップ

# Node 1 (ブートストラップリーダー)
export RF_HA_ENABLED=1
export RF_HA_NODE_ID=node1
export RF_HA_BOOTSTRAP_LEADER=1
export RF_HA_NODES='node1:10.0.0.1:7000:100,node2:10.0.0.2:8000:50,node3:10.0.0.3:9000:25'
export RF_HA_WRITE_CONCERN=2   # sync‑majority (2/3)
export RF_HA_DEDICATED_WORKER=0
export RF_BEARER_TOKENS='dev@scope:token2:token3'
export RF_HA_TLS=1
export RF_HA_TLS_CA=./certs/ca.crt
export RF_HA_TLS_CERT=./certs/node1.crt
export RF_HA_TLS_KEY=./certs/node1.key
./ayder --port 7001

# Node 2 & 3 はポートと証明書を変えて同様に設定

作者 & ライセンス

開発者: Aydarbek Romanuly – カザフスタン出身のソロ創業者
GitHub: https://github.com/A1darbek/ayder
メール: aidarbekromanuly@gmail.com

ライセンス: MIT


エラーレスポンス例

一貫したフォーマット:

{
  "ok": false,
  "error": "missing_topic",
  "message": "Topic name is required",
  "docs": "https://ayder.dev/docs/api/produce"
}

Ayder は何か

  • ✅ HTTP ネイティブなイベントログ(パーティションとオフセット付き)
  • ✅ ポインタベースの消費で高速書き込み
  • ✅ クラッシュリカバリ付き耐久性
  • ✅ Raft レプリケーションで水平スケーリング可能
  • ✅ クロスフォーマットジョインを備えた組み込みストリーム処理
  • ✅ ARM64 ネイティブ(Snapdragon X Elite でテスト済み)

Ayder は何ではない (まだ)

  • ❌ Kafka プロトコル互換性
  • ❌ SQL データベース
  • ❌ クライアント側の idempotency discipline が無い Magic exactly‑once

同じ日のほかのニュース

一覧に戻る →

2026/01/14 5:45

**ゲームズ・ワークショップ、スタッフのAI使用を全面禁止 経営陣はテクノロジーに興味津々でない** - 同社は従業員が業務上人工知能ツールを利用することを一律で禁じる方針を採用しました。 - 経営層は知的財産の安全性や創造的コントロールへの影響を懸念していると述べています。 - 業界内では注目が集まっても、上級経営者はAIがデザイン・生産フローに与えるメリットに対し慎重な姿勢を保ち続けています。

## Japanese Translation: **改善された概要** Games Workshop は、コンテンツ制作と設計プロセスにおける生成型 AI ツールの使用を正式に禁止しました。この方針では、厳格な監視下で数名の上級マネージャーのみが AI を実験できるようになっていますが、その可能性についてはまだ誰も興奮していません。外部コンペティションへの参加を含む不正使用は禁止されており、企業はデータ準拠・セキュリティ・ガバナンスを監視し、AI/ML エンジンがデバイスに自動インストールされるのを防止する必要があります。 GW の禁止措置は知的財産権を保護し、人間クリエイターを尊重するとともに、上級スタッフによる限定的な調査を許可しています。この決定は、より広い文脈の中で行われました。GW は *Warhammer 40,000* や *Age of Sigmar* などのフラッグシップテーブルトップタイトルを所有し、高品質のコデックス本・ミニチュア・アニメーションを販売しており、最近は新規採用で Warhammer Studio を拡大しました。Displate の作品に関する最近の紛争―Displate がそのアートワークが AI によって生成されたと否定し、「赤旗」を人為的なミスに帰せたケース―は、ファンが生成型 AI アートに対して反発していることを示しています。特に Warhammer の美学に大きな影響力を持つアーティスト John Blanche の存在がその背景にあります。 今後も GW はデータ準拠とセキュリティの監視を継続します。上級マネージャーは AI の可能性を探るかもしれませんが、内部方針の変更や外部圧力が変わらない限り、広範な採用は見込めません。この禁止措置により GW は Genvid、EA、Square Enix など AI を積極的に導入している競合他社に比べて遅れを取ることになり、ゲーム開発の競争ダイナミクスが変わる可能性があります。これは生成型 AI の統合に対する業界全体の慎重な姿勢を反映しています。

2026/01/14 2:10

**チューリップ・クリエイティブ・コンピュータ** - 芸術と技術のユニークな融合 - 革新的なビジュアル体験を設計 - 鮮やかなカラーパレットと最先端ハードウェアを組み合わせる

## 日本語訳: **Tulip CC** は低電力で手頃な価格のセルフコンテインドポータブルコンピュータで、オープンソースの音楽ワークステーションとしても機能します。ESP32‑S3マイクロコントローラを中心に構築され、MicroPython を実行し、AMY ステレオ 120 ボイスシンセサイザーエンジン(加法/減法/F‑M 合成、サンプラー、Karplus–Strong、アナログフィルタ、シーケンサー、ドラムマシン、パッチエディタ)とキャパシティブ・マルチタッチ対応のタッチスクリーンディスプレイを備えています。 デバイスは 8.5 MB の RAM(MicroPython 用 2 MB、OS 用 1.5 MB、残りがグラフィックスフレームバッファ)と 32 MB のフラッシュ(うち 24 MB が使用可能)、Wi‑Fi、USB キーボード/マウス/MIDI、I²C/Grove/Mabee コネクタをセンサーや周辺機器用に搭載し、組み込みの pico/nano スタイルエディタ(構文ハイライトと REPL)も備えています。グラフィックスは LVGL によって処理されます:テキストフレームバッファ 128 × 50(ANSI 256 色)、スキャンラインあたり最大 32 スプライト(32 KB ビットマップメモリ)、1024 × 600 の背景フレームバッファでスクロール、PNG ローディング、デフォルト 30 FPS、解像度調整可能、256 色。 電力消費は 5 V で 575 mA(中程度の輝度)で、LiPo、18650、または USB バッテリーパックに対応しています。追加ソフトウェア機能として、ネイティブチャット/ファイル共有 BBS「TULIP ~ WORLD」、MIDI 入出力コールバック、およびクリエーションの共有用 Web バージョンがあります。 Tulip CC は市販ユニット、DIY ハードウェアキット、フル機能の Web アプリ、またはネイティブデスクトップアプリ(Mac/Linux/WSL)として入手可能です。開発リソース—完全な API ドキュメント、チュートリアル、Discord コミュニティ、およびオープンソース GitHub リポジトリ—が提供されており、埋め込みデバイスとデスクトップ環境の両方で動作するために貢献が必要です。将来のファームウェア更新では、合成モジュールの拡張、LVGL を介したグラフィックス解像度の向上、および電力効率の改善がコミュニティの入力を受けて行われる可能性があります。

2026/01/14 1:22

「二つの頭(=複数の視点)が一つより優れているのでしょうか?」

## Japanese Translation: ## 要約 コイントスの結果を時折だけ報告する人々がいる場合、報告者数が奇数であると予測精度が向上し、さらに1人追加して偶数にすると追加効果は得られないという点が主旨です。 シミュレーションと解析的な検証から次のように示されています:正直な友人(80 % 正解率)を1人だけ持つ場合、2人目を加えても精度は80 %のままであり、合意しても不一致が相殺されるため利益がありません。3人目が参加すると精度は90 %に上昇し、4人目が加わると再び90 %に戻ります。このパターンは奇数回報者ごとに繰り返されます。 この発見はコンドルセートの陪審理論を反映しており、偶数規模のグループでは多数決が引き分けになる可能性があるため、新たな情報を提供しないことを説明しています。著者は、創造的執筆プロジェクトを開催するプログラミングリトリート「Recurse Center」でベッティングシミュレーションを実行している際にこの現象に気付きました。 今後の研究では、この傾向がより複雑な投票設定や大規模グループでも維持されるかどうかを検証することが期待されます。グループサイズと偶奇性が意思決定品質に与える影響を理解することで、クラウドソーシングサイト、陪審制度、または人間の判断を集約するあらゆるプラットフォームの設計者が、不必要な偶数参加者を追加しないよう助けることができます。

**Show HN: Ayder – HTTP ネイティブで耐久性のあるイベントログ(C で実装、cURL をクライアントに使用)** | そっか~ニュース