あらゆる組織は重要なデータを扱っている。しかし、そのうちミッションクリティカルと呼べるのは一部にすぎず、その区別は規模や高度さの問題ではない。それは結果の問題である。データがミッションクリティカルになるのは、それが誤っていること、遅れていること、あるいは利用できないことが、非対称でしばしば取り返しのつかないコストをもたらす場合だ。古い価格で約定されたトレード、誰にも気づかれずに突破されたリスク限度、ダッシュボードがまだ緑を示している間にシステム全体へ広がっていく障害。こうした状況では、データの価値は保管にではなく利用にあり、その利用はある瞬間に縛られている。1時間後に正しく処理できたところで、問題を解決したことにはならない。問題を記録しただけである。
こうしたデータを真に難しくしているのは、単一の特性ではない。ミッションクリティカルなワークフローが、ほぼ常に二種類のデータを同時に必要とし、その二種類がまったく異なる振る舞いをするという点にある。動いているデータがある。ティック、イベント、継続的に到着しオペレーターの制御が及ばない更新である。そして静止しているデータがある。ポジション、参照レコード、履歴、動いているイベントに意味を与える蓄積された状態である。価格の変動はそれ単独ではほとんど意味を持たない。それが再評価するポジション、接近しつつある限度、そして帰属する対象と照らし合わされて初めて、大きな意味を持つ。動いているデータと静止しているデータは結合されなければならず、しかも今すぐ結合されなければならない。
ストリーミングシステムはデータを動かすために作られており、豊かな状態を保持し、それに対してアドホックな問い合わせに答えることは概して不得手である。データベースシステムは状態を保持し問い合わせに答えるために作られており、高頻度の変化を吸収し、着地した瞬間にそれを先へ押し出すことは概して不得手である。それぞれの方式は、相手が苦手とすることに最適化されている。両者を橋渡しし、動いているデータと静止しているデータを、負荷の下で、正確性を失うことなく継続的に整合させることは、一つのインピーダンスミスマッチであり、よく知られた症状の大半はここから生じる病そのものである。
これらの症状は通常、四つの特性として整理される。多様性、速度、量、そして正確性である。この部ではそれぞれを順に取り上げるが、それらを問題そのものではなく、あくまで症状として意図的に扱う。多様性が難しいのは、結合される対象が異なる形と異なる時計を持っているからだ。速度が難しいのは、結合に締め切りがあるからだ。量が難しいのは、結合が膨大なカーディナリティと履歴にわたって保たれなければならないからだ。正確性が難しいのは、上記すべてが流動している間も結合が正しくあり続けなければならないからだ。第五の特性である価値と、それを取り巻く経済性こそが、最初の四つすべてを正しい視点に置くものである。なぜならそれは、上級の意思決定者が実際に判断を下す特性であり、最初の四つが目立って無視している特性だからだ。
これらの特性はどれも、単独ではさほど難しくない。難しいのは、それらが決して単独では現れないということだ。
多様性は取り込みの問題ではなく、正確性の問題である
多様性についての通念的な読み方は、フォーマットの一覧である。構造化されたテーブル、半構造化されたメッセージ、非構造化されたテキスト、そして企業が取り込まなければならない、増え続けるフィードの雑多な群れ。この読み方は誤りではないが、問題の最も面白みのない部分を指している。フォーマットの多様性はおおむね解決済みの分野である。パーサーやコネクターは成熟しており、別のフィード形式を追加することは発明ではなくエンジニアリングにすぎない。ミッションクリティカルなシステムを実際に脅かす多様性は、もう一段深いところ、フォーマットの一覧が隠している三つの次元に潜んでいる。
第一は意味的な多様性である。二つのソースが構造については完全に一致しながら、意味については完全に食い違うことがある。あるシステムの「想定元本」は別のシステムの「エクスポージャー」であり、あるフィードの銘柄識別子は取引所シンボルに紐づけられ、別のフィードは内部のセキュリティマスターに、さらに別のフィードはベンダーコードに紐づけられている。それらを結合することは、列を揃える問題ではなく、列が意味するものを整合させる問題であり、その整合こそがエラーの潜む場所である。なぜなら不一致は、まったくもっともらしく見えて、まったく誤った数値を生み出すからだ。ここで参照データが結合組織の役割を果たす。動いているイベントを、それが実際に関係する対象へと解決するためのマッピング、階層、マスターレコードである。システムが多様性を扱う能力は、その大部分において、この結合組織を正確かつ最新に保つ能力である。
第二は時間的な多様性であり、最も見落とされやすい次元である。ソースは単に異なる形を持つだけではない。異なる時計の上で到着する。市場データフィードは毎秒数千回更新され、ポジションストアはトレードが約定されるたびに更新され、参照ファイルは一日に一度、時に遅れて、時に訂正を伴って更新される。これらの時計をまたいで結合するとは、入力が同じ瞬間にすべて最新であることが決してない状況で、「現在」が何を意味するのかを決めることである。速く到着するイベントを、少し前の時点で存在した参照レコードで拡充するのか、それとも今日のファイルが着地した後に存在するであろうレコードで拡充するのか。この問いに普遍的に正しい答えはないが、ミッションクリティカルなシステムは、それを意図的かつ一貫して答えなければならない。なぜなら、偶然に答えてしまうことこそが、再現も説明もできない数値をシステムが生み出す原因となるからだ。
第三はカーディナリティの多様性である。結合される対象が異なる粒度で存在するという事実だ。あるイベントは単一の注文に関係するが、それが影響するポジションは数百万のうちの一つであり、それが試す限度は、あるブック、あるデスク、ある法人、それぞれ階層の異なるレベルに属している。したがって、多様性をまたぐ結合が平坦なルックアップであることはめったにない。それは一つの走査であり、走査される構造それ自体が変化し続けている。
多様性がこのリストの先頭に置かれる理由は、それが問題全体を再定義するからだ。多様性を取り込みの問題として扱いたくなる。すべてを取り込み、正規化し、先へ進めばよい、と。しかし困難さは取り込みで終わるのではなく、そこから始まる。多様性は根本的に正確性の問題である。なぜなら、食い違う形、意味、時計、粒度をまたぐすべての結合が、自信を持って誤る機会となるからだ。残る三つの特性は、ある意味で、圧力の下で観察される多様性にほかならない。これらの結合が、速くもあり、大きくもあり、信頼できるものでもなければならないとき、何が起きるのか、である。
速度は速さではなく、締め切りである
速度は通常、速さとして説明される。データがどれだけ速く到着するか、毎秒のメッセージ数や更新数で測られる。その説明は正確でありながら、ほとんど役に立たない。なぜなら、速度単独では、それが問題かどうかについて何も語らないからだ。毎秒百万件の更新も、そのどれにも一時間の間何も依存していなければ取るに足らない。逆に毎秒わずか数件の更新でも、締め切りのある意思決定が最新の一件に依存しているなら危機である。速度が意味を持つのは、それを消費する対象と照らし合わされたときだけだ。だから速度について考える有用な方法は、それをデータの特性としてではなく、二つの時計の間の関係として捉えることである。データが変化する時計と、意思決定が下されなければならない時計である。
この再定義は、「速い」という言葉が覆い隠している一線を引く。速さとリアルタイムの間の線である。速さはスループットについての言明であり、バッチ処理も速くありうる。リアルタイムは締め切りに対するレイテンシについての言明である。システムがリアルタイムであるとは、イベントが発生してから、そのイベントが意思決定の行われる場所に反映されるまでの間隔が、その意思決定が許す予算の内側に収まっていることをいう。次の注文が送られる前にパターンを検知しなければならない監視ワークフローの予算は、ミリ秒で測られる。財務担当者の日中流動性ビューの予算は、秒あるいは分で測られる。重要な意味において、両者ともリアルタイムである。異なるのは予算の大きさであり、エンジニアリングを規定するのは生の速度ではなく、この予算である。
そこから二つの帰結が生まれ、そのどちらも本書を通じて繰り返し現れる。第一は、同じデータの消費者がしばしばまったく異なる時計の上で生きているということだ。ある価格に対して執行する機械は、あらゆる更新を機械の速度で必要とする。同じ市場の集約されたビューを見ている人間は、毎秒数千件の更新を知覚できないし、送られるべきでもない。それでも送りつければ資源を浪費し、その人に情報を与えるはずのビューそのものを劣化させる。したがって同じフィードを、どちらも誤って提供することなく、異なる消費者に異なる速度で提供しなければならない。この要件は、次の部でコンフレーションという名のもとに直接扱われる。
第二の帰結は、速度がその前後にあるすべてと相互作用するということだ。速度は多様性と相互作用する。なぜなら、結合はその入力のいずれかが変化するたびに再計算されなければならず、最も速い入力が結合全体のペースを決めるからだ。速度は量と緊張関係にある。なぜなら、高い速度を吸収するコストは、各更新がどれだけの状態に触れなければならないかに依存するからだ。そして速度は正確性を制約する。なぜなら、順序、完全性、訂正はいずれも、それらを確立する時間が少ないほど難しくなるからだ。要するに速度とは、他の特性が満たさなければならない締め切りである。それがデータの問題をシステムの問題へと変えるのだ。
量とはアーカイブではなく、稼働中のワーキングセットである
量についての通念的な読み方は、大きさである。テラバイト、ペタバイト、企業が蓄積するデータの純然たる総質量。この読み方もまた、問題の最も難しくない部分を指している。静止した状態での総サイズは、おおむね保管の問題であり、保管は安価でよく理解されている。コールドに保つことをいとわなければ、ほとんど何でも無期限に保持できる。ミッションクリティカルでリアルタイムなシステムを実際に脅かす量とは、アーカイブのサイズではなく、ワーキングセットのサイズである。すなわち、システムが同時に整合を保たなければならない、稼働中で、変化し、問い合わせ可能な状態の量である。その量は三つの異なる軸に沿って圧力をかけてくる。そしてそれが難しい理由は、これらの軸が足し合わされるのではなく、掛け合わされるからだ。
第一の軸はカーディナリティ、すなわちシステムが同時に追跡しなければならない、互いに異なる稼働中エンティティの数である。これらはウェアハウスに鎮座する行ではなく、気配を出している銘柄、稼働している注文、再評価されるポジション、監視している限度である。個々には小さなものだが、その数が単純に膨大であり、そのすべてが個別にアドレス可能で、個別に更新可能で、個別に最新でなければならない。これはディスクの問題ではなくメモリと整合性の問題であり、コールドストレージを安価にする手法では解決しない。稼働中のワーキングセットに関する問いには、アーカイブを走査して答えることはできない。なぜなら、走査が終わる頃には答えが変わってしまっているからだ。
第二の軸は履歴の深さである。システムがどれだけ過去まで手を伸ばさなければならないか、そして決定的に、その履歴が稼働中の現在と結合されなければならないかどうかである。要求に応じて取り出せばよいだけの履歴は、コールドストレージに置き、求められたときに取得すればよい。動いている今と継続的に比較されなければならない履歴、たとえばセッション高値、出来高加重平均価格、前日終値からの変化、あるいは移動基準線からの乖離などは、そうはいかない。それは稼働中の状態と並んで常駐し維持されなければならない。なぜなら、それを必要とする計算はあらゆる更新ごとに走るからだ。要求されているのは過去を保管することではなく、過去を現在に対して保持することであり、これはまさにインピーダンスミスマッチに立ち返る。静止しているレコードと動いているイベントが、同じ瞬間に同じ計算を占めなければならないのだ。
第三の軸は消費者の数、すなわち出力側に現れる量である。同じデータは通常、多くの消費者に同時に届かなければならず、そのそれぞれが異なる切り口、異なるビュー、異なる粒度を求めるかもしれない。一つのエンティティへの一つの更新が、それを見ている当事者の数に比例した作業を必要としうる。そして当事者の数それ自体が、データがどれだけ速く動くか、あるいはどれだけの量があるかとは独立した、一つのスケーリング次元である。
リアルタイムシステムにおける量の決定的な特性は、これらの軸が加算的ではなく乗算的だということだ。システムがしなければならない作業は、おおよそカーディナリティ掛ける更新率掛ける消費者数掛ける各更新が引き起こす結合の複雑さに応じてスケールする。軸が掛け合わされるため、量と速度を別々に論じることはできない。大きなワーキングセットに対する控えめなデータ速度で、しかも広いファンアウトを伴うものは、誰にも見られていない少数のエンティティに対する猛烈な速度よりも、はるかに要求が厳しいことがある。これはまた、素朴なスケーリングが期待を裏切る理由でもある。いずれか単一の軸を倍にすると総作業量が二倍を超えて増えうるため、総サイズにハードウェアを投じても、それは誤った量に対処しているのだ。
正確性は受け継ぐものではなく、維持するものである
正確性についての通念的な読み方はデータ品質である。入力がクリーンか汚れているか、正確か破損しているか。この読み方は誤りではないが、正確性を入力の側に位置づけている。あたかも正確性が、データが到着時点で持っているか欠いているかのどちらかである特性であるかのように。ミッションクリティカルでリアルタイムなシステムにおいて、正確性は、システムが継続的に維持しなければならない特性として理解するほうがよい。「このデータは正しいか」ではなく、「今まさに提示されているビューは、この瞬間に知りうる限りの世界を忠実かつ説明可能に表現しているか、そしてそのビューを後から再現できるか」である。この区別が重要なのは、静止した世界と動いている世界が、まったく異なる仕方で真実を確立するからだ。静止した状態では、真実は検証、照合、クレンジングを通じて、時間をかけて収束していく落ち着いたものである。動いている状態では、真実は決して落ち着かず、システムは入力が不完全に、順序を乱して、そして訂正を伴って到着する中で、忠実な描像を何度も何度も再確立しなければならない。しかもそのすべてを、他のすべてを支配するのと同じレイテンシ予算の内側で行うのだ。
第一の次元は完全性である。すべての入力が報告される前に実行された計算は、最も危険な形で誤った数値を生み出す。なぜなら、それが完成しているように見えるからだ。したがってリアルタイムシステムは、「答えはXである」と「今のところ答えはXである」を区別しなければならず、自分がそのどちらを提示しているのかを知らなければならない。完全な確信をもって描かれた部分的な描像は、描像がまったくないよりも悪い。なぜなら、それは行動を誘うからだ。
第二の次元は順序である。あらゆる状態を持つ計算にとって、イベントが適用される順序は結果を変える。そして分散した高速な環境では、イベントが到着する順序は、それらが起きた順序ではない。遅延した到着や順序を乱した到着は、処理時刻とイベント時刻を乖離させ、その差を無視するシステムは、決して起きなかった系列に対して自信を持って計算してしまう。これをうまく扱うとは、結果がどの時計に紐づけられているのかを明示し、遅れて来たものが、それが属していた瞬間がすでに過ぎ去った後に到着したとき何をするのかを明示することである。
第三の次元は訂正である。世界は自らを改める。トレードは修正され、プリントは取り消され、参照レコードは事後に再表示される。ミッションクリティカルなシステムは、自らが行動の根拠とした事実を最終的なものとして扱うことはできない。なぜなら、その事実は変わりうるからであり、変わったときには、その変化がそれに依存していた下流のすべてに伝播しなければならないからだ。ここが、第2部のデルタベース処理が、性能の最適化であることをやめ、正確性の要件となる地点である。なぜなら、追記しかできず、すでに出力したものを改められないシステムは、自らを改める世界において忠実であり続けることができないからだ。
第四の次元はデータ来歴であり、それとともに信頼がある。信頼とは、ある数値が正しいという主張ではない。それは、なぜそれが正しいのかを示す能力であり、あるいは何かが間違ったときに、なぜかを見つけ出す能力である。規制下の、そして高い結果を伴う環境では、この要求は再現性へと硬化する。同じ入力を、同じ順序で適用すれば、同じ結果を再現しなければならず、入力から出力に至る経路は検査に開かれていなければならない。説明できない数値は、たまたま正しかったとしても信頼に足らない。なぜなら、その正しさは頼りにすることも、擁護することもできないからだ。
これらの次元を総合すると、動いている状態での正確性が、静止した状態での正確性とは異なる分野である理由、そして速度こそがそれを難しくする理由が見えてくる。システムは、締め切りのもとで今十分に正しくあり、かつ締め切りなしに後から完全に照合可能でなければならない。これはインピーダンスミスマッチの最も鋭い形である。静止した世界は結合すべき落ち着いた真実を前提とするのに対し、動いている世界は暫定的な真実しか差し出さず、両者の間の結合は、常に後の訂正にさらされ続けるある瞬間において忠実でなければならないのだ。


