マイクロサービス化とクライアントアプリ
「APIのマイクロサービス化が進む中、クライアントアプリの実装がどんどん複雑で面倒になってきている。アプリはBFFのみと通信し、BFFがバックエンドのAPIとのやり取りを担うアーキテクチャに変更したい。」
最近はこのようなケースが増えてきているのではないでしょうか。
BFFの構築方法は多くの検討の余地があると思いますが、ここではEdgeWorkersを使ってエッジサーバー上にBFFを構築する例を考えます。EdgeWorkersで構築することでBFFのスケーリングを気にする必要がなくなります。
EdgeWorkersとは
EdgeWorkersでは、エッジで駆動するリクエスト/レスポンスのイベントハンドラを提供し、 JavaScript を実行できます。クライアントの近くのEdgeサーバーで処理を行うためレイテンシが小さく、世界中に数十万台のサーバーが配置され、自動で分散駆動するためスケーリングを気にしなくて良いというメリットがあります。
参考: EdgeWorkers:Akamaiのエッジサーバー上でJavascriptで書いたコードが実行可能に
サンプル
ここでは、既存のAPIをcallした結果をアグリゲートするという内容で実装します。既存リソースを無駄にすることなくBFFを構築できます。
import { logger } from 'log'
import { createResponse } from 'create-response'
import { httpRequest } from 'http-request'
export async function responseProvider(request) {
// 3つのAPIをcallする
const data = await Promise.all([
callAPI1(request),
callAPI2(request),
callAPI3(request)
])
const result = {
api_1: data[0],
api_2: data[1],
api_3: data[2]
}
// アグリゲートして返却
const options = {}
options.status = 200
options.headers = {}
return createResponse(JSON.stringify({
status: "OK",
data: result
}), options)
}
EdgeWorkersを呼び出すよう設定
CDN側の配信設定からEdgeWorkersを呼び出します。
おわりに
今回のサンプルは非常に簡単なものですが、たとえばEdgeWorkersに組み込まれているcryptoモジュールを利用したJWTの検証処理を追加などするとより実用的になります。アーキテクチャを再検討する機会がありましたらぜひEdge Computingも選択肢に含めてみてはいかがでしょうか。