CPUのバスやネットワークなど様々な情報伝達経路において、ある領域から他の領域へ情報を転送する際、その転送遅延を極力隠蔽し転送効率を向上するために考案された記憶階層の実現手段
https://ja.wikipedia.org/wiki/キャッシュ_(コンピュータシステム)
さまざまなレイヤに存在する
Webフロントエンド
フロントエンドエンジニアが知るべきキャッシュを理解する
CPUのバスやネットワークなど様々な情報伝達経路において、ある領域から他の領域へ情報を転送する際、その転送遅延を極力隠蔽し転送効率を向上するために考案された記憶階層の実現手段
https://ja.wikipedia.org/wiki/キャッシュ_(コンピュータシステム)
さまざまなレイヤに存在する
Webフロントエンド
フロントエンドエンジニアが知るべきキャッシュを理解する
System Design for Tech Interviews
The System Design Primer
Grokking the System Design Interview
https://dev.37signals.com/introducing-solid-queue/
37signalsが開発した、DBをバックエンドとするキューライブラリgem
抱えていた課題
RedisとResqueを使ってきたが、要件を満たすにはpluginを含めて7つもgemをインストールする必要がありシンプルとは言い難い状況
Solid Cacheの経験を踏まえてDBをキューとして使うことを検討し始めた
https://dev.37signals.com/solid-cache/
RDBMSをストアとする37signals製のキャッシュライブラリ
抱えていた課題
キャッシュストアとしてはRedisやmemcachedを利用するのが一般的だが、メモリキャッシュのため高価
メモリアクセスはディスクよりも何倍も高速だが、ネットワーク時間、serialize、圧縮も含める操作時間の中ではごくわずか
https://kamal-deploy.org/
37signals製のデプロイツール
コンテナ時代用に再設計されたcapistranoの後継的な存在
Railsアプリケーション用に作成されたがRails以外でも使用できる
事例
クライアントのリクエストをアプリケーションサーバーやデータベースへと分散させる機構
どのケースでもロードバランサはサーバー等の計算リソースからのレスポンスを適切なクライアントに返す
以下のことに効果的
リクエストが状態の良くないサーバーに行くのを防ぐ
リクエストを過剰に送るのを防ぐ
https://valkey.io/
https://github.com/valkey-io/valkey
RedisをフォークしたOSSのIn-memory Database
AWSのElastiCacheでもサポートされている
2024-10 ElastiCacheでValkeyがサポートされたけど何が良いのか検証してみた
https://codecrafters.io/
RedisやGitなどの著名なソフトウェアを任意の言語で再実装してみよう、というチュートリアル
DBのトランザクションをBEGIN
してからCOMMIT
or ROLLBACK
する前に非同期処理を挟むのは危険なケースがある
HTTPリクエスト
キューにenqueue
呼び出し先の外部システムコンポーネントとの一貫性は保証されない
ロックを取得している場合はHTTPタイムアウトするまで長時間のロックとなる可能性がある
パフォーマンス比較 https://github.com/mperham/sidekiq#performance
ざっくり比較メモ https://qiita.com/zaru/items/8385fdddbd1be25fe370
Resque
Redis使う
ジョブごとにフォークされてメモリ初期化されるからスッキリ
みんなのコンピュータサイエンス
「コンピュータに対するコンパクトな知識地図」
個々を詳解しているわけではないので用語を知るにとどまる
9章にあった「優れたプログラマであれば知っているべきコンピュータサイエンスに関する最小限の知識」というのが全て
https://github.com/rubygems/gemstash
オープンソースのRubyGemsキャッシュサーバー
private gemの管理もできる
HashiCorpにより開発されているオープンソースのクラスタ管理ツール
https://github.com/hashicorp/consul
https://www.consul.io/
多機能だがサービスディスカバリが中心
Consulを通して以下をリアルタイムで知ることができる
https://github.com/solidusio/solidus
Ruby製のオープンソースのECサイト構築フレームワーク
事例
Solidusを元にECサイトを作って3年半後にSolidusを外した話
https://stackoverflow.com/questions/43380939/where-does-the-convention-of-using-healthz-for-application-health-checks-come-f
/healthz
のようなz
で終わるエンドポイントの慣習はどこから来ているのか?
歴史的にGoogle内の慣習から来ており、z-pageと呼ばれている
1章
ソフトウェアアーキテクトのポートフォリオでは答えるべき問い
ステークホルダーは誰だったか。主要なビジネス目標は何だったか。
ビジネス目標を満たすためにとられた全体のソリューションはどのようなものだったか。
どんな技術に取り組んだか。
アメリカのスタートアップR3社が中心となり、200を越すテクノロジー企業が協働して開発を進めているプライベートチェーン
オープンソースのバージョンもある
誰でもCordaをダウンロードして利用できる
主に企業向けの活用がなされており、多くの企業やコンソーシアムチェーンがCordaベースのネットワークを利用する
2019年1月にはそれぞれのネットワークを横断する統合ネットワークとして、CordaNetworkのローンチが発表された
#aws #AWSセミナー
https://pages.awscloud.com/JAPAN-event-OE-At-least-10-Amazon-WorkSpaces-2020-reg-event_CP_787.html
https://pages.awscloud.com/rs/112-TZM-766/images/Top%2010%20Things%20to%20Consider%20to%20run%20databases%20on%20AWS_rev.pdf
MySQL
MySQL 9.0からVECTOR型がサポートされる
https://dev.mysql.com/doc/refman/9.0/en/mysql-nutshell.html#:~:text=VECTOR%20type%20support.%C2%A0
ビルトイン関数
STRING_TO_VECTOR
Aurora MySQL におけるロック競合(ブロッキング)の原因を事後調査できる仕組みを作った話
MySQL (InnoDB)におけるロック待機上限を超えるとSQL Error: 1205
が起きる
SQLでSELECT FOR UPDATEで行を選択する際に、ロックされている行の扱いを指定できる
SKIP LOCKED
マルチスレッドワーカーがテーブル内で処理が必要な次の N 行を見つけようとする場合に非常に便利
NOWAIT
ロックされた行があればクエリを失敗させる
MySQLで全文検索
Aurora MySQL 5.7とRailsで実現する全文検索機能
結論、あまりおすすめできない
検索対象のカラムにFULLTEXTタイプのインデックスを貼るだけで簡単に実現することが可能
パーサーはデフォルトのngramとインストール可能なMeCabのどちらかを選択できる
https://shopify.engineering/building-resilient-payment-systems
Shopifyのブログ
1. Lower Your Timeouts
timeoutを短くする
RubyのNet::HTTP
のデフォルトタイムアウトは60秒だが長すぎる
SQLのIN句に渡せる値の個数の上限はデータベース製品によって異なる
以下のようなクエリで大量の値を手書きすることはほぼ無いが、ORMが吐き出すことはあるはず
select *
from users
where id in (1,2,3,4,5,...)
https://duckdb.org/
インプロセスのデータベースシステム
SQLiteのOLAP版に便利機能がついてくる
スキーマを事前に定義しなくてもCSVやParquet、S3上のファイルに対してクエリが実行できる
2025-01
2022
MySQL 8.0 で SELECT COUNT(*) が失速する
MySQL 8.0にて、バッファプールに乗り切らないサイズのテーブルを扱うときに性能が劣化する
2024
2024/11 Aurora MySQL 3.08.0(MySQL 8.0.39互換)がリリース!低速なSELECT COUNTは改善されたのか!?
DDLの一部はテーブルの全ての行のコピーを必要としたり、DDL実行中のロックを必要とする
オンラインのWebシステムで利用しているDBにDDLを実行するのは危険なことがある
ただしDDL実行中も他トランザクションによる読み書きを許容するものがあり、オンラインDDLと呼ばれる
MySQL
ALTER
文に明示的に ALGORITHM=INPLACE, LOCK=NONE
を付けて実行できるかどうかで判断できる
重いALTER TABLEの実行中に進捗状況を確認する方法
MySQLで重いALTER TABLEを実行しているときに進捗を確認するため、Performance Schemaの以下が使える
setup_instrumentsテーブル
setup_consumersテーブル
事前に設定を有効化する必要あり
今年の汚れ、今年のうちに!MySQLで使っていないインデックスを削除しよう
MySQL未使用のインデックスは sys.unused_indexes
ビューで確認できる
https://dev.mysql.com/doc/refman/8.0/en/sys-schema-unused-indexes.html
MySQLにおける最適化の一種
1つのテーブルに対する複数のインデックス スキャンをマージする
SELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20;
のようなクエリがあり、key1
とkey2
それぞれに対して個別のindexが作成されている場合などに発動する
EXPLAIN
したときにextraに以下のように表れ、選択されたアルゴリズムを確認できる
PingCAP社によって開発されるOSSのNewSQLデータベース
GoとRustで書かれている
水平スケール可能
MySQLとの互換性あり
ただしSQL処理レイヤはMySQLのフォークではなくゼロから書かれている
https://www.percona.com/blog/why-are-queries-with-many-in-values-more-expensive-after-upgrading-to-mysql-8-x/
MySQL 8.0以降で、IN
句に渡す値が多い場合に性能劣化することがある
インデックスが存在しても使われない
range optimizerが使用するメモリ量が5.xと比較して増加しており、range_optimizer_max_mem_size
を超過することがある
https://blog.kinto-technologies.com/posts/2024-03-05-aurora-mysql-stats-collector-for-blocking/
MySQLのロック競合によるタイムアウトの調査方法について
https://dev.mysql.com/doc/refman/8.0/ja/string-type-syntax.html
MySQLにて文字列カラム (CHAR、VARCHAR および TEXT 型) では長さを文字単位で解釈する
VARCHAR(10)
で宣言されたカラムには10文字を格納できる
10 bytesではない
4 bytes文字を10文字保存可能
https://dev.mysql.com/doc/refman/8.0/ja/aggregate-functions.html#function_group-concat
MySQLの集約関数
グループの文字列を連結して返す
separatorを指定できる
orderを指定できる
MySQLのEXPLAINで表示されるfiltered
の意味について
クエリにおける条件フィルタのステップでフィルタされる行の推定割合
一般に、高ければ高いほど直前のデータの取得処理が効率的であるといえる
公式ドキュメントの記述
filtered カラムは、テーブル条件でフィルタされるテーブルの行の推定割合を示します。 最大値は 100 で、これは行のフィルタリングが行われなかったことを意味します。 100 から減少する値は、フィルタリングの量が増加していることを示します。rows には調査された推定行数が表示され、rows×filtered には次のテーブルと結合された行数が表示されます。 たとえば、rows が 10
今年の汚れ、今年のうちに!MySQLで使っていないインデックスを削除しよう
MySQLのPerformance Schemaを利用して未使用のインデックスを発見できる
https://dev.mysql.com/doc/refman/8.0/en/sys-schema-unused-indexes.html
B-Tree
正確にはB+Treeが主流
MySQLのインデックスですが、B-treeではなくB+treeを使用するのはどうしてなのでしょうか
ref Let's Build a Simple Database
データベースにおいては万能
PostgreSQL向けのDB コネクションプール
RDS Proxyと似た製品
https://medium.com/@mauricio/how-to-add-recommendations-to-a-rails-app-with-pgvector-and-openai-881d87915fb2
Railsアプリケーションでrecommendationを実装する方法
Embeddingとvector storeを使った方法
PostgreSQLにpg_vector拡張を入れる
PostgreSQLの拡張機能
embeddingをネイティブに保存し、インデックスを作成し、クエリを実行できる(ベクトル検索)
embedding = トークン化された浮動小数点数の集合で、テキスト文字列の関連性を測定可能
OpenAI APIと組み合わせる例
https://www.crunchydata.com/blog/whats-postgres-got-to-do-with-ai
https://evilmartians.com/chronicles/gemfile-of-dreams-libraries-we-use-to-build-rails-apps
Rails, Rubyで有名なEvil Martiansの記事
PostgreSQLメインなので関連gems多い
自社のOSSの宣伝も含まれてる
認証
https://neon.tech/
PostgreSQLの[マネージドサービス、DBaaS
https://supabase.com/
Firebaseの代替とうたうBaaS
PostgreSQLベースのDBaaSの他にも認証、ストレージ、Edge functionを提供する
DBからのrealtime subscriptionもできる
OSSでもある
https://pgroonga.github.io/ja/
全文検索をサポートするPostgreSQLの拡張機能
日本語もサポート
PostgreSQLではアルファベットと数字だけの言語しか全文検索をサポートしていない
インデックスとしてGroongaを使う
PostgreSQLのインデックス作成時の構文は以下
CREATE INDEX name ON table (column opclass [sort options] [, ...]);
opclass
でオペレータークラスを指定することができる
指定したオペレータークラスによって、クエリで使えるオペレーターが異なる
PGroongaの例だと、JSONB型のカラムには2つのオペレータークラスが使え、デフォルトでは pgroonga_jsonb_ops_v2
が使われる
実録パフォーマンス改善 - 高速化のためアーキテクチャやアルゴリズム選択から見直すSansanの事例
行数推定を読み解く
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
https://hasura.io/
PostgreSQLからGraphQL APIを作成してくれる
Hasuraは企業名と総称を指し、提供されるproductは3つある
Hasura Cloud
serverless / managed service
2003年以降あたりでCPUの動作周波数が伸び悩み出し、フリーランチが終わったことを指す表現
Microsoftのアーキテクトであった Herb Sutter のThe Free Lunch Is Overから来ている
終焉以降、性能の向上にはソフトウェア側にも工夫が求められる
シングルコアに対するソフトウェアの工夫
SIMD命令への落とし込み
同一リクエスト内での同一クエリにはキャッシュが効き、実際にはDatabaseには問い合わせない
ログにCACHE
と出力される
キャッシュストアとは関係ない
ActiveRecord::ConnectionAdapters::QueryCache
のインスタンス変数としてキャッシュされるため
https://github.com/rails/rails/blob/6-0-stable/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb
https://github.com/basecamp/thruster
37signals製のHTTP2 proxy
Goで書かれている
https://dev.37signals.com/thruster-released/
機能
https://github.com/Shopify/autotuner
Shopify製のGCチューニング用Rack middleware
https://railsatscale.com/2024-04-24-autotuner-how-to-speed-up-your-rails-app/
RubyのGC
小さなアプリからShopifyのような大規模アプリまで適応できるようになっているが、デフォルトが最適とは限らない
https://github.com/Shopify/pitchfork
Shopify製のprefork型Rack HTTP server
Copy-on-Writeのパフォーマンスを最大化することでメモリ使用量を最小限に抑えるように設計されている
当初はunicornのパッチとして始まったが、unicorn本体が古いRubyをサポートするのでメンテナンスが難しく、forkして実装されることになった
#LFU #cache
キャッシュの生存期間ストラテジーの1つ
利用された回数が最も少ないアイテムをキャッシュから削除する
「頻繁に使われないものは、これからも使われない可能性が高い」という考えに基づく
#TTL #cache
キャッシュの生存期間ストラテジーの1つ
各アイテムに有効期限を設定し、期限が切れたアイテムを削除する
これは特に変更頻度が予測可能なデータや、一定時間後に必ず無効になるべきデータに適している
#LRU #cache
キャッシュの生存期間ストラテジーの1つ
最後に利用してから最も時間が経過しているアイテムをキャッシュから削除する
「最近使われていないものは、これからも使われない可能性が高い」という考えに基づく
クエリキャッシュ、SQLキャッシュとも
Railsの便利機構
https://railsguides.jp/caching_with_rails.html#sqlキャッシュ
同一リクエスト内で同じクエリが発生すると、実際にDBにそのSQLを発行せずにキャッシュされた結果を返す仕組み
ActionDispatch::Executor
Rack Middlewareで有効になる
https://github.com/pawurb/rails-brotli-cache
Railsのキャッシュストアをラップし、brotliアルゴリズムで圧縮・解凍を行う
データサイズが削減されたり速度が向上したりする
RailsでのDBの水平スケール/垂直スケール、Read Replicaについて
https://news.ycombinator.com/item?id=33893977
It goes without saying that there are a lot of things one would do prior to some of these steps. Because of the complexity these sort of configuration bring into your app one should weigh carefully w
https://github.com/Shopify/bootsnap#usage
Note: Bootsnap and Spring are orthogonal tools. While Bootsnap speeds up the loading of individual source files, Spring keeps a copy of a pre-booted Rails process on hand to completely skip parts of
https://danluu.com/cache-incidents/
Dan LuuによるTwitterの過去のインシデントの振り返り
大規模な障害にはキャッシュが関わっている
キャッシュロジックによる障害ではなく、フィードバックループが暴走した結果であることが多い
相対的に、キャッシュはスタック内のその下にあるパフォーマンスの異常(カーネル、ファームウェア、ハードウェアなど)の影響を受けやすい
https://ja.wikipedia.org/wiki/1.1.1.1
CloudflareがAPNICと提携して維持・運営を行っているDNSキャッシュサービス
無料で使用できる
「プライバシーを優先した消費者向けのDNSサービスとしては、インターネット上で最速」であるとCloudflareは主張
#aws #AWSセミナー
https://pages.awscloud.com/JAPAN-event-OE-At-least-10-Network-2020-reg-event-LP.html
https://pages.awscloud.com/rs/112-TZM-766/images/10-things-network.pdf
1. インスタンス起動からログインまで
起動時のインスタンスのIPアドレス関連処理
RailsのActiveRecordではrelationに対してlength
, size
, count
のいずれでもクエリの結果の件数を取得できるが挙動に違いがある
結論
キャッシュを使うならsize
キャッシュを使わないならcount
length
はクエリの結果をloadするので件数取得のためだけには使わない
Ethereumノードのセットを保持するサービス
高速な読み込みのためのキャッシュレイヤーを持つ
API経由でこれらノードに無料でアクセスで可能だ。 Infuraをプロバイダとして使用することで、自分のノードをセットアップして維持しなくても、イーサリアムブロックチェーンとメッセージを送受信できる
内部サービスをまとめて外部に統一されたインターフェースを提供するウェブサーバー
クライアントからのリクエストは対応するサーバーに送られ、その後レスポンスをリバースプロキシがクライアントに返す
利点
堅牢なセキュリティ
バックエンドサーバーの情報を隠す
https://martinfowler.com/articles/lmax.html
イギリスのオンライン金融取引プラットフォームであるLMAXシステムのアーキテクチャについて
このシステムの開発に携わったDavid Farleyは継続的デリバリーのソフトウェア工学の著者
JVM上の単一スレッドで秒間600万件の注文を処理できるビジネスロジックプロセッサを持つ
#aws #AWSセミナー
https://pages.awscloud.com/JAPAN-event-OE-At-least-10-Architecting-2020-reg-event-CP.html
https://pages.awscloud.com/rs/112-TZM-766/images/AWS設計のベストプラクティスで最低限知っておくべき10のこと_20200617_rev.pdf
以下の3つを一致させることが効率性を生む
B-treeにおけるnode
DBMSにおけるpage
Storage (記憶装置) におけるblock
コンピュータに接続される外部記憶装置には、バイトやビットごとにデータの読み書き(アクセス)を行うことができない、あるいはそのようなアクセスでは極端に性能が落ちるものがある。そこで、これらの外部記憶装置ではある程度まとまった固定長のデータ塊ごとにアクセスを行う。この固定長はディスクセクタ、あるいはブロックなどと呼ばれる。 9インチ磁気テープ、フロッピーディスク、ハードディスクドライブ、光ディスク、
https://github.com/cookpad/arproxy
ActiveRecordとdatabase adapterの間のproxyを差し込めるgem
databaseのテーブル設計やデータモデリングの例を集めたサイト
stack overflowの回答
https://stackoverflow.com/questions/9993842/where-to-find-practical-well-designed-database-schema-examples-to-learn-from
以下のサイトと本が紹介されている
https://link.springer.com/book/10.1007/978-1-4302-0366-7
既存のツールや技術を再実装することを通じて学ぶ学習法
OS、言語、database etc.
Code Craftersがカリキュラムを公開している
https://github.com/codecrafters-io/build-your-own-x
参考
マイクロサービス / Microservices
分散システムの一形態
Martin Fowlerによる説明 https://martinfowler.com/articles/microservices.html
分散トランザクション
Database per serviceのため、データベースが分割されている
ストレージエンジン
databaseを構成する要素のうち、実際にデータを格納するレイヤー
Database Engineともいう
databaseの特性と見られるうちのいくつかはstorage engineの実装によって決定する
supported types of data
https://news.ycombinator.com/item?id=18442941
自称元Oracle database開発者
12.2の時代
2500万行のCコード
100~200のサーバで構成されるテストファームにサブミットするとビルドされる
https://docs.mongodb.com/manual/core/wiredtiger
document-level concurrency control for write operations.
複数のクライアントが同じcollectionの異なるdocumentに書き込みができる
For most read and write operations, WiredTiger uses optimistic concurrency control.
https://www.slideshare.net/yoku0825/mysql-57449062 より抜粋
リソースが足りていない
物理メモリとbuffer pool size
ホットデータとbuffer pool size
クエリ並列数とcore数
MySQLのオリジナルコードの作者でMySQL ABの創設者でもあるミカエル・ウィデニウスにより、現在オラクルによって所有されているMySQLをフォークして立ち上げられたプロジェクトにより行われている
MariaDBの名は、Wideniusの2番目の娘の名前から採られている
配布ライセンスは、GNU General Public Licenseのバージョン2
原則としてMySQLとほぼ同じdatabse engine (Storage Engine) に対応している
学習パス
もしもいま、Rustをイチから学び直すとしたら? Rust入門書著者・matsu7874さんに聞く学習ロードマップ
『コンセプトから理解するRust』
豊富な図解でソースコード上の型とメモリ上のデータ配置の対応が丁寧に説明されています。メモリの仕組みを理解することで所有権やライフタイムの概念が身近になり理解が深まります。Rustの最大の特徴は所有権システムによるメモリ管理ですので、最初に勉強すると不思議なことが減って嬉しいです。
総務省の平成29年度 情報通信白書により、ビッグデータとして定義された以下のうちの1つ
オープンデータ
政府、国、地方公共団体
官民データ活用推進基本法を踏まえ、公共情報としてオープン化されているデータ
知のデジタルデータ
https://aws.amazon.com/jp/dms/
AWSのDatabase migrationサービス
2024-10 DMS を利用した継続的なデータ変更検知
DMS はその名の通りデータベース移行用のサービスですが、その機能の1つとして MySQL の binlog を読んで Amazon Kinesis Data Streams にその内容を送信することができます。
https://speakerdeck.com/koukyo1994/sheng-cheng-ainoer-da-chao-liu-tozi-dong-yun-zhuan
自動運転の経路の選択
どれでもいい
ルールベース
予測モデル
直訳すると概念的圧縮
抽象化を活用する事で詳細な理論や概念を圧縮して目的を達成できるようになるアプローチや考え方のこと
DHHが好んで使う
初出は2018?
Conceptual compression means beginners don’t need to know SQL — hallelujah!
通常のプログラムはCPUを介してメモリにアクセスするが、直接メモリにアクセスする方法をDirect Memory Accessという
この処理をCPUに代わって行うのはDMAC (Direct Memory Access Controller)
大量のデータを読み書きしようとすると比例してCPU処理の負荷が大きくなるのをオフロードする
DMACが転送している間は、他のデバイスはバスにアクセスできないデメリットもある
データベースの在庫の持ち方をビットで管理してる話
補足説明 https://twitter.com/naoya_ito/status/1773550536735805584
前提: SQL Server
あるタイムスパンごとの在庫有無を表現するため、元々はタイムスパンごとのカラムを持っていた
https://github.com/whatyouhide/stream_data
Elixirにおいてストリームデータを生成するライブラリ
Property based testingにも使われる
PropErとの比較
https://github.com/whatyouhide/stream_data?tab=readme-ov-file#differences-from-other-property-based-testing-frameworks
https://techlife.cookpad.com/entry/2023/08/31/152511
2023-08時点でのRubyの並列並行処理のまとめ
Ruby 1.8まで
M:1モデル(世間的には1:N)
ユーザーレベルスレッドと呼ばれる仕組み
(主にUNIXを前提とする)
プロセス間通信(IPC)のためのエンドポイントとして機能する抽象的なオブジェクト
ソケットAPIは、異なるプロセスがデータを交換するための標準化されたインターフェースを提供する
おかげで同じコンピュータ内のプロセス間だけでなく、ネットワークを介して異なるコンピュータ上のプロセス間でも通信できる
ソケットを介した通信の手順
「YAMLの本来の使い方」を仕様から読み取ってみる
YAMLはJSONとは独立に、異なる目的で生まれた野心的な仕様である
もとはデータMarshallingフォーマットを意図
アンカーやタグなどの強力な構文は、これらの目的を満たすために必然的に生まれてきたもので、単なる便利機能というわけではない
インタフェースをどのように定義するかの思考方法
サービスやモジュールのコンシューマ側の視点で公開してほしいデータやインタフェースを考える
内部実装やデータモデルを知ってる人だけで設計するのではなく、実際にコンシューマ側に聞くと良い
関連
モノリスからマイクロサービスへ
RESTなどリソース指向のWeb APIのレスポンス構造を設計するときに考慮すること
同じ概念(リソース)は同じ構造(スキーマ)で表現する
どのエンドポイントでも整合性のある情報を返す
リソースを小さく保ち、コンポジションで表現する
上位の概念は継承ではなくコンポジションで表現する
データを物理的に記憶装置から削除する物理削除に対し、記憶装置から削除はせずに削除フラグや削除日時によってデータの状態を判別するアプローチ
soft deletionともいう
Soft Deletion Probably Isn't Worth It
メリット
物理削除と異なり、操作をrevertできる
【ツイッターで毎週トレンド入りするサービス開発者が教える】再現性を持って「バズ」るサービスを作る方法
放置していても「勝手に」ユーザーが拡散し続けてくれる状態
SNS等
「利用してくれた人が、2人以上の新しい利用者を連れてきてくれる」
データが必要なサービスを、無理やり作る方法を紹介します(例:マンガ検索「MNM」)
データ
単なる事実の値
これを永続化して蓄えるものがRDBMS
情報
データから生み出される意味や目的のあるもの
https://ja.wikipedia.org/wiki/ファジング
ソフトウェアの不具合(とくに脆弱性を意図することが多い)を発見するためのテスト手法の一つである。ファズ(英語: fuzz)(予測不可能な入力データ)を与えることで意図的に例外を発生させ、その例外の挙動を確認するという方法を用いる。ファズテストと呼ばれることもある。