クラウドネイティブなアプリケーションでのデータベース利用について

◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
【5/21開催】Azure OpenAI ServiceによるRAG実装ガイドを公開しました
生成AIを活用したユースケースで最も一番熱いと言われているRAGの実装ガイドを公開しました。そのガイドの紹介をおこなうイベントです!!
https://tech-lab.connpass.com/event/315703/

こんにちは、サイオステクノロジー技術部 武井です。新年一発目の記事になります。

※本記事の英語版はこちら(Click here to read in English)

昨今、クラウドネイティブなアプリケーションが隆盛を迎えております。巷でもよく耳にすると思います。アプリ開発するときに、Virtual Machine使ったら負けとか聞いたこともあります。クラウドネイティブでつくるとモテるとも聞いたこともあります。切ないし、ハードル高いです(´・ω・`)

「クラウドネイティブなアプリケーション」というと、その定義は様々ですが、ここでは、Azureで言えばAzure Functions、AWSで言えばLambdaのようなFaaS(Function as a Service)を使ったアプリケーションであるとします。

そして、ここでよく問題になるのは、これらのFaaSで利用するデータベースは何を使うべきかということです。

一般的には、AzureのCosmosDB、AWSのDynamoDBのような、コネクションレスなデータベースがよいとされています。というのは、FaaSはステートレスです。一つの関数の実行が終わってしまうと、まるで3歩歩いたニワトリみたいに全てのことをキレイさっぱり忘れてしまいます。つまり、ある関数で取得したデータを、別で呼び出された関数で使うということが出来ません(><)(AzureにはDurable Functionsというステキな機能があり、これを使うとステートフルな関数の実行が実現可能ですが、ここでは割愛いたします)。

つまり、ステートレスということは、コネクションのプーリングが出来ないということになります。よって、MySQLやPostgreSQLのようなコネクションが必要なデータベースは、SQLを発行するたびにコネクションが必要になります。しかし、この接続コストが高いと言われてますので、これらのRDBとコネクションプーリングは、まるでトンカツと付け合せのキャベツのように、ともに使われることが非常に多いです。というか、昨今のWebアプリケーションでコネクションプーリングしてないのは、見たことないくらいです。FaaSとRDBの組み合わせは、アンチパターンとも聞いたこともあります。

また、FaaSはリクエストに応じて、どんどんスケールしていくので、RDBのようにSQL発行するたびに接続すると、RDBの方が最大接続数を超えて、限界に達してしまうという問題があります(´・ω・`)

でも、私は、やっぱりRDB使いたい(T_T)と思います。

CosmosDBやDynamoDBは、素晴らしいデータベースと思います。ただし、私の所感では、これらのデータベースはカタログ情報やログなどの、スキーマの変更の可能性が高く、単純な構造の情報を格納するにはモッテコイですが、テーブル間の結合が必要な複雑な業務においては、まだRDBの方が優勢と思っております。

ということで、調査をしてみました。

MySQL(バージョンは5.7)に対して、「select 1」という単純なSQLを発行する処理を、以下の2つのケースにおいて、10000回実行しました。

  • SQLを発行するたびに毎回データベースに接続するパターン
  • コネクションプーリングをするパターン

SQLを発行するたびに毎回データベースに接続するパティーンのソースコードは以下のとおりです。

コネクションプーリングするパターンのソースコードは以下のとおりです。

 結果は以下の通りでした。

  • SQLを発行するたびに毎回データベースに接続するパターン:22,497ミリ秒
  • コネクションプーリングをするパターン:2,380ミリ秒

こう見てみると、差は大きいのですが、1接続あたりにかかるコストは2msです。

もし、小中規模のシステムであれば、RDBでも十分問題ないのではないかと思っております。

また、FaaSはリクエストに応じて、どんどんスケールしていくので、RDBのようにSQL発行するたびに接続すると、RDBの方が最大接続数を超えて、限界に達してしまうという問題があると申しましたが、Azure Functionsの場合は、batchSizeとSingletonAttirbuteというのを使えば、実行数に制限ができそうです。

https://github.com/Azure/azure-webjobs-sdk/wiki/Singleton

ス(´・ω・`)ゴ(´ε`;)イ( ;∀;)

ということで、ちょっとした検証と考察でした。

アバター画像
About 武井 宜行 269 Articles
Microsoft MVP for Azure🌟「最新の技術を楽しくわかりやすく」をモットーにブログtech-lab.sios.jp)で情報を発信🎤得意分野はAzureによるクラウドネイティブな開発(Javaなど)💻「世界一わかりみの深いクラウドネイティブ on Azure」の動画を配信中📹 https://t.co/OMaJYb3pRN
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる