R 2 DBCとServerlessデータベースを用いた完全に反応可能でスケーラブルな春のアプリケーションの構築


リレーショナルデータベースによる真の反応性マイクロサービスの構築への挑戦


2011年に、ReactiveアプリケーションがJavaでより一般的になり始めたとき、私はJDBCでSQLデータベースにアクセスして、彼らについてしばしば冗談を言いました.もちろん、当時のSQLデータベースは古いものであり、スキーマの少ないNOSQLソリューションは次の5年間で標準となると考えられていました.春は死んだSQLデータベースは次で死ぬ!
歴史の奇妙なねじれにおいて、我々はまだ世界を支配している春とSQLデータベースを持っています.しかし、現在、彼らは反応的で、雲のネイティブで無力な建築で美しく働きます!
このブログの投稿では、次のようなアプリケーションを構築していきます.
  • スプリングWebflux、したがって、我々は反応的な休息終点
  • を持ちます

  • R2DBCは、我々のアプリケーションが完全にデータベースから残りの終点
  • に反応できるようにする新しい、反応的なSQLドライバーを使用します
  • SQL ServerのServerlessなバージョンなので、我々は我々のニーズに従い我々のデータベースを計ります
    我々がここで使用する多くのテクノロジーがR 2 DBCを含んでいると警告して、非常に新しくて、まだ準備ができていません.我々は、作業アプリケーションを構築しており、我々はこのポストは、これらの技術の普及と安定化を支援するが、独自のリスクでそれらを使用することを期待!

    サンプルアプリケーション


    ここでは、単純なSpring Webflux MicroServiceを開発しています.これはSQLデータベースとの話です.最終的なコードはhttps://github.com/jdubois/spring-reactive-sql-serverでgithubで利用可能です.

    サーバレスSQLサーバ


    すべてのデータベースにR 2 DBCを持つ無効なドライバがあるわけではないので、ここでSQL Serverを選択しました.もう一つの理由は、“Serverless”オプションを持っていることです.事実上、SQL Serverのスケーラビリティオプションは印象的です.
  • 非常に高いパフォーマンス、可用性とストレージ(最大100に!)hyperscale option
  • elastic pools of databasesを使用している価格/パフォーマンスとスケーラビリティを最適化した

  • 非常に低コスト、オンデマンド価格で、(私のお気に入り!)を使用してserverless database instances
  • ここでは"Serverless "オプションを使用しますので、非常に低価格ですべてを構築できます.
    the Azure portal
    我々は最も安いオプションを選択しました:我々のデータベースは、我々につき0.15ユーロをプラスしました.そして、1秒につき0.000067ユーロ(1時間のために、それはおよそ0、24ユーロである)をプラスしました.これは実際にはdevやテスト環境に適しています.
    データベーススキーマを作成するには、単純なスクリプト :
    CREATE TABLE person (
        id BIGINT NOT NULL IDENTITY PRIMARY KEY,
        first_name VARCHAR(100),
        last_name VARCHAR(100),
        company VARCHAR(100)
    )
    
    データベースにこのスクリプトを実行する多くのオプションがありますが、最も簡単なものはavailable hereを通して利用できるオンラインエディタを使用することです.
    the Azure portal

    R 2 DBCの使用と設定


    は、Javaのための反応的なドライバーのための仕様です.具体的には、マイクロソフトSQL Serverの実装であるR2DBCを使用します.
    私たちには、それを使用している多くの問題がありました、例えばRD2BC SQL Server、そして、そこで、我々はここでスナップショット・リリースを使用しています.
    <dependency>
        <groupId>io.r2dbc</groupId>
        <artifactId>r2dbc-mssql</artifactId>
        <version>0.8.0.BUILD-20190819.142517-35</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-r2dbc</artifactId>
        <version>1.0.0.gh-151-SNAPSHOT</version>
    </dependency>
    
    
    これらの問題は、現在春チームによって対処されています、そして、安定したリリースが利用できるならば、我々はサンプルプロジェクトを更新します.

    この迷惑なSSLのバグ R 2 DBCのためのSpring構成


    自動的にR 2 DBCを春のブートで設定するために があります.また、ここではR 2 DBCを手動で設定することもできます.
        @Bean
        public MssqlConnectionFactory connectionFactory() {
            log.info("Connecting to database '{}'...", host);
            return new MssqlConnectionFactory(MssqlConnectionConfiguration.builder()
                    .host(host)
                    .port(1433)
                    .database(database)
                    .username(username)
                    .password(password)
                    .build());
        }
    

    スプリングブーツスターター ばねデータとR 2 DBCによるデータアクセスコード


    良いニュースは、R 2 DBCで部分的に春のデータが動作するということです.SQLクエリの生成のような機能はすべてありませんが、ほとんどのフレームワークは機能しています.
    @Repository
    public interface PersonRepository extends ReactiveCrudRepository<Person, Long> {
    }
    
    したがって、このリポジトリは、通常のスプリングJDBCまたはスプリングJPAリポジトリとして、残りのエンドポイントで使用できます.
    @RestController
    public class PersonController {
    
        private final PersonRepository personRepository;
    
        public PersonController(PersonRepository personRepository) {
            this.personRepository = personRepository;
        }
    
        @GetMapping("/persons")
        public Flux<Person> list() {
            return personRepository.findAll();
        }
    }
    

    結論と最終思想


    ここで開発したサンプルプロジェクトは にあります.将来的には、そのプロジェクトはR 2 DBCの安定版を使用するべきである.
    良いニュースは、いくつかの非常に最先端の機能を使用しても、我々のコードはまだ通常の春のブートアプリケーションのように見える:ほとんどの設定と使用されるAPIは春のユーザーに慣れている必要があります、これは通常のスプリングブートアプリケーションのように実行されます.
    このセットアップのキラー機能は、SQL Serverの“Serverless”のバージョンのおかげで、R 2 DBCとSpring Webfluxのおかげで、我々は非常にスケーラブルなアプリケーションを使用することができますが、コストに応じて異なります.アプリケーション側では、Spring Webfluxを使用すると、我々のアプリケーションは非常に迅速に(MacBook Pro上で1秒以上)を開始し、そのメモリ使用量が制限されていることを意味します.我々の最後の結果は、このように非常にスケーラブルで効率的です!