<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>P2p on M1KE BL0G</title><link>https://www.m1ke.org/tags/p2p/</link><description>Recent content in P2p on M1KE BL0G</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><copyright>mike</copyright><lastBuildDate>Thu, 30 Apr 2026 23:12:00 +0900</lastBuildDate><atom:link href="https://www.m1ke.org/tags/p2p/index.xml" rel="self" type="application/rss+xml"/><item><title>とある分散システムの設計で使ってた概念の棚卸し</title><link>https://www.m1ke.org/p/%E3%81%A8%E3%81%82%E3%82%8B%E5%88%86%E6%95%A3%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E8%A8%AD%E8%A8%88%E3%81%A7%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%9F%E6%A6%82%E5%BF%B5%E3%81%AE%E6%A3%9A%E5%8D%B8%E3%81%97/</link><pubDate>Thu, 30 Apr 2026 23:12:00 +0900</pubDate><guid>https://www.m1ke.org/p/%E3%81%A8%E3%81%82%E3%82%8B%E5%88%86%E6%95%A3%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E8%A8%AD%E8%A8%88%E3%81%A7%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%9F%E6%A6%82%E5%BF%B5%E3%81%AE%E6%A3%9A%E5%8D%B8%E3%81%97/</guid><description>&lt;img src="https://www.m1ke.org/p/%E3%81%A8%E3%81%82%E3%82%8B%E5%88%86%E6%95%A3%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E8%A8%AD%E8%A8%88%E3%81%A7%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%9F%E6%A6%82%E5%BF%B5%E3%81%AE%E6%A3%9A%E5%8D%B8%E3%81%97/system.jpeg" alt="Featured image of post とある分散システムの設計で使ってた概念の棚卸し" /&gt;&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;とある分散システム上で売買を行うシステムの、UML設計をする仕事をしていた&lt;/li&gt;
&lt;li&gt;そのシステム上で、売買は平等なノード間で行われ、設計が大事だった&lt;/li&gt;
&lt;li&gt;その時にSLAやTX性能など色々検証していたので、そのメモの一部を残す&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ネット取引の本質"&gt;ネット取引の本質&lt;/h2&gt;
&lt;p&gt;インターネット上の売買システムについて考える機会があった。結論以下になった。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ネット上の売買ではtxをアトミックにしなければならない&lt;/li&gt;
&lt;li&gt;つまり、仲介者が本質的に必要だという事
&lt;ul&gt;
&lt;li&gt;理由は相対取引が不可能だから（例えば、直接物々交換するなど）&lt;/li&gt;
&lt;li&gt;なので、物とお金の交換で、どちらかが先にお金や物をgiveすることになる&lt;/li&gt;
&lt;li&gt;その結果、あとでgiveする方が有利になり、逃げる事＝カウンターパーティリスクが発生するから&lt;/li&gt;
&lt;li&gt;以下みたいな感じ
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Alice → Bob に送金
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Bob → Alice に送金する保証なし
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;仲介者抜きではネットの売買は成り立たないという事
&lt;ul&gt;
&lt;li&gt;三方良しにしないとこのメカニズムは成り立たない。&lt;/li&gt;
&lt;li&gt;二人だけだと利益相反であり、３人だともう一人に利益を渡してインセンティブが無いと、持ち逃げされるから&lt;/li&gt;
&lt;li&gt;ブロックチェーンだって、OpenSeaみたいな仲介者がいないと本質的に成り立たない&lt;/li&gt;
&lt;li&gt;エスクロー取引が必要という事&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="要件定義"&gt;要件定義&lt;/h2&gt;
&lt;h3 id="ノックアウトファクター"&gt;ノックアウトファクター&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;他の条件がどれほど優れていても、その要素を満たさない（または満たしてしまう）場合に即座に不採用・却下となる致命的な要因・要件のこと&lt;/li&gt;
&lt;li&gt;これじゃぁ無理と言われる要項&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="非機能要件"&gt;非機能要件&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セキュリティ要件&lt;/li&gt;
&lt;li&gt;法的要件&lt;/li&gt;
&lt;li&gt;ネットワークのアクセス要件&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="システム検証"&gt;システム検証&lt;/h2&gt;
&lt;h3 id="検証の5要素"&gt;検証の5要素&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;運用&lt;/li&gt;
&lt;li&gt;パフォーマンス&lt;/li&gt;
&lt;li&gt;開発コスト&lt;/li&gt;
&lt;li&gt;ランニングコスト&lt;/li&gt;
&lt;li&gt;セキュリティ&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="検証結果の共有の三要素"&gt;検証結果の共有の三要素&lt;/h3&gt;
&lt;p&gt;検証・実験・試験は次の三つがミニマムで必要。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;前提&lt;/li&gt;
&lt;li&gt;結果&lt;/li&gt;
&lt;li&gt;結論&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="用語"&gt;用語&lt;/h2&gt;
&lt;h3 id="信頼性可用性の観点"&gt;信頼性・可用性の観点&lt;/h3&gt;
&lt;h4 id="rasis-ras"&gt;RASIS, RAS&lt;/h4&gt;
&lt;p&gt;コンピュータシステムの信頼性を評価する5つの指標。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reliability（信頼性）&lt;/li&gt;
&lt;li&gt;Availability（可用性）&lt;/li&gt;
&lt;li&gt;Serviceability（保守性）&lt;/li&gt;
&lt;li&gt;Integrity（完全性）&lt;/li&gt;
&lt;li&gt;Security（機密性）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="セキュリティの三要素-cia"&gt;セキュリティの三要素 (CIA)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;C: 「機密性」（Confidentiality）&lt;/li&gt;
&lt;li&gt;I: 「完全性」（Integrity）&lt;/li&gt;
&lt;li&gt;A: 「可用性」（Availability）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="sli-slo-sla"&gt;SLI, SLO, SLA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Service Level Indicator&lt;/li&gt;
&lt;li&gt;Service Level Objective&lt;/li&gt;
&lt;li&gt;Service Level Agreement&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;別の言い方をすると&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SLI → 何を測るか&lt;/li&gt;
&lt;li&gt;SLO → どの水準を目標にするか&lt;/li&gt;
&lt;li&gt;SLA → どの水準を契約・合意として扱うか&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="slo-service-level-objective"&gt;SLO (Service Level Objective)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;レイテンシ
&lt;ul&gt;
&lt;li&gt;予測値
&lt;ul&gt;
&lt;li&gt;100ms (TTFB; 99.9パーセンタイル)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;通信してから帰ってくるまで&lt;/li&gt;
&lt;li&gt;curlでいう、time_starttransferのTTFB (Time To First Byte)&lt;/li&gt;
&lt;li&gt;単一リクエストに対する応答遅延&lt;/li&gt;
&lt;li&gt;API呼び出し、DBアクセス、ネットワーク往復などの単位で見る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;スループット
&lt;ul&gt;
&lt;li&gt;予測値
&lt;ul&gt;
&lt;li&gt;xxx req/s (書き込みで)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;秒間に書き込めるTXの数&lt;/li&gt;
&lt;li&gt;apache benchmarkなどで実施する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;コスト
&lt;ul&gt;
&lt;li&gt;予測値
&lt;ul&gt;
&lt;li&gt;TBD 円/s&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;インスタンス費用とスループットから算出&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ターンアラウンドタイム
&lt;ul&gt;
&lt;li&gt;予測値
&lt;ul&gt;
&lt;li&gt;xxx ms&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;リクエストを送ってから帰ってくるまで&lt;/li&gt;
&lt;li&gt;実際にAPIを実行して何秒で返ってくるか&lt;/li&gt;
&lt;li&gt;業務処理やジョブ全体が完了するまでの時間&lt;/li&gt;
&lt;li&gt;例: 注文作成から確定まで、審査開始から完了まで&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;同時接続数
&lt;ul&gt;
&lt;li&gt;予測値&lt;/li&gt;
&lt;li&gt;同時に接続できる数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="rams規格"&gt;RAMS規格&lt;/h4&gt;
&lt;p&gt;システムの安全性と信頼性のための規格&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;信頼性 (reliability)&lt;/li&gt;
&lt;li&gt;アベイラビリティ (availability)&lt;/li&gt;
&lt;li&gt;保守性 (maintainability)&lt;/li&gt;
&lt;li&gt;安全性 (safety)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="整合性可用性の観点"&gt;整合性・可用性の観点&lt;/h3&gt;
&lt;h4 id="txのacid特性"&gt;TxのACID特性&lt;/h4&gt;
&lt;p&gt;特にアトミック性と一貫性が大切。結果整合性もある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Atomicity（原子性）&lt;/li&gt;
&lt;li&gt;Consistency（一貫性）&lt;/li&gt;
&lt;li&gt;Isolation（独立性）&lt;/li&gt;
&lt;li&gt;Durability（永続性）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="分散システムのcapの定理"&gt;分散システムのCAPの定理&lt;/h4&gt;
&lt;p&gt;単一障害点（spof）をなくすことはここの可用性と関連。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一貫性 (Consistency)&lt;/li&gt;
&lt;li&gt;可用性 (Availability)&lt;/li&gt;
&lt;li&gt;分断耐性 (Partition-tolerance)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="base基準"&gt;BASE基準&lt;/h4&gt;
&lt;p&gt;高可用性を実現するための「システムの特性」のこと。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BA (Basically Available | 基本的に利用可能)&lt;/li&gt;
&lt;li&gt;S (Soft state | 厳密ではない状態遷移)&lt;/li&gt;
&lt;li&gt;E (Eventual consistency | 結果整合性)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="キャパシティ"&gt;キャパシティ&lt;/h3&gt;
&lt;h4 id="キャパシティプランニングの3つの観点"&gt;キャパシティプランニングの3つの観点&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;latency&lt;/li&gt;
&lt;li&gt;throughput&lt;/li&gt;
&lt;li&gt;turnaround time&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="キャパシティ-1"&gt;キャパシティ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;バックプレッシャー&lt;/li&gt;
&lt;li&gt;サーキットブレーカーパターン&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="分散システム"&gt;分散システム&lt;/h3&gt;
&lt;h4 id="分散システムのtxパターン"&gt;分散システムのTXパターン&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;2 Phase Commit
&lt;ul&gt;
&lt;li&gt;全ノードがコミットするか、それとも全ノードがコミットしないかのどちらかの状態になることを保障するプロトコル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3 Phase Commit
&lt;ul&gt;
&lt;li&gt;コミットリクエスト、コミット準備、コミットの3段階でメッセージをやり取りするモデル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sagaパターン
&lt;ul&gt;
&lt;li&gt;複数の状態変更を調整できリソースを長時間ロックすることがないよう設計されたアーキテクチャパターン&lt;/li&gt;
&lt;li&gt;Choreography (コレオグラフィ)と、Orchestrationパターンがある&lt;/li&gt;
&lt;li&gt;補償トランザクションの設計も必要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Try-Confirm/Cancelパターン&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="ノードのコンセンサスアルゴ"&gt;ノードのコンセンサスアルゴ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Paxos&lt;/li&gt;
&lt;li&gt;Raft&lt;/li&gt;
&lt;li&gt;BFT（Byzantine Fault Tolerance）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="二重実行冪等性"&gt;二重実行・冪等性&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;二重決済の問題&lt;/li&gt;
&lt;li&gt;二重注文の問題&lt;/li&gt;
&lt;li&gt;リトライ時に二重実行&lt;/li&gt;
&lt;li&gt;idempotency key&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="運用"&gt;運用&lt;/h3&gt;
&lt;h4 id="障害モデル"&gt;障害モデル&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fail-Stop障害モデル&lt;/li&gt;
&lt;li&gt;Fail-Recover障害モデル&lt;/li&gt;
&lt;li&gt;Byzantine障害&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="運用設計"&gt;運用設計&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;定期実施作業&lt;/li&gt;
&lt;li&gt;インシデント対応&lt;/li&gt;
&lt;li&gt;セキュリティ対応&lt;/li&gt;
&lt;li&gt;キャパシティプランニング&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="業務フローシステムフロー"&gt;業務フロー・システムフロー&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;アカウントの発行&lt;/li&gt;
&lt;li&gt;アカウントの審査&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="設計"&gt;設計&lt;/h3&gt;
&lt;h4 id="全体設計"&gt;全体設計&lt;/h4&gt;
&lt;p&gt;誰が何をやるで全体的な設計をする。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アクター・システム
&lt;ul&gt;
&lt;li&gt;エンドユーザー&lt;/li&gt;
&lt;li&gt;オペレーター&lt;/li&gt;
&lt;li&gt;アドミン&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ユースケース分類
&lt;ul&gt;
&lt;li&gt;エンドユーザー機能&lt;/li&gt;
&lt;li&gt;オペレーター機能&lt;/li&gt;
&lt;li&gt;アドミン機能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2つの詳細設計の方法"&gt;2つの詳細設計の方法&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;個別設計&lt;/li&gt;
&lt;li&gt;横断設計&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="usecase"&gt;Usecase&lt;/h3&gt;
&lt;h4 id="usecaseの必須項目"&gt;Usecaseの必須項目&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ユースケースID&lt;/li&gt;
&lt;li&gt;ユースケース名&lt;/li&gt;
&lt;li&gt;アクター&lt;/li&gt;
&lt;li&gt;目的&lt;/li&gt;
&lt;li&gt;パラメーター&lt;/li&gt;
&lt;li&gt;備考&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3つのフローとパラメーター"&gt;3つのフローとパラメーター&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;メインフロー = 期待通りに進む流れ&lt;/li&gt;
&lt;li&gt;代替フロー = 期待通りではないが、正常な別パターン&lt;/li&gt;
&lt;li&gt;例外フロー = エラー・失敗時の流れ&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="フローを進むための条件"&gt;フローを進むための条件&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;開始条件 = きっかけ&lt;/li&gt;
&lt;li&gt;事前条件 = 始める前の前提&lt;/li&gt;
&lt;li&gt;事後条件 = 終わった後の結果&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="確認項目"&gt;確認項目&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;シナリオテスト&lt;/li&gt;
&lt;li&gt;リーガルチェック&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="結論"&gt;結論&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;分散システムの設計は難しい&lt;/li&gt;
&lt;li&gt;特に障害点が無い代わりにスループットが上げにくい&lt;/li&gt;
&lt;li&gt;コンソーシアム型にしてもノード間のコンセンサスを取るのは大変&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>