Asopitech With · 機能フラグ管理
LaunchDarkly with Alopex Chirps & Alopex DB
LaunchDarklyは、デプロイし直さずに機能をオンとオフで切り替える機能フラグ管理のサービスです。これをAlopex ChirpsとAlopex DBを使って再現すると…?
更新: 2026/10/13
どんなサービスか
LaunchDarklyは、機能フラグを管理するサービスです。新しい機能を、デプロイし直さずに、オンとオフや、対象のユーザーで切り替えられます。扱うデータは、フラグの定義、対象の条件、変更の履歴です。
通信の組み立て
- Raftによる合意:フラグの変更は、Raftのグループに提案し、合意してから全ノードの状態機械に同じ順序で反映します。すべてのノードが、同じ順序で同じ設定になります。
- Alopex DBのテーブル:状態機械は、フラグの定義と対象の条件をAlopex DBのテーブルに書き、変更の履歴も行として残します。どの時点で誰が何を変えたかを、SQLで確かめられます。
- ノードの参加:新しいノードは、シードのリストから参加し、Raftの学習者として追いついてから、投票のメンバーになります。
フラグを評価して、ユーザーごとにオンかオフかを決めるのは、アプリのコードです。
配置の形
フラグを使うサービスの各ノードに、ChirpsとAlopex DBを組み込みます。合意のための別のクラスタは要りません。
Alopex ChirpsとAlopex DBが合う理由
機能フラグは、全ノードで同じ設定になることと、変更をあとから追えることが要です。Chirpsは、Raftで変更の順序をそろえ、Alopex DBは、その結果と履歴をSQLで読めるテーブルに残します。
コードで見る
フラグの変更履歴はAlopex DBが持ちます(変更の順序の合意はChirpsのRaft)。履歴と現在値を引く中心だけを取り出したコードです。
import alopex
# 変更の履歴は Alopex DB(変更の順序の合意は Chirps の Raft)
db = alopex.Database.open("launchdarkly.alopex")
db.execute_sql("""
CREATE TABLE IF NOT EXISTS flag_changes (
flag_key TEXT,
who TEXT,
enabled INTEGER,
changed DATE
)
""")
changes = [
("new-ui", "aya", 0, "2026-10-18"),
("new-ui", "ken", 1, "2026-10-20"),
]
for flag_key, who, enabled, changed in changes:
db.execute_sql("INSERT INTO flag_changes (flag_key, who, enabled, changed) VALUES (?, ?, ?, ?)", [flag_key, who, enabled, changed])
# いつ誰が何を変えたかを、履歴から新しい順に引く
print("-- 変更履歴")
for row in db.execute_sql("SELECT changed, who, enabled FROM flag_changes WHERE flag_key = ? ORDER BY changed DESC", ["new-ui"]):
print(" ", row["changed"], row["who"], "ON" if row["enabled"] else "OFF")
# いまの値(最新の変更)を出す
now = db.execute_sql("SELECT enabled FROM flag_changes WHERE flag_key = ? ORDER BY changed DESC LIMIT 1", ["new-ui"])[0]
print("現在:", "ON" if now["enabled"] else "OFF")いつ誰が何を変えたかをSQLで追え、最新の変更が現在値になります。全ノードで同じ順序に反映する合意は、ChirpsのRaftが受け持ちます。
フラグの変更をRaftでそろえ、履歴をSQLで追えるAlopex ChirpsとAlopex DBで、機能フラグの配信を作ってみよう。GitHubのクイックスタートから始められます。