BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Smoke、AmazonによるSwiftの軽量サーバーサイドフレームワーク

Smoke、AmazonによるSwiftの軽量サーバーサイドフレームワーク

ブックマーク

原文(投稿日:2018/10/14)へのリンク

Amazon Smokeフレームワークは、Swiftで書かれたオープンソースの新しい軽量サーバーサイドフレームワークで、RESTライクもしくはRPCライクなサービスの構築を目指している。そのアーキテクチャは使いやすさを重視し、リクエストハンドラーに純粋関数型のプログラミングスタイルを好んでいる。

Amazon Smokeによるサービス作成には、3つのステップが必要になる。

  • 受信リクエストをハンドルするオペレーションを定義する。各オペレーションはOperationInputと汎用のApplicationContextを引数にとり、OperationOutputを同期もしくは非同期で返す関数により定義する。コードは次のようになる。

    // 同期ハンドラー
    func handleTheOperation(input: OperationInput, context: MyApplicationContext) throws -> OperationOutput {
      return OperationOutput()
    }
    
    // 非同期ハンドラー
    func handleOperationAsync(input: OperationInput, context: MyApplicationContext,
                      responseHandler: (SmokeResult<OutputAttributes>) -> ()) throws {
    
      let result = OperationOutput()
      rensponseHandler(.response(attributes))
    }
    

入力および出力タイプはValidatableCodableプロトコルに準拠しなくてはならない。これによりvalidate関数による入力および出力フィールドの検証が可能になる。

  • 受信リクエストに対し、オペレーションハンドラーをどのように選択するかを指定する。Smokeは最初から、RESTライクなサービスで使えるStandardSmokeHTTP1HandlerSelectorを提供している。この場合、HTTP verbとURIに基づいて所定のリクエストのハンドラーを選択する。

    import SmokeOperations
    
    public typealias HandlerSelectorType =
    StandardSmokeHTTP1HandlerSelector<MyApplicationContext, JSONPayloadHTTP1OperationDelegate>
    
    public func createHandlerSelector() -> HandlerSelectorType {
      var newHandler = HandlerSelectorType()
    
      newHandler.addHandlerForUri("/theOperationPath", httpMethod: .POST,
                            operation: handleTheOperation,
                            allowedErrors: [(MyApplicationErrors.unknownResource, 400)])
    
      return newHandler
    }
    
  • リクエストをデコードし、ハンドラーをディスパッチし、レスポンスをエンコードしてクライアントに送信するため、アプリケーションサーバーを設定する。エンコーディングとデコーディングは、アプリケーションサーバーに引数として渡されるアプリケーションデリゲートの責務だ。Smokeには、JSONリクエストおよびレスポンスのためのJSONPayloadHTTP1OperationDelegateが含まれている。アプリケーションサーバーには、アプリケーションコンテキストをインスタンス化して渡す責務もある。

    import Foundation
    import SmokeHTTP1
    import SmokeOperations
    import LoggerAPI
    
    // Enable logging here
    
    let operationContext = ...
    
    do {
        try SmokeHTTP1Server.startAsOperationServer(
            withHandlerSelector: createHandlerSelector(),
            andContext: operationContext,
            defaultOperationDelegate: JSONPayloadHTTP1OperationDelegate())
    } catch {
        Log.error("Unable to start Operation Server: '\(error)'")
    }
    

Amazon Smokeのキーコンセプトは、アプリケーションコンテキストだ。これは起動時に作られ、可能な限り同時に、全てのハンドラーに渡される。スレッドセーフである必要性をなくして並行動作を簡素化するため、Amazonはこのオブジェクトを強い型付けにしてイミュータブルにすることを推奨している。それ以外は、どんな型であっても構わない。コンテキストを使うことで、出力が入力と渡されたコンテキストにのみ依存する純粋関数として、ハンドラーを書くことができる。これにより、ハンドラーをユニットテストしやすくなる、具体的には、開発環境とデプロイメント環境の差異を隠蔽しやすくなる。これはコンテキストを用いて、開発とデプロイメントで異なる依存性(たとえばモックサービス、乱数生成器など)を渡すことで実現できる。

Amazon SmokeはAppleのSwiftNIO上に構築されており、Swift Package Managerにインテグレートされている。package.swiftに次の依存関係ルールを追加することで、プロジェクトにインクルードすることができる。

dependencies: [
    .package(url: "https://github.com/amzn/smoke-framework.git", .upToNextMajor(from: "0.6.0"))
]

SwiftのサーバーサイドフレームワークはSmokeだけではない。他に注目すべきものとして、VaporKituraがある。Smokeと比べて、VaporとKituraの両者はより連結型のアーキテクチャを持ち、いろいろな意味でNode Express APIを思い出させる。両者ともに、データベースアクセスやセッション、クレデンシャル管理など、より多くのコンポーネントを含んでいる。

 
 

Rate this Article

Adoption Stage
Style
 
 

この記事に星をつける

おすすめ度
スタイル

BT