アーキテクチャ・デザインにとって重要なこと

本記事はMakuake Product Team Advent Calendar 2018の23日目の記事です。
今日は僕の誕生日です。誕生日の7時間をかけて書きました。笑
ようやく最後の章です。 Exampleは取り上げた例が特殊すぎたかな、とちょっと反省しています。 が、時間がない。次々いきます。 ※最後の章はほぼ思想論です。そういうのが好きでない人は読み飛ばしてください。 さて改めて考えてみます。 優れたシステム・アーキテクチャとはどのようなものでしょう? 第1章でも取り上げましたが、システムは「データを管理し、それを利活用すること」が目的です。 そして、データとそれを利活用した機能の間をどう繋ぐかはエンジニアの自由です。 すなわち、この自由がどう担保できるか、が、システム・アーキテクチャを考える上で最も重要なことです。 重要なポイントはいくつもありますが、あえて絞るとすれば、以下7つです。
  • Data lake managementは基本中の基本
  • BrushUp Point / Benefit Lineをできるだけ絞り込む
  • 採用するプログラミング言語やライブラリ・IaaS・SaaS・ミドルウェアの哲学や文化背景を知る
  • Abstract roles to build
  • 作るメンバーを知る(社会の中で・チームの中で)
  • 不自由なエンジニアリングを認識する
また、全勝までのArchitecture Exampleでは、ほとんど同じ概念のストラクチャモデルを使って様々なシステムのアーキテクチャーの特徴を解説しました。
そのくらい、システムアーキテクチャの基本的な考え方には共通点が多いのです。
もう少し実装よりのチームだとSLOの明確な定義と共により具体なインフラ・アーキテクチャ・マップとして起こすことになりますが、簡易的なMicroServiceであれば、この粒度の概念と基本的なService Unitがあれば、システムの実装は始めることができます。むしろ、サービスの目的に応じたdata lakeの設計に多くの時間を使うべきです。

Data lakeは基本中の基本

2章の①でも触れました。 1つのデータに対して様々な利活用を模索する現代では、data lakeは基本中の基本です。 データのモデリングはMVCの時代から機械学習全盛の現在に至るまで、プログラミング言語に閉じることなく様々なレイヤーで実現されてきた概念ですが、これをどう実現するのか、は、週末のお酒をやめて一向にふける価値がある、興味尽きないテーマです。

BrushUp Point / Benefit Lineをできるだけ絞り込む

システム・アーキテクチャの中で、本当にブラッシュアップし続けなければならないポイントは限られています。そうしたポイントをいかにAsility高い状態に置くことができるか。これは優れた設計を象徴する最終的な目的とも言えます。ここが様々な制約から解放された形を作り出せたら、アーキテクトの仕事の80%は終わったと言えるでしょう。 ビジネスはまた流動的にその姿を変えますから、システムが追随できなくなったときに、再びアーキテクトの眠れない日々が始まるのですが。 そうしたリファクタリング、リアーキテクチャもまた醍醐味のひとつです。

なぜプログラミング言語やミドルウェアの哲学や文化が重要なのか?

昨今変化の激しいエンジニアリング環境ですから、プログラミング言語やミドルウェアのキャラクターもどんどん変わっていきます。 その変化のエコシステムの中で、多くの言語やミドルウェアを運営する各チームはお互いが行き着く先に迷うことがないよう「こういう方針で開発を継続している」という指針を出しています。また、それはチームごとの独自の哲学により運営されています。 システムアーキテクチャのベストプラクティスは、勝手に変わっていっているのではなく、お互いが相互して変え合っているということを認識すべきです。 あなたのサービスが社会のエンジニアリング資産を再利用しているだけの存在に見えても、それは幻想でしかありません。 データの利活用の立場に立ったとき、ほぼ全てのサービスはその哲学に相互に影響し合っている。 ことWEBサービスにおいては、そのことは断言できます。

Abstract roles to build

「役割を抽象化して設計する」 この過程を省くと、社会にある様々なシステムが持つ哲学の「今」の姿に踊らされて設計することになってしまいます。 すると、社会の流れを見誤った設計を生み出しがちです。 このことからわかるように、抽象化はあなたが運営するシステムの哲学そのものになり得ます。 一見すると自社サービスと捉えがちな手元のサービスも、スクレイパーや検索エンジンからすれば一つのサードパーティツールであり、気付けば人間にとってのdata lakeだったりします。 このようなサードパーティエコシステムの中で社会のツールやミドルウェアの奴隷にならないためには、同じく意見を言い合える芯が必要なのです。 設計を抽象化して理想を生み出し、それを実現する方法を考え、また壁にぶつかって理想をを調整する。これはアーキテクチャが上手くなる唯一の方法といえるでしょう。 USのエンジニアはこのAbstract roles to buildの能力に長けています。 それは、設計が抽象化されていればいるほど、結合が疎になるからです。それを体現した近年の一つの例が、マイクロサービスであるとも言えます。 Reactive Manifestoに代表される様々な抽象概念を経て、今尚「本当に作りやすいアーキテクチャとはなんなのか」を追い求めているのです。 またAbstract roleと前述したunknown(不明)の概念を理解すると、機械学習の挙動を容易にシステム・アーキテクチャに取り入れることができます。 こうして新しいキャラクターを持つ概念やインフラキャラクターが現れても、システム・アーキテクチャのベスト・プラクティスを見出す優れた方法を探し続けることが今のベスト・プラクティスそのものなのではないかと僕は考えています。

作るメンバーを知る(社会の中で・チームの中で)

あなたの管理するシステムがPHPで作られていて、並列分散処理を実装しなければならない程度にサービスが伸びたとしましょう。 優秀なメンバーの中に「実はここはPHPではなくGoを書きたいんだ」という意見を持っているメンバーがいたとしたら、pthreadsではなくてGoを選ぶ価値が十分にあります。 優秀なメンバーであればあるほど「自然な環境」でコードを書きたいと願います。独特のガベージコレクト実装の中でメモリリークに怯えながら書く(最近は違うかもしれない)よりは、それに向いた言語の習得を選ぶ勇気を持つメンバーは、長期的にみてアーキテクトの掛け替えのない友となりえます。 また、逆にそうした勇気を持つメンバーがいない状態での「自然な環境」は、社会とシンクロしていないローカルな存在でありながら、それがそのチームにいとってのベストプラクティスである可能性が十分あります。 システム・アーキテクチャの正解は社会の中にのみ存在するものではありません。 それを共に運営していくメンバーの存在は、その何万倍も規模が大きい社会と同じくらい大きく、尊重すべき存在です。 そして、チームの中でアーキテクチャの話をする際に、上記の「Abstract roles to build」を忘れないようにしてください。 ここからずれなければ、議論はどこまで深めても有用なものになり得ます。

不自由なエンジニアリングを認識する

最後になりました。(やっと書き終わる。笑) 上記のポイントを頭に入れたら、あなたにとって、チームにとって、不自由なエンジニアリングを探しに行きましょう。
  • より良いものを作ろうという活動の自由を奪うものを、不自由と呼ぶ。
  • 自由なエンジニアリングは「より自然に作れる状態」を言う。
その感覚を認識したときには、それはアーキテクチャの問題と捉えるべきです。アーキテクチャを再構築することを厭わないでください。 すでに不自由な状態に陥ったエンジニアリングの中での自由を探し出し、実現する道のりは長いですが、成長し続けているサービスであれば、その価値は十分にあります。 以上、MakuakeのCTO からのメッセージでした。

この記事はシリーズです。

一緒に「世界をつなぎ、アタラシイを創る」エンジニアを募集しております。ご興味持っていただけた方は、「各種エンジニア募集! クラウドファンディングMakuake」からご連絡ください。

Architecture Example ③:自販機公衆WiFi&サイネージ・システム

本記事はMakuake Product Team Advent Calendar 2018の23日目の記事です。
今日は僕の誕生日です。誕生日の7時間をかけて書きました。笑
最後に、ちょっと組み込み機器が混ざった、リアルマイクロサービスか?とも言える様なシステム・アーキテクチャを紹介しましょう。 簡単に解説すると、自販機に液晶ディスプレイを組み込み、広告映像を配信するシステムです。 いくつかある主要な機能要件の中でこのアーキテクチャの肝となるのは以下の5つです。
  • 動画配信のための自販機組み込みプレイヤー(自販機のオープンスペース格納でき、余剰電力で稼働できるハードウェア)
  • 配信動画のスケジューリング・配信最適化アルゴリズム(これは後に動画Adとの連携により自動化されました)
  • 4G to WiFi Transform router
  • 閲覧者の判別と log management
  • アップデートと保守(点在した端末の管理)
全体としては以下の様な構造になってます。 ||| 構造図 |||
ハードプェアっぽい生理になっているが、本当はシステム・アーキテクチャとしての整理方針に揃えた方が見やすいかも。後日差し替えるかもしれません。

ポイント1:組み込みプレイヤー

まず、変えられない前提条件から見ていきましょう。 世の中の映像フォーマットのほとんどがh.264の時代でした。これは変更がきかない前提条件です。 また自販機は結構電力を食う上に、外気温に大きく左右されますから、実のところ組み込み前提の平均余剰電力って20W/hくらいしかなく、これで機能できるハードウェアとOSを積むことになります。 そして、最も辛いのは「ダメな時は落ちる」が前提になっていることです。当然プレイヤーもそれに付き合うことになります。 今だとこんな構成になるでしょう。
SBCROCK641080pを無理なく再生できるGPUを積んで10W程度で稼働できる SBCはいくつかありますが、コスパの面でこれになります
エンコーダーなし当時はハードウェアエンコーダを積みましたが、今ではSBCのGPUで十分ですね。
モニターOCB型低温高音・多湿などにも対応できる環境耐性のあるものを選択する必要があります。これは車載用ディスプレイとほぼ同じ機能要件です。ディスプレイ業界の進化は本当にすごい
電源モバイルバッテリー簡易UPSとしてモバイルバッテリーを利用します。これで瞬断どころか1~2時間の停電くらいであれば自販機は死んでもネットワークとサイネージのみが生き残りますし、基本的には自販機は災害でもない限り瞬断と入れ替え停止のみで済むので、停電時計測ノイズは無視できます。できない場合はUPS必須。
DatabaseH2Calculated Algorismをハンドリングするために、SQLiteよりは少し複雑なSQLを叩ける必要があり、PostgreSQL互換のこいつを採用しています。この案件は2011年ころのものですが、今でも組込系なら他に選択肢ないんじゃないかなぁ
Application Lang.jphpH2のせいでJREを積む羽目になる+アプリケーションはシンプルなので、ランタイム分の容量節約の意味も込めてJPHPを利用します。今だったらjrubyでもjythonでも何でもいいですね
記録媒体USBメモリ安価に調達できるものの中ではSDカードに次いでに低電力です。個体差がないのもとても扱いやすい のと、データレート的にも十分です。SDカードはスロットがSBCに採用されるケースが少ないので、必然的にUSBメモリとなります
CameraUSBカメラ動画視聴中の人を判別するためのカメラです。性別・年齢・ライフステージ・存在時間を計測するだけですが、24時間計測になるため、できるだけ暗所に強いものが求められます

ポイント2:配信動画のスケジューリング

端末は1,200台ありました。 それぞれに定常時の再生スケジュールと、来客時の配信アルゴリズムを設定してあげる必要があります。 このスケジューリング・配信最適化アルゴリズムを1台1台入れ替え流のは不可能なので、必然的に遠隔保守を構築する必要があります。 また、SBCにアルゴリズム計算をやらせると当然すぐに電力過多+自己発熱で死んでしまうので、基本的にはSBCの中ではCalculatedなデータとしてパースするだけで済む様に構成してあげる必要があります。こうすることで、アルゴリズム計算をホストサービス上で実装することができ、非力で便利なCircuitRunを使える様になります。 ※独自アルゴリズムは3年目で動画Adネットワークに接続されることで不要になりましたが、Calculatedパターンは組み込み配信では必須で、これは継続となりました。 | 配信アルゴリズム | CircuitRun(Python) | 

ポイント3:4G to WiFi Transform router

お気づきかと思いますが、アーキテクチャのポイントは一貫して低電力環境でいかにしてシステム駆動を実現するかです。 ネットワーク機器はハンドリングをミスると電力マネジメントに致命的な影響を及ぼしますので、非常に重要なポイントになります。 また、routerと映像再生は全く違う性能傾向を持つ(Computing resourceの使い方が違う)ので、まぜるな危険(いざという時にカーネルチューニングができる範囲が少なくなる)です。 端末を別で設計する際の着目点は性能傾向です。これはマイクロサービス設計にも通じる点です。
SBCROCK64WiFiモジュールを積んでいるのが1つの条件です。自販機WiFiは範囲が狭くていいので、SBCのWiFiモジュールで性能的には十分です
RouterOSMikroTikRouterOSはいくつか選択肢がありますが、保守性とSBCへの対応状況を考えると1つの最適解はMikroTik社のものになります。I/Fやコマンド系統にもクセがなく、扱いやすいです
4G今ならLPWA / eDRX4Gは通信規格よりは「その土地の電波状況」に大きく消費電力が左右されるので、幅広めの通信規格に対応しているものを選びます。
また、Router SBC と 動画配信SBCを WiFiでつないでいるのは、動画データのやり取りなどをするHigh MTU環境下では有線 to WiFiのスプリットコストが高いためです。 常時接続の安定性を求めない限りは、消費電力の点でも有利です。 2016年の論文ですが、最適な動画データやり取り時のMTUを算出する上でもかなり有用な考察になるので、参考掲載

ポイント4:閲覧者の判別と log management

LogデータはOpenCVベースに作られたアプリケーションで採取します。
  1. プロファイルデータを現在配信すべき映像の選定に用いる
  2. 閲覧興味度・滞在時間・滞在時刻などをフィードバック
が主な目的です。 ここでのポイントは「リトライ」と「不明」の取り扱いです。
リトライの話
SBCなどがアーキテクチャに入ってくるモデルの場合、SBCの環境がシビアであればあるほどSBC側の責務は疎通までにするのがいいと思います。 SBCから音沙汰があった場合、反応・応答が完了するまでリトライするのはホストサービスの役割にすべきです。 SBCの方が圧倒的に「予期しないエラー」に見舞われる可能性が高いからです。 これはQueueの概念をアーキテクチャに持ち込むときの責務関係の実装方針を決める際にもほとんど同じモデルでの検討になります。
不明の話
「不明」はデータなのか、データではない(エラー)なのか は、OpenCVなどが出てきて「測定がファジーな状態になってしまう」ことが当たり前な時代になって真剣に考えられる様になってきた側面ですが、一昔前は「不明とはできるだけあってはならない」というバイアスがありましたので、この当時のシステムでも、「できるだけ近い傾向に寄せる」という方針で「不明なし」という設計方針で実装されました。 しかし、最近はAIなどもシステムアーキテクチャのキャラクターとして出てくる様になって「どのくらい不明なのか」という指標もセット「不明なものは不明」という、もう少し論理的な「不明」に対する取り扱いが求められる様になってきました。 もう少ししたら、多くのプログラミング言語には、「null = 価値が存在しない」の様に「unknown = 不明」という概念が1つの型として追加されてくるかもしれません。 「不明」はベロシティを持つ概念として今絶賛研究されていて、データストラクチャとして新しい概念なのです。

ポイント5:アップデートと保守(点在した端末の管理)

ネットワークと動画配信を別な機器(別サービス)にした理由の大きな一つが、このアップデートと保守の考え方です。 1,200台のアップデートを4G回線を使って行うとなると、当時の回線試算で1台あたり3.5時間程度はかかる見込みでした。1,200台同時にアップデートも、1台1台アップデートも、ローリングデプロイも、どれも現実的な解になりえませんでした。 その多くはデイリーで行われるログのフィードバックと動画データの入れ替えによるネットワーク通信の待機時間で、Releaseそのものは数秒で済んでしまうという環境でしたので、当時はLocal BitTorrentを用いた波状型のデータトランスファ方式を用いました。 それでも数台はエラーが起きますので、そうした際には当時はリトライしか方法がありませんでしたが、今であれば検証性の検証にTemporary (Forked) blockchainなどの応用も有効かもしれません。

まとめ

ちょっとWEBから外れた話題が多い組み込み系の話なのですが、両方やっている身からすると、マイクロサービスの設計と組み込み系機器の構成の設計は「制約条件の確認」→「性能傾向のアレンジ」という初期の方針策定プロセスが非常によく似ていますので、紹介しました。

この記事はシリーズです。

一緒に「世界をつなぎ、アタラシイを創る」エンジニアを募集しております。ご興味持っていただけた方は、「各種エンジニア募集! クラウドファンディングMakuake」からご連絡ください。

Architecture Example ②:WEB接客システム

本記事はMakuake Product Team Advent Calendar 2018の23日目の記事です。
今日は僕の誕生日です。誕生日の7時間をかけて書きました。笑
僕はこのタイプのシステムを人生で2度作るという経験をしました。(3度目の依頼がある) WEBシステムの中でも「大量のアクセスやシビアなシステム間連携からユーザーの属性や行動パターンを元に最適なコンテンツを判別し、出し分ける」というかなりADの配信サーバに似た設計思想になります。 ので、アドテクぽい設計の話は既存の社会資産 に譲るとして、このセクションはアドテクとWEB接客システムの最も違う点にフォーカスします。

CalculatedとProximate、Facedの同居

両者が最も異なる点は、WEB接客は
  • Calculated(大量のデータを元に算出し、サマライズした結果データ。よく混同されますが、BTAやシナリオ配信もこっちに含まれます)
  • Proximate(直近の行動データ)
  • Faced(今、何してる?)
が同居する点です。 最近はネイティブ・アドや動画ADなど、レコメンドの精度を重視するアドテクであればあるほど、訪問してからの感情反応データに着目する様になってきましたが、それを自社でやるというのがWEB接客ですから、Calculatedを来店(WEB訪問)時の前提として取得し、Proximateを観察しながら最終的なFacedに対して施策を出し分けていくというスタイルでのシナリオ設計をします。 この二つのデータは求められる性質が全く異なります。
  • Calculatedへの最重要要求:妥当性
  • Proximateへの最重要要求:正確性
  • Facedへの最重要要求:網羅性
Calculated、Facedへのアプローチはアドテクに習うところがたくさんあります。(というか、そのまま参考になる) が、Proximateへのアプローチは他に例がなく、苦労した点でした。 Proximateへ求められる正確性の例としては「来店者が男性であった場合、2回目の訪問で、初めに見たページがAで、次に見たページがBであった場合に指定したコンテンツを出したい」というものです。 構造は以下のようになっています。
3種類のデータを掛け合わせてActionをFeedbackする。
男性である点、2回目の訪問である点はKVSに保存されたCalculatedで判断できます。 次にページBについて、見たということを「記録する」のと「活用する」のタイミングが一緒に来ます。 なので、data aggregatorを介在して、保存されているProximateとたった今のFacedを統合しないと最終的なユーザーのステータスを判別できません。 Write / Readを使い分ける規模のアプリケーションを組んだことがある人ならばわかると思いますが、AuroraなどのクラウドデータベースはWriterへの書き込みからReaderからの読み取りまで、数ms~数十msのタイムラグがあります。 APIがそのタイムラグを待ってからレスポンスを返していたら、すぐにConnection数がいっぱいになってしまうので、そうならない様にFacedの概念が存在します。
Faced datastoreはbrowser上のcookie等を用います。session storeでも追いつかないからです。
さらに、Proximateが本当に正確かどうかを担保する必要があります。 ユーザーが次のページを見たときに、上記Queueで正確に書かれているかどうかを判別する必要がるのです。 これには二つの確認が必要です。
  • Databaseには既にページAを見たデータが書かれたか(Proximatedに含まれているか)
  • DatabaseにはなぜページAを見たデータが書かれていないか(Proximatedに含まれていない理由)
FacedはProximatedに正常に含まれるまでの揮発性データとしてハンドリングしなければなりません。 この時点で、ユーザーのブラウザはシステムの中のスケーラブル&アンコントローラブルな1アプリケーションとして考える必要があります。

Datastoreが発行するエラーの正確性

ここで着目したいのは、Datastoreが発行するエラーの正確性です。 Memcachedは非常にキャパシティの広いdatastoreですが、アーキテクチャの性質上「書きこめなかったことを正常にエラーで返せなくなる」ことがあります。これは、他のKVSでも同じ傾向が見られます。 対してRDBMSは、書きこめなかったことに対してのエラーバック率が、構造上ほぼ100%です。(落ちた場合も含めて)
2,000万inserts/s を5秒当てた場合のエラードロップ実験
Datastorereqsreceivedwaiterrors
Aurora100,000,00032,343,25563,221,4444,435,301
Memcached100,000,00078,834,12020,556,001609,771
Memcachedの方は数字が合いません。この分はerrorがドロップしているのです。 エラーはリトライすれば良いし、そのリトライが済むまでの間はFacedがProximatedの正確性を補完してくれます。 そのシステムは直前データの可用性担保目標を1,500msに設定していましたから、このデータエラーのドロップゼロは非常に心強く、どんなに書き込みレートが低くとも、そこに最終的に書かれているはず、を期待する先はAurora以外はありえせんでした。 上記は最もシンプルな例ですが、国内で作った方のシステムでは WEBフローティングウィンドウ上でのチャットも機能として実装していましたから、サードパーティのワンライナータグツールでありながら、かなりアプリケーショナブルなFrontendを提供しているサービスでした。

この記事はシリーズです。

一緒に「世界をつなぎ、アタラシイを創る」エンジニアを募集しております。ご興味持っていただけた方は、「各種エンジニア募集! クラウドファンディングMakuake」からご連絡ください。

Architecture Example ①:車のボディへの塗装噴霧コントロール

本記事はMakuake Product Team Advent Calendar 2018の23日目の記事です。
今日は僕の誕生日です。誕生日の7時間をかけて書きました。笑
最初にdata lake managementの話をしたいので、ちょっとWEBから外れた話をします。(話題にする箇所のプロトコルはRESTですので許してください) 車のボディにカラーを噴霧塗布する装置がありますが、その噴霧を最適化するための機械学習型コントローラの話です。

ここでしない話

以下は話題が組み込みに寄りすぎるんで割愛します。
  • 噴霧機のコントロールI/Fの話
  • 噴霧状況と、塗布クオリティを確認するセンサーのI/Fの話

塗料のデリケートさに関連するパラメータ

塗料は本当にデリケートで、どんなに均一に塗られた麺を見ても、X-Lay Scannerで見ると少なからずまだら模様になっています。 こうしたマダラの薄いところから錆が浮いてきたり、厚いところの塗装がペラっと剥がれてきたり、ということが経年劣化とともに起こるのですが、均質な塗装は互いが補完しあって長持ちするとされており、そうした状態を目指して自動車の塗装工場では塗布機に様々な工夫が凝らされています。
  • 天気
  • 気温
  • 湿度
  • 定着照度
  • 室内照度
  • ボディの表面温度
  • 直前に塗布した塗料の付着率
など、様々なパラメータを解析しながら最適な噴霧量と噴霧圧を決めています。 こうした噴霧クオリティの最適化を自動化するために、機械学習型を導入するというプロジェクトでした。 サーモセンサー・X-Rayグラフ・Weather API・照度計など、様々なセンサーやpublic APIなど、様々なセンサーと接続し、データを集めます。 昔はどんなセンサーもSerial接続でしたが、今はほぼみんなREST APIを持っています。便利な時代になったもんです。 最終的な性能要件では、10秒単位で噴霧量と噴霧圧をコントロールし続けるとの希望です。
data lakeは要件の違う分起こすことになるが、解析自体はゆっくりでいいため、Proximateの段階で分けたりはしない。

性能要件の実現ジャーニーと切り分け

こうしたシステムの場合、要望として出る性能要件とセンサリングからのインプットを真に受けてストレートに実現しようという形ばかりが正解であるとは限りません。要は
  • 入口:様々なセンサーのデータを取得している
  • 出口:10秒単位で状況に応じた噴霧の最適化ができている
という点さえ克服できればいいわけです。 あとは、エンジニアの自由です。 これを実現するため、また、秒単位でドンドン蓄積していくデータを有効活用するため、という2軸があって、機械学習の導入が決まりました。 具体的には以下の様なステップを設計します。
  1. もれなく)センサーからのデータを収集
  2. 研究対象)データをモデリングしてdata lakeを生成し、raw dataはバックアップへ(バックアップはブラッシュアップが済んだら捨てる想定)
  3. 研究対象)噴霧データへのCalculate
  4. 正確性・回復性)噴霧コントローラ(1のデータも利用)
  5. もれなく)噴霧状況のフィードバック → 1に戻る
こうした角度で設計をあらかじめ済ませておくと、どこを先に固く作って、どこを柔らかく始めれば良いかが見えてきます。 また、1、4、5などの性能傾向が固い箇所は、それに合わせたアーキテクチャを採用し、できうる限り中に閉じた状態でシンプルに作り、他のシステムとの疎結合化を図ります。
黄色い箇所は実装の早い段階でArchitecture freezingし、ほぼ変更を加えない形とした。
||| 構造図 |||

data lake management

data lakeは「データを活用できる状態にすること」です。 どう活用できる状態になっているべきなのかを管理するのがdata lake managementです。 アーキテクチャ上は、溜まっているデータそのものに意味も価値もなくて、data lakeが済んだ状態で初めて価値が出ます。 なので出自が同じデータでも、その活用の方向性や頻度によって、全く違う保存の仕方を複数のdata storeに対して行うことがよくあります。 これは、入れたデータを万能に活用できるデータストアがまだ存在しないからです。 データストアそれぞれが特徴的な性能傾向を有している2018年では、アプリケーションエンジニアにはそれらをうまく使い分ける動きが求められます。 僕はよくdataの用途と傾向に合わせて
  • Faced(今目の前)
  • Proximate(計算しないでそのまま使う)
  • Calculatable(計算前のゴミ箱手前)
  • Calculated(計算後の即戦力)
  • Trash(ゴミ)
の4つのstatusを認識します。 これをセンサーデータに当てはめるとこうなります。
  • Faced
    • 室内照度
    • ボディの表面温度
    • 直前に塗布した塗料の付着率
  • Proximate
    • 定着照度
    • 天気
    • 気温
    • 湿度
  • Calculatable / Calculated
    • 定着照度
    • 天気
    • 気温
    • 湿度
    • 室内照度
    • ボディの表面温度
必ずしもmeceには分かれません。というか、meceには基本なりません。 活用目的が違うと、データは別なものと捉えるべきだからです。 そしてmeceでなければ、当然data to lakeに可逆性もありません。 こうしたdataのライフサイクルがはっきりしているシステムはdata lakeが作りやすい。 逆にいうと、データの活用を前面に押し出していきたいシステムであればあるほど、このデータ収集から活用までのステップを明確にすることが大切です。 そして、ブラッシュアップポイント(変更が著しく性能に影響する箇所)をできるだけ小さく切り出すこと。 これが、層の深いdata lake managementを求められるシステムアーキテクチャ設計のコツです。

この記事はシリーズです。

一緒に「世界をつなぎ、アタラシイを創る」エンジニアを募集しております。ご興味持っていただけた方は、「各種エンジニア募集! クラウドファンディングMakuake」からご連絡ください。

システム・アーキテクチャのデザインパターン

本記事はMakuake Product Team Advent Calendar 2018の23日目の記事です。
今日は僕の誕生日です。誕生日の7時間をかけて書きました。笑
WEBエンジニアにとっての最もシンプルなアーキテクチャ・デザインは前章で紹介したような静的なhtmlで作成され、WEBサーバに乗った例でしょう。 ようやく最後の章です。 本当は網羅的に解説するにはあと5つくらいの例が必要ですが、公開時間の関係で、その中でも最も基礎的な3例を紹介します。 続きは要望があれば、どこかのイベント用の資料にでも起こして解説します。 なお、全体的に一般的と思われるアーキテクチャについては社会資産がたくさんあるので、省きました。Let’s Google!

今回紹介するアーキテクチャ・デザインパターン

①車のボディへの塗装噴霧コントロール(data lake managementを基本的なアーキテクチャ・モデルを通じて考える) ②WEB接客システム(性能傾向の違うデータハンドリングをどう整理するかと、RDBMSの目立たない利点の話) ③自販機公衆WiFi&サイネージ・システム(マイクロサービス構想と組み込み機器中心のアーキテクチャの共通点)

機会があれば紹介する、ちょっと特殊なアーキテクチャ・デザインパターン

④遠隔演奏同期システム(オーケストラ版|音声のデータ化・演奏同期マネジメント・リカバリポイントの設計・ヘルシーさの算定・マシン・コントロールは専門性が高いので省きます) ⑤中型客船(航路フェリー)用のコンテンツマネジメントシステム(社会実装の活用と拠点deploy同期のコツ) ⑥多言語対応型スマホKIOSK(翻訳とコンテンツの切り分け方と、カスタマイズが多くなりがちなCMSの初期設計の留意ポイント) ⑦都道府県に拠点がある団体のための低ITリテラシー担当者向け会員マネジメントシステム(ダイナミックVPC・テクニカルな構造を採用しなければならない際の注意点) ⑧統合認証サービス(本質的な設計と、レガシーなシステムのぶら下がりに対しての対応案)

この記事はシリーズです。

一緒に「世界をつなぎ、アタラシイを創る」エンジニアを募集しております。ご興味持っていただけた方は、「各種エンジニア募集! クラウドファンディングMakuake」からご連絡ください。

システム・アーキテクチャのベストプラクティス?

本記事はMakuake Product Team Advent Calendar 2018の23日目の記事です。
今日は僕の誕生日です。誕生日の7時間をかけて書きました。笑
こんにちわ。よーへいです。 今日はMakuakeのAdvent Calendar 2018ということで、エンジニアっぽい記事を書いてみようと思います。 あまりみられないシステムアーキテクチャの総論みたいな記事です 全部詳細に書くと書籍規模の話になってしまうので、適度に省いて、世の中にある情報はリンクにバンバン流していきます。

目次

  • 前段として
    • システム・アーキテクチャとは何か
  • システム・アーキテクチャのプラクティス
    • あとがき
      • アーキテクチャ・デザインにとって重要なこと
        • 不自由なエンジニアリング
        • システムアーキテクチャ・デザインの要素と角度
          • 誰が作るのか(社会の中で・会社の中で)
          • 材料の哲学と未来
        • 重要なのは多くのベスト・プラクティスを知ることそのものではない
    こんな感じで書いています。

    システム・アーキテクチャとは何か

    基本的にはどんなシステムも「データを管理し、それを利活用すること」が目的ですから、これを実現する、あるいはある期間実現し続ける機能を提供することが命題です。 システム・アーキテクチャはそのために最も適した構造をデザインすることです。

    WEBエンジニアにとっての最もシンプルな例を考えてみます

    これは、よく言われる「データベースがない静的なWEB」であっても例外ではなく、例えば以下の様なシンプルなhtmlであっても、生内は北海道生まれであることを伝えるための成分を構造化し、データとして完成させた上でhtmlフォーマットに組み込み、webサーバーアプリケーションに乗せてUIとして表現することを目的としています。
    <html>
        <head>
            <title>生内の秘密について</title>
        </head>
        <body>
            <h1>生内には秘密があります</h1>
            <dl>
                <dt>出身地</dt>
                <dd>北海道生まれです</dd>
            </dl>
        </body>
    </html>
    
    この機能を実現するために、例えば以下の様にRDBMSに作成したtableにdataを保存し、それをruby、PHPなどから読み取って表示するという選択肢もあります。

    table name “ikunai_secrets”

    titlebody
    出身地北海道生まれです
    上記例では同じくRedisなどのKVSにkeyとvalueの関係で保存しても構いませんし、csvやjson、xmlファイルなどでももちろん問題がありません。 また、上記の様にストラクチャを変更したとしてもシステムの目的は何ら変わりません。 データと機能の間をどう繋ぐかはエンジニアの自由です。 そして、そのシステムに期待される
    • 機能拡張性(maintenancibility)
    • 変容への俊敏性(Asility)
    • 過酷な利用条件(Hard Enviroment)・利用状況(Scalability)への耐性
    • 間違いやエラーへの回復性(Resilience)
    • 何よりもそのシステムの寿命(Lifecycle)
    など様々な要素を鑑みると、おのずと決定すべき構造が見えてきます。 もし上記の例であなたが何らかのDatabaseの採用を検討していたならば、それは未来の機能拡張性、たとえば
    titlebody
    出身地北海道生まれです
    性別男です
    となる様な未来を思い描いていたからでしょう。 このように「今と未来の姿」を両方考えた時に、アーキテクチャ・デザインのパターンは無限に広がります。 次の章ではWEBに限らず、僕が実際に書いたり構築したり、または関わったほんの一部の特徴的なシステム・アーキテクチャを肝となるポイントの解説を添えた形で実例として紹介していきましょう。

    この記事はシリーズです。

    一緒に「世界をつなぎ、アタラシイを創る」エンジニアを募集しております。ご興味持っていただけた方は、「各種エンジニア募集! クラウドファンディングMakuake」からご連絡ください。