はい。で、そこからが次、Relational Databaseですね。ここで来るんだ。
でもここからちょっとサーバー特化っぽくなりましたね、トピックが。
そうですね。Relational Databaseっていうのは、今ではもう本当にデファクトに近いデータベースで、データベース何かっていうとデータ保存する単純な場所ですと。
Relational Databaseは表形式のデータベースになっていて、行と列で表現されるようなものになってるんで、エクセルを思い浮かべていただくのが一番早いかなと思いますが、
まああんな感じのテーブルと呼ばれるところにデータをどんどん掻き溜めていくっていうのがバックエンドのあるあるなデータ保存方法ですね。
そうですね。この人のパーソナルリコメンデーションがポスグレなのちょっといいですね。
いや海外は割とポスグレが多いから、これなんじゃないかな。
本当ですか?そうなんだ。むしろ日本だとほとんど現場だとMySQLが多いような気がしますよね。
そう、日本はMySQLなんですよ。だからタイデイビーっていう中国が作ってるニューSQL、ちょっといきなりレベルが上がりすぎたんですけど、ニューSQLはMySQL互換なんですけど、
AWSが作ってるニューSQLのDSQLとかクラウドスパナ、Googleのクラウドスパナとかはポスグレ互換ですね。
そうだったんだ。知らなかった。意識したことがあった。僕、いやポスグレを通らずにスパナを最初に触ったので、いやそうだったのかと今、アハ体験となりました。
そうですね。ちょっと飛びすぎたんですけど、リレーションデータベースとしてはMySQLとかポスグレとかオラクルとかいくつかのものがありますね。
で、ここで一応マイグレーションっていう概念は覚えておかなきゃいけなくて、データベースはどういうテーブルにするかっていうのをスキーマっていうもので表現するんですけども、
例えばユーザーテーブルってものを作ったらユーザーIDとユーザー名とユーザーが作成された時刻とかみたいな、そんな感じで列、カラムを持つんですけど、
これを途中で変えたいなってなった時にそのマイグレーションという操作をします。
で、このマイグレーションというのは結構厄介だったりもするので、このまず概念として覚えておきましょうというのと、
自分が使っているデータベースに合わせてやり方を知っておきましょうみたいな感じですね。
大事ですね。
実際に運用しないとどれくらい大変かって分からないと思うんで、とりあえずここでは概念を押さえておくのでいいかなと思います。
そしてNプライチ問題。懐かしいな。
急に来るんだな、Nプライチここで。データベースにアクセスする際ってアプリケーションからSQLってやつを叩くんですけど、
例えばセレクトアスターフロムユーザーって書くとユーザーのテーブルから全部の情報を引っ張ってくるみたいな感じなんですけど、
そういうことは基本やんないんですよ。なぜならば重いんで処理が。ユーザーが1万人いたら1万件データ取ってくることになるんで。
なので基本的にはIDをベースにしてユーザーID1の人を持ってくるみたいな感じなんですけど、
例えば処理でユーザー100人分データを取りたいみたいな時に愚直に書くとフォールループで100回回してセレクトを発行するみたいなことをやりがちなんですけど、
これのことをNプラワン問題と言います。
これ何が問題かというと100回セレクト分叩くとクッソ重くなるので、1回例えば10ミリ秒で終わっても100回叩くと、何秒だ?
100秒?10秒かな。
10ミリ秒だから100回叩くと1秒ですね。
1秒ですね。1秒だからめっちゃ遅くなるんですよね。そういうのはやめましょうっていうことがここで紹介されてます。
そうですね。たぶんそれこそ新卒で現場に入って最初にベテランの人からレビューで指摘されるような内容ですね。
そう。だからセレクトの時にいっぱいIDいっぺんに渡して一発で取りましょうみたいな話です。
で、これが終わるとAPIについて学びましょうって話で、
こういうAPIはWeb系のAPIで我々がバックエンドサーバーとして作るWeb APIとかREST APIとか呼ばれるものの類が多いかなと思いますと。
大きく分けてRESTとGraphQLとGRPCぐらいよく使いますね。
JSON APIはもう最近はほとんど使わないけど、MCPって使うのかな。
JSON APIってあれですか。JSON RPCとかああいう類のやつですかね。
そうかな。
たぶんRESTと分けてるならそういうことなんでしょう。
REST分けて単純にJSONで送ってるって感じのやつですね。SOAPは昔のやつですね。
特にRESTをほとんどのケースで使うことが多くて、このRESTを管理するための共通のスキーマというかお約束ごとがOpen APIって呼ばれるもので、
基本的にはOpen APIのスキーマってものを定義して、こういうAPIをこのサーバーは喋りますよ。
なんでクライアントはそれに従って叩いてねみたいなことをクライアントサーバー間で合意を取るためのドキュメントというかスキーマファイルです。
そうですね。
で、プラスなんかめっちゃ色々あるけど、Authentication、だからAPI叩くための認証のところとか認可のところとかがあって、JOTとかAUTHとかレシク認証とか色々ありますよ。
なんで結構サーバー側だと自分でセキュリティをしっかり守るところの仕事の範疇だったりするので、今回のこの認証では何を使うべきなのかっていうのは、色んな認証の仕組みを知った上でどれが最適なのかとか、どれがビジネス的に求められているのかっていうのを判断して使いましょう。
そうですね。大事ですね。
で、Webセキュリティがあって、急にハッシュアルゴリズムの話が出てきたんですけど、これ何だろうな。多分おそらくユーザーパスワードみたいなものを必要なWebサービスが大半だと思うんですけども、その時のパスワードの保存方法とか、何かを生成してユーザーに返すみたいな時にハッシュアルゴリズムみたいなものを使うんですけれども、
その時にMD5とかSHA256とか使うんですね。RBクリプトとか。
ありますね。
なのでそういうものを最低限知っておきましょうぐらいの話だと思います。
大事です。
で、その下にさらにACPSとかOSPとかCORSとかSSLTとかCSPとかサーバーセキュリティとかのが丸っと書いてありますが、APIサーバーっていろんなところからアクセスされるので、セキュリティには気をつけましょう。
そのための方法として、通信路を暗号化するものであったり、そもそもおかしいリソースを返さないようにする仕組みだったり、そもそも変な人から叩かれないようにするとか、そういういろんな仕組みがあるので、そういったものも、ちょっとこのタイミングで本当に覚える必要があるのか怪しいんですけど。
ここで急に。
まだAPIサーバー作れてるのかな。作れてるぐらいのレベルだと思うんだけどな。
ここで急にヘビーになってきましたね。
ここでみんな脱落するんじゃないか。何にも面白くない。
何というか、でも全部触る必要はなくとも、たぶん一つAPIエンドポイントを作るために包括してさらりと知っておく必要がありそうですね。この辺りの知識は。
それが終わるとあとテスティングで。テスティングもユニットテスト、インテグレーションテストとかいろいろあるんですけど、いわゆる簡単なロジックに対するテストもあればAPIレベルのテストもあったりします。
急にコンテナライゼーションっていう、コンテナとかコンテナのオンケストレーションのところが入ってきたんですけど、むずくないか?
最近のプロダクト開発というかバックエンド開発においては基本的にAPIサーバーを作ったらコンテナで動かすことが大半なんですね。
なので自分たちでDockerファイルを書いたりとかすることも多いと思うので、APIサーバーをコンテナで動かすための仕組みだったり、
そもそもコンテナってなんだっけとか、コンテナを本番環境で運用する場合にはどういったツールを使う必要があるんだっけみたいなことを学ぶ必要があるらしいです。
この前Docker会も取ったので、詳しくはそこでいわゆる話です。
で、それ触ったらメッセージブローカー。
メッセージブローカーってなんだ?ちょっと待ってくださいね。メッセージブローカー。
メッセージブローカーっていうのは非同期の処理を作るための一個の仕組みで、システムとかアプリケーション間でメッセージを仲介するミドルウェアというかソフトウェアなんですけど、
まず前提としていわゆるAPIサーバーっていうのは同期的な通信をクライアントに対して行うものが大半なんですね。
なんかAPIリクエスト投げたらサーバーで処理して終わったら返すって仕組みなんですけど、サーバー間の通信って必ずしも全部同期的じゃないですね。
そうですね。
で、ツインにある概念を非同期って言うんですけど、それは何かリクエストを投げて別に終わることを別に待たないと。
何だったらコールバックみたいな感じで向こうから終わったよって言われてから始めて確認しに行くケースもあれば、
自分の中でスリープして一定時間後に取りに行くとか、いろんなケースがあるんですけども、
その非同期の仕組みを作りやすくするためのツールがメッセージブローカーで、ラビットMQとかカフカっていうものがまずありますと。
なるほど。僕はカフカの名前だけ知ってたんですけど、なるほどそういうものだったんですねという、綾田いけるんです。
例えば自分、SNSだとして、自分のところにフレンド申請みたいなものが届いたケースを考えたいんですけど、
ユーザーがフレンド申請を送るみたいなところは、フレンド申請のAPIを叩いて終わりなんですけど、そこから相手に通知を送るってところを考えたいですと。
その時に別に何も考えなければ、別にフレンド申請の裏で同期的にその相手に対して通知を送るっていうこともありなんですけど、
ちょっと数が多くなってきたりとかですね、例えばリツイートしたやつを、自分のことをウォッチしてくれてる全員に対してそのリツイートしたツイートを全員のタイムラインに載せるみたいなことをやろうと思うと、
例えば人の数によっては凄まじい数の通知をいっぺんに飛ばさないといけないみたいなことがあるじゃないですか、こういう通知っていうのはタイムラインに挿入するみたいなぐらいのイベントの話ですけど、
そうすると、そうありそうで、例えばそれを処理するときに1回メッセージブローカーと呼ばれるイベントを受け取るところに渡して、
こいつはメッセージブローカーの性質によるんですけど、AWSでいうと、Google Cloudでいうとクラウドカブサブが近いんですけど、サブスクライブやパブリッシュみたいな関係を表すとわかりやすいんですけど、
何かのサーバーがこの人がこれをリツイートしましたっていうイベントをブローカーに投げて、それをサブスクライブしてるいろんなサーバーがリツイートされたという情報を受け取れるんですね。
これは性質によるんですけど、1回受け取ったらどっかのサーバーが、他のサーバーも受け取れないっていう設定もできるし、サブスクライブしてるサーバーは全員が同じメッセージを受け取れることもできるんですね。
そうしたときに、サブスクライブしてるサーバーがリツイートしたというものを受け取ったら、それに応じて自分たちが必要な処理をやって、後続の処理に渡すみたいな形で、
伝搬させていくこともできるし、どっか1台が責任を持ってやることもできるし、そういう仲介役のような機能を持ったりしますね。
なんか今の話を聞いてて、いわゆるQ、例えばAWSのSQSみたいなものもメッセージブローカーの一部というか、メッセージブローカーと言えるんじゃないかなと思ったんですけど、それは違うんですか?
確かに、言えるっちゃ言えますね。
でもメッセージブローカーとしても、例えばそういうQみたいな必ず詰まれたら、必ずこいつにQ自身から投げるものもある、ちょっと厳密にはあれか、コンシューマーの方から受け取るみたいな協力だと思うんですけど、
メッセージを仲介するっていう役割を担う上でも、いろいろな形式があるっていうんですね。
そうですね。面白いパターン。
これができると次はリアルタイムデータになって、リアルタイムデータは通常普通のクライアントとサーバーからの通信はリクエストをパナーで送って返ってきて終わりみたいな感じなんですけども、
そうじゃなくてずっとつなぎ続けておいてストリーム形式でデータをもらうような形、ストリームじゃないですけど必ずしも、サーバーサイドイベントとかサーバーセントイベントか、
ウェブソケットとかクライアントから張るロングポーリングとか、あとはGRPCのストリームとかいろいろ種類はあるんですけれども、そういうものを使ったりするケースもありますと。
そうですね。
それができたらスケーリングデータベース、データベースのスケールか、データベースはRDBの場合って基本的な構成としてはクラスター構成っていうものを組みます。
クラスター構成っていうのはデータベースを2台用意して1台がプライマリーと呼ばれるもの、2台目がセカンダリーと呼ばれるもので、基本的にはプライマリーに対して基本的に書き込みとか読み取りを行っていきますと。
これがダウンした時に困るからもう一つの方がダウンした時はプライマリーに昇格して書き込みや読み取りを受け取るという感じなんですね。
そうですね。あとプライマリー、いわゆるセカンダリー側の方にリードヘビーな処理を任せるとそういうこともやりますよね。
そうですね。あとはリードレプリカっていうリード専用のデータベースを作ってリードは全部そっちに寄せるみたいな構成もまずあったりしますと。
ちなみに昔撮った回に僕がリードレプリカの方にデータを送るために多少ラグが発生する、それがレプリケーション遅延って呼ばれるやつですけど、僕のやらかしによってレプリケーション遅延に3分を越したっていう話も撮ってるので皆さんぜひ聞いてください。
データベースのそういったRDBのスケールアップはスケールアップっていうのが基本なんですね。スケールアップっていうのはCPUとかメモリーとかディスクとかをほとんど増やしていくっていうパターンなんですけど、これもどっかにスケールの限界がありまして特にクラウド環境だと最大のスペックとかが決まってるのでそれ以上のサイズには増やせないっていう上限がありますと。
なのでその時に使う仕組みとしてシャーディングっていう方法があるんですけれども、これは多分垂直シャーディングと水平なシャーディングと2種類あって、自分はそんな経験ないんですけど、例えばユーザーテーブルで考えると1番から1万番はデータベース1番に保存して1番以降はデータベース2番に保存するみたいな感じで、
IDの何番か何番単位で分けるやつですね。多分これが垂直なスケーリングのはず。水平なスケーリングはもうIDの例えば1番2番3番っていうのを例えばですけど、モッドの4とかで割って、そうすると余りが0、1、2、3になるじゃないですか。
なるほど。 なので4台のデータベースにそのモッドの値で分散して書き込むみたいな。 なるほどなるほど。なんかそっちの方が終わりが見えないデータに対しては向いてそうですね。
でもあれは途中で5台目増やしたいとき大変ですけどね。 確かに。スケーリング自体に弱い。それはありそう。
はい、っていう感じでデータベースのスケーリングがありますと。キャップの定理であるのは、これNewSQLの話なんですけど、NewSQLは、NewSQLだけじゃないのかな。
NoSQLもあるのかな。NewSQLとかだとディレーショナルデータベースみたいなトランザクションが張れるのに、なんか事実上半無限に横に展開できるみたいな、スケールできるみたいな。
いろいろ難しいPAXOSのアルゴリズムがあったりとか、すごい正確な時刻があったりとか、いろんな前提条件はあるんですけど、そういうものがあってうまいこと成り立ってますと。
その次にNoSQLデータベースがあって、NoSQLデータベースは、NoSQLって書いてるんですけど別にSQLみたいなものは叩けるんですけど、今までのデータベースとは全然違う概念で動いていて、
B3じゃないですよね、確か。そもそも。LSMなのかな。ちょっと忘れちゃいましたけど、そのスケールデータベースってのがあって、うまいこと進めていけないな。
なんかこれもスケールにすごいできるし、テーブルの中でキーマ定義があんまりいらない、ないに等しいのかな。本当に自由に列が作る、列やカラムが作れるんですよね。
そういうものが多いですね。NoSQLってこのシリーズ、無限に例を出せそうなりするし、なかなか一言でくくるのが難しい概念ですね。
そうですね。なんで、すごい柔軟なスキマと高いスケーラビリティができるもので、非構造化データとかビッグデータにすごい適しているデータベースになっています。
ここまで来ると、ベーシックオープンベーシックス。
ここまででやっとベーシック。
ベーシック来たか。
まあまあいろんなこと詰め込みなせんでしたら、そうですね。
違うか、違うわ。次はさらにベーシックな運用スキルの話になってて、LinuxとかネットワークとかAWSがテラフォームとかデジタルアプションとかそういうの触れるようになりましょうねっていうのがまとめても書いてある。
なるほど。確かにもう少し実務に寄った構成なものが出てきましたね。
なんでここのベーシックオープレーションスキルが手に入ると、LinuxとかネットワークとかAWSが触れるようになりますよっていうのが丸めて書いてありますね。
丸めすぎてないか。まあまあでもこの辺りの今ここに出てる技術は割となんか現場に入ったらすぐ一通り触りそうなものでもありますね。
はい。で、最後にスケールのためのビルドみたいな話で、オブザーバビリティの話とリティゲーションストラテジー。
ああ、あるか。システムをスケールさせるためにこういうことを知っておくとすごく便利だよみたいなものたちですかね。
まずオブザーバビリティからざっくりいきますけど。
ああ、そうだ。専門家がオブザーバビリティの。
果敢属性と日本語で訳されますが、システムが今どういう状態でどういうとこにボゾルネックがあって問題があるのかっていうものを