2021/11/21:JJUG CCC 2021 Fall CData Software Japan Lead Engineer / Kazuya Sugimoto
https://fortee.jp/jjug-ccc-2021-fall/proposal/eb219810-ed49-45de-b93d-8a3ec40d11e6
https://www.cdata.com/jp/sync/
© 2021 CData Software Japan, LLC | www.cdata.com/jp1. About CData Software400種類以上のAPI連携を開発・サポートしているデータパイプラインツール CData Sync の中身2021/11/21:JJUG CCC 2021 FallCData Software Japan Lead Engineer / Kazuya Sugimoto
View Slide
© 2021 CData Software Japan, LLC | www.cdata.com/jpCData Software Japan の API holic 担当年100種類以上のAPIを見たり触ったりしています。Twitter:@sugimomotoFacebook:sugimomotoBlog:http://kageura.hatenadiary.jp/About SpeakerHorizontal SaaS 647種類のAPI提供状況を調査:そこから見えてきた国産 SaaS APIの今https://www.cdatablog.jp/entry/horizontalsaasapi
© 2021 CData Software Japan, LLC | www.cdata.com/jpCData SyncTM✓ クラウド/SaaS データをノンコーディングでDB に反復同期できるパワフルなツール✓ クラウドデータをRDB にコピーして、帳票や分析でデータを活用✓ クラウドデータのバックアップに✓ 主要データソースでは、差分更新機能をサポートし、効率的な同期ジョブを実行
© 2021 CData Software Japan, LLC | www.cdata.com/jpAnd more…SalesforceFacebookGmail Twitter StripeGoogleAdwordsDynamics365JSONGoogleAnalyticsJiraGitHubTwiliokintoneOffice 365Quick BooksZohoHubSpot Sugar CRMSharePointEloquaMarketoNetSuiteDynamicsCRMYouTubeAnalyticsGoogleSpreadsheetsSendGridSAPActiveDriectoryGoogleContactsXMLCData Sync Data Sources現在「400種類」以上のサービスに対応
© 2021 CData Software Japan, LLC | www.cdata.com/jp1. About CData Software本日のお話
© 2021 CData Software Japan, LLC | www.cdata.com/jpHorizontal SaaS API公開状況調査
© 2021 CData Software Japan, LLC | www.cdata.com/jp「45.6%:290サービス」がAPIを公開している海外では90%API公開を行っていた
© 2021 CData Software Japan, LLC | www.cdata.com/jp調査の中で最も注目するべき点は「API仕様の多様性」RESTが多いが詳しく見てみると多種多様国産SaaSはそもそもAPI仕様すらわからない
© 2021 CData Software Japan, LLC | www.cdata.com/jp認証方法のサポートも多岐に渡る
© 2021 CData Software Japan, LLC | www.cdata.com/jp不安定かつ多様な「API」と共存している
© 2021 CData Software Japan, LLC | www.cdata.com/jp一つの企業が利用している平均SaaSの数が「80」企業で使うSaaS の数が急増:連携ニーズも増加http://pages.bettercloud.com/rs/719-KZY-706/images/2020_StateofSaaSOpsReport.pdf
© 2021 CData Software Japan, LLC | www.cdata.com/jpアプリ側のAPI連携ニーズも拡大HubSpotアプリマーケットプレイスへの公式連携アプリ登録数が500件突破freeeアプリストアの掲載アプリ数が100を突破連携アプリケーション掲載数はリリースから約2年で4倍にhttps://prtimes.jp/main/html/rd/p/000000622.000006428.htmlhttps://www.hubspot.jp/company-news/hubspot-grows-platform-ecosystem-to-500-apps-20200728
© 2021 CData Software Japan, LLC | www.cdata.com/jp不安定かつ多様なAPIと連携しなければいけないのが実情もし、この不安定さが直接的にビジネスロジックに影響したら?APIへの追従・機能追加がアプリのスケールを阻害する可能性がある
© 2021 CData Software Japan, LLC | www.cdata.com/jp不安定かつ多様なAPIの連携に対してどのようにプロダクトとして対応・スケールさせているのか?製品としての取り組み、「アーキテクチャ」を軸に解説
© 2021 CData Software Japan, LLC | www.cdata.com/jp1. About CData Software大量のAPIサポートしつつ、スケールするアーキテクチャとは?
© 2021 CData Software Japan, LLC | www.cdata.com/jp「インターフェース」が超重要
© 2021 CData Software Japan, LLC | www.cdata.com/jpなぜならAPI追従の衝撃をビジネスロジック側に影響させないアーキテクチャ各チームが独立して、それぞれ機能追加アップデート・ビルド・テスト・リリースが行える体制がスケールするための要だから
© 2021 CData Software Japan, LLC | www.cdata.com/jpスケールを阻害する要因は「密結合」密結合とは、細分化された個々のコンポーネント同士が密接に結びついている状態のことである。密結合状態のシステムでは、緊密で高速な動作が可能となっているが、一方のコンポーネントが異常をきたすと、他方のコンポーネントがその影響を受けてしまう。 そのため密結合のシステムでは、保守や部品の交換などに際して密接な連携を顧慮する必要がある。 密結合はマルチプロセッサシステムのようなハードウェア的なものから、アプリケーションソフトのようなソフトウェア的なものまで、幅広く見られる状態である。https://japan.zdnet.com/glossary/exp/%E5%AF%86%E7%B5%90%E5%90%88/?s=4APIへの追従に他のモジュールが影響を受けやすいとメンテナンスコストの増加→スケールを阻害
© 2021 CData Software Japan, LLC | www.cdata.com/jpCData Sync はプラグインレイヤーでAPIとの疎結合なアーキテクチャを実現しているデータソースとなる多種多様なAPIデータパイプラインのメインロジックビジネスロジックレイヤーAPIとロジックをつなぐインターフェースプラグインレイヤー
© 2021 CData Software Japan, LLC | www.cdata.com/jpプラグインA担当プラグインB担当プラグインC担当Syncチームビジネスロジックチームと各プラグインチームが独立して開発・ビルド・テスト・リリースSync LogicModulePlugin AModulePlugin BModulePlugin CModuleSync Main Module※実際にはもうちょっと細分化してます。
© 2021 CData Software Japan, LLC | www.cdata.com/jpCData が活用している「インターフェース」とは?マイクロサービス的な?REST? SOAP?gRPC?デザインパターン?
© 2021 CData Software Japan, LLC | www.cdata.com/jpJDBCJDBCとは、Javaプログラムからデータベースにアクセスするための標準インターフェース(API)の一つ。データベースの違いによらず同じ手順で接続し、データを読み書きすることができる。https://e-words.jp/w/JDBC.html
© 2021 CData Software Japan, LLC | www.cdata.com/jp1. About CData SoftwareAPI仕様のガラパゴスな世界と常に変わり続ける仕様への追従
© 2021 CData Software Japan, LLC | www.cdata.com/jpAPI連携のスケールを意識し・拡張性を踏まえながらサービスに機能を組み込もうとすると、2つの壁に衝突多種多様なAPI仕様の壁変わり続けるAPI仕様の壁
© 2021 CData Software Japan, LLC | www.cdata.com/jpでも、ほとんど「REST API」だから、そんなに難しくなくない?
© 2021 CData Software Japan, LLC | www.cdata.com/jp「REST」はプロトコルでは無い
© 2021 CData Software Japan, LLC | www.cdata.com/jp改めて REST ってなんだっけ?REST = Representational State Transfer>Representational State Transfer (REST) は、ウェブのような分散ハイパーメディアシステムのためのソフトウェアアーキテクチャのスタイルのひとつである。引用元:Wikipedia REST(https://ja.wikipedia.org/wiki/REST)
© 2021 CData Software Japan, LLC | www.cdata.com/jpWeb API を REST たらしめる“原則“(≠規約)• Stateless:ステートレスなクライアント/サーバプロトコル• Uniform Interface:すべての情報(リソース)に適用できるHTTPメソッドの定義• Addressability:リソースを一意に識別する「汎用的な構文(URL)」の定義• Connectability:アプリケーションの情報と状態遷移の両方を扱うことができる「ハイパーメディア(リソースリンク)の使用」上記の原則に従っているアーキテクチャを REST ful と言ったりするがあくまで “原則“ であり ”規約” ではない!
© 2021 CData Software Japan, LLC | www.cdata.com/jp例えば「Salesforce」の「REST API」実体はSOQLというSalesforce内部での独自規格のSQLを発行するAPIhttps://developer.salesforce.com/docs/atlas.ja-jp.api_rest.meta/api_rest/resources_query.htm
© 2021 CData Software Japan, LLC | www.cdata.com/jp同じ OAuth 2.0 でも例えば Refresh Token の扱いが違ったりPOST /{tenant}/oauth2/v2.0/token HTTP/1.1Host: https://login.microsoftonline.comContent-Type: application/x-www-form-urlencodedclient_id=XXXX&scope=https%3A%2F%2Fgraph.microsoft.com%2Fmail.read&refresh_token=OAAABXXXX...&grant_type=refresh_token&client_secret=sampleCredentia1s{"access_token": "XXXXX...","token_type": "Bearer","expires_in": 3599,"scope":"https%3A%2F%2Fgraph.microsoft.com%2Fmail.read","refresh_token": "XXXX...","id_token": "XXXXX.XXX...",}POST /token HTTP/1.1Host: oauth2.googleapis.comContent-Type: application/x-www-form-urlencodedclient_id=your_client_id&client_secret=your_client_secret&refresh_token=refresh_token&grant_type=refresh_token{"access_token": "1/fFAGRNJru1FTz70BzhT3Zg","expires_in": 3920,"scope":"https://www.googleapis.com/auth/drive.metadata.readonly","token_type": "Bearer"}https://docs.microsoft.com/ja-jp/azure/active-directory/develop/v2-oauth2-auth-code-flow#refresh-the-access-tokenhttps://developers.google.com/identity/protocols/oauth2/web-server#offlineAzure AD OAuth 2.0 Google Cloud Platform OAuth 2.0
© 2021 CData Software Japan, LLC | www.cdata.com/jpAPI アップデートへの追従も大変
© 2021 CData Software Japan, LLC | www.cdata.com/jpSalesforce の API Version は「53」
© 2021 CData Software Japan, LLC | www.cdata.com/jpAmazon Marketplace API アップデートでAPI仕様が大幅変更・古いAPI終了告知が半年前*https://sellercentral.amazon.co.jp/forums/t/topic/73349※現在は2022年7月に延期
© 2021 CData Software Japan, LLC | www.cdata.com/jp認証方法・クエリパラメータデザインレスポンスフォーマット含め全面刷新POST /Orders/2013-09-01/?AWSAccessKeyId=AKIAIKW5JHOTOOWSF43A&Action=ListOrders&LastUpdatedAfter=1969-12-31T15%3A00%3A00Z&MWSAuthToken=amzn.mws.XXX&MarketplaceId.Id.1=A1VC38T7YXB528&SellerId=A1WD8M4EQL9XVH&Signature=XXXXX&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2020-10-02T00%3A27%3A20Z&Version=2013-09-01 HTTP/1.1Host: mws.amazonservices.jpAccept: application/xmlContent-Type: application/xmlxmlns="https://mws.amazonservices.com/Orders/2013-09-01">2018-08-17T14:59:59ZStandardOrder2018-08-15T09:59:55.270ZGET /orders/v0/orders?MarketplaceIds=A1VC38T7YXB528&CreatedAfter=2021-08-09 HTTP/1.1Host: sellingpartnerapi-fe.amazon.comAccept: application/jsonAuthorization:******x-amz-access-token: XXXXXx-amz-date: 20210809T073105Zx-amz-security-token: XXXXX{"payload": {"Orders": [{"NumberOfItemsUnshipped": 0,"BuyerInfo": {},"IsReplacementOrder": "false","IsSoldByAB": false,"AmazonOrderId": "503-9993250-1405404","LatestShipDate": "2018-08-17T14:59:59Z","EarliestShipDate": "2018-08-15T15:00:00ZMWS API Selling Partner API
© 2021 CData Software Japan, LLC | www.cdata.com/jpYahoo Shopping API の軽減税率対応等注文データや商品マスタなどほとんどのAPIリソースの項目が追加・更新https://developer.yahoo.co.jp/webapi/shopping/tax.html
© 2021 CData Software Japan, LLC | www.cdata.com/jpここまで多種多様なAPIを相手にしているからこそAPI処理を担うレイヤーは実装が重くなりやすいLogicAPI API API API
© 2021 CData Software Japan, LLC | www.cdata.com/jpだからこそ疎結合の「アーキテクチャ」それを実現し、かつAPIの変更・追従を隠蔽する「インターフェース」が超重要
© 2021 CData Software Japan, LLC | www.cdata.com/jp1. About CData SoftwareCData Sync における疎結合アーキテクチャの実現アプローチ
© 2021 CData Software Japan, LLC | www.cdata.com/jpプラグインアーキテクチャで疎結合に構成JDBCインターフェースでAPI追従の衝撃を緩和データソースとなる多種多様なAPIデータパイプラインのメインロジックビジネスロジックレイヤーAPIとロジックをつなぐJDBCインターフェースプラグインレイヤー
© 2021 CData Software Japan, LLC | www.cdata.com/jpプラグインは独立したJDBCライブラリ形式外部から差し込み、追加サービスとしてラインナップユーザーが必要なサービスの連携モジュールを個別にダウンロード
© 2021 CData Software Japan, LLC | www.cdata.com/jp追加されたモジュールの一覧は以下のように配置されている
© 2021 CData Software Japan, LLC | www.cdata.com/jpなぜ「JDBC」を採用?
© 2021 CData Software Japan, LLC | www.cdata.com/jpそもそもインターフェースのデザインって難しくない?
© 2021 CData Software Japan, LLC | www.cdata.com/jp例えば、Interfaceクラスにどのようなメソッドを定義するのか?interface SampleInterface {void Create(Parameter param);void Update(String id, Parameter param);void Delete(String id);Record GetRecord(String id);List GetRecords(Query query);}返り値・引数のデザインはどうする?変更した場合、API全部の実装に手を入れ直さないといけないの?どこまで機能をサポートする?
© 2021 CData Software Japan, LLC | www.cdata.com/jp例えば、REST API でどのメソッドにどのようにデータ・ビジネスモデルを当てはめるのか?GET POSTPUT DELETE
© 2021 CData Software Japan, LLC | www.cdata.com/jpデータを取得したいのにPOST・例:Bodyで検索条件を指定するから、POSTメソッドでGETする・基本的にすべてのエンドポイントがPOST仕様だったり(統一されているならいいが)
© 2021 CData Software Japan, LLC | www.cdata.com/jpリソース指向と関数指向がまざってる・リソース指向、関数指向がまざっている例えばURLがhttps://XXX.com/getXXXhttps://XXX.com/findXXXhttps://XXX.com/users・詳細検索するときだけ、FindやSearchといったURL
© 2021 CData Software Japan, LLC | www.cdata.com/jp良い疎結合の実現には堅牢なインターフェースデザインの採用がポイントでも、プロダクトの成長・スケールを見据えて、インターフェースのデザインを固めることは結構難しくない?柔軟にしすぎると各レイヤーの実装・メンテコストがかさむ固めすぎると追加機能対応に適応し難い
© 2021 CData Software Japan, LLC | www.cdata.com/jpJDBCを採用している理由• RESTのようなゆるい規格ではない。スタンダードかつ認識の齟齬が発生しない、手続きがきまっている規格である。• クライアント側は汎用的な JDBC API の仕様のみを意識して実装できる。使い慣れたクエリ言語、接続定義が利用できる。• 「APIの振る舞いを読み取るためのAPIの存在」つまり「Metadata」を定義でき、扱うことができる。• 独立した利用・動作確認が安易かつ横断的なテスタビリティを確保しやすい。• CData Sync というRDBライクなデータを扱う製品に向いている。
© 2021 CData Software Japan, LLC | www.cdata.com/jpクライアントはAPIの複雑性・不安定性を意識しないAPIとのやり取りをJDBCに一任し、データセットを受け取るビジネスロジックレイヤーはJDBCを通じてSQLをリクエストするだけJDBCレイヤーがAPIリクエスト・レスポンスの解析を担うSELECT [Id],[Name]FROM [Customers]GET /customers?$select=id,nameAuthorization: Basic XXXXAccept: application/json{[“id”:1,”name”:”Hello”],[“id”:2,”name”:”World”]}Id Name1 Hello2 World
© 2021 CData Software Japan, LLC | www.cdata.com/jp?WebAPIHTTPJSONカラムは? 型は?桁数は?何個リソースがあるの?どんなリソースがあるの?フィルターやページングはどうすればいいの?どんなHTTPリクエストをすればいいの?GET? POST? 認証方式は?Metadataが無いとクライアントはどうやってAPIの多様さを解釈すればいいかわからないService
© 2021 CData Software Japan, LLC | www.cdata.com/jpMetadataがあることでクライアントはAPIの仕様の違いを意識せずAPIを扱うことができるテーブル定義としてリソースをリストアップ。ユーザーが動的にアクセスしたいリソースを選択できるプロパティ、型、桁数がMetadataから読み取れるため、マッピングやバリデーションが行いやすい認証に必要なアプローチ、プロパティ、必須条件を提供しAPI個別の認証方式の違いを抽象化
© 2021 CData Software Japan, LLC | www.cdata.com/jpJDBCのエコシステムを活用することでインターフェース単独で動作確認・テスト・検証が安易https://www.dbvis.com/JDBC用ツールを活用してビジネスロジックを通さずに独立して動作確認・テスト・検証が可能いちいちモックなどを作らなくていい
© 2021 CData Software Japan, LLC | www.cdata.com/jpCData Sync 本体・プラグインは個別にデイリービルド独立してオフライン・オンラインテストも実施Sync LogicModulePlugin AModulePlugin BModulePlugin CModuleSync Main Moduleプラグインでのテストの大まかな区分け・単体テスト:クラス・メソッド単位のテスト・結合テスト:API Request Builder の振る舞いのテスト・インターフェーステスト:JDBC API(SQL)を通じて生成されるAPIリクエストのテスト・オンラインテスト:実際にAPIを実行して正常性確認を行うテスト
© 2021 CData Software Japan, LLC | www.cdata.com/jp内部のインターフェーステストの一例JDBCとAPIリクエスト検証ファイルの組み合わせ@Testpublic void SampleTest() throws Exception {Class.forName("cdata.jdbc.kintone.KintoneDriver");String testFile = "requestCheckFile.txt";Connection conn = DriverManager.getConnection("jdbc:kintone:User=myuseraccount;Password=mypassword;Url=http://subdomain.domain.com;" + testFile);Statement stat = conn.createStatement();boolean ret = stat.execute("SELECT RecordId,Revision FROM [顧客管理(営業支援パック)] ");int row = 0;if (ret) {ResultSet rs = pstmt.getResultSet();while (rs.next()) {if (row == 0) {assertEquals("3", resultSet.getString("RecordId"));assertEquals("10", resultSet.getString("Revision"));}}row++;}assertEquals(10, row);}RequestLines=3,11 | ValidateRequest=JSON | ResponseLines=16,16 |NextData=18 | ValidateUrl=https://XXXX.kintone.com/k/v1/apps.json |RequestHeaders=3,11Host: XXXX.kintone.comAuthorization: Basic XXXXXXXXX==Accept: application/jsonAccept-Encoding: gzip, deflateUser-Agent: CData Data Provider Engine - www.cdata.com - Accepts: gzipContent-Type: application/jsonContent-Length: 13X-Cybozu-Authorization: XXXXXXXXXX==X-HTTP-Method-Override: GET{"limit":100}{"apps":[{"appId":"3","code":"","name":“TimeCard","description":"勤務時間を記録するアプリです。","createdAt":"2016-10-26T10:12:04.000Z","creator":{"code":"Administrator","name":"Administrator"},"modifiedAt":"2017-01-29T10:50:44.000Z","modifier":{"code…リクエストのダミーファイルを作成しビジネスロジックを通じて生成される想定のSQLとAPIリクエストの整合性をチェックレスポンスの結果もResultSetとして検証
© 2021 CData Software Japan, LLC | www.cdata.com/jpとはいえ、それでもやっぱり難しいインターフェースと外部APIの辻褄合わせ
© 2021 CData Software Japan, LLC | www.cdata.com/jpAPIの複雑性・不安定性をどこまで隠蔽するべきか?どのように隠蔽するべきか?Web APIService
© 2021 CData Software Japan, LLC | www.cdata.com/jpデータ型はどうしようか毎回悩む・そもそもAPI仕様書に型情報が載っていないものが多い・通貨フィールドが数値型ではなく、円マーク付きで返ってくるので文字列になってしまうものも例:var x = “¥1,000,000”;・データとしては数値的に扱いたいニーズがあるので、プラグインサイドで通貨マークの調整処理が必要
© 2021 CData Software Japan, LLC | www.cdata.com/jpエラーハンドリングはどこまでインターフェース側でカバーするべきか・Error Code 404 のはずなのに 200 でエラーが返ってくることがあった。成功なのに失敗?・API Limit Error は待機するべきかリトライするべきか・ページネーションの最後がエラーになるがクライアントにとってはエラーにしないほうがいいものがあったり
© 2021 CData Software Japan, LLC | www.cdata.com/jp余談
© 2021 CData Software Japan, LLC | www.cdata.com/jp実はリリース当初は密結合だった CData Sync・基本的な製品思想は同じだがAPI側プラグインとロジックサイドが密結合・ユーザーは使いたいAPIの数だけソフトウェアをインストールする必要があった・ビジネスロジックサイドに修正が入ると、全データソース分のビルドを作り直し・各開発チームの担当レイヤーが入り乱れ
© 2021 CData Software Japan, LLC | www.cdata.com/jp1. About CData Softwareまとめ
© 2021 CData Software Japan, LLC | www.cdata.com/jp不安定かつ多様なAPIと連携しなければいけないでは、どのようにプロダクト・サービスとしてサポート・スケールするのか?API追従の衝撃をビジネスロジック側に影響させないアーキテクチャ疎結合の「アーキテクチャ」それを実現し、かつAPIの変更・追従を隠蔽する「インターフェース」が鍵その一つのアプローチとして「JDBC」が活用できる各チームが独立して機能追加・アップデート・ビルド・テスト・リリースが行える体制
© 2021 CData Software Japan, LLC | www.cdata.com/jp1. About CData Software最後に
© 2021 CData Software Japan, LLC | www.cdata.com/jpCData Software Japan では業務拡大につき新しいメンバーを絶賛募集中!https://www.wantedly.com/companies/cdata2/projects・テクニカルサポートエンジニア・製品開発エンジニア・インサイドセールス・ローカライゼーション etc