アマゾンウェブサービス用C ++ SDK



昨年末に向けて、Amazonは(最終的に!)AWSプラットフォーム用のC ++ SDKをリリースしました。 なぜこれほど長く引っ張られたのかは明らかではありません-C ++で書かれたアプリケーションがたくさんあり、そのうちAWSを便利に使いたいとずっと思っていました。 実際、単一のJavaではありません。



最近のC ++で書かれたものをゼロから見るのは常に興味深いものです。過去の開発に固有の後方互換性や奇妙なアーキテクチャソリューションの負担がありません。 ここではドキュメントを再説明しませんが、SDKの全体的な動作を決定する重要な点について説明します。



C ++ 11



Carthageはその時点で破壊されることになっていたため、今日、C ++にまだ切り替えていないすべてのライブラリとアプリケーションは死ぬはずです。 彼らは単に現代世界に属していません。 私は目に涙を浮かべて、「聴衆を拡大するためにC ++ 11なしでやろう」というライブラリに関するこのような記事を読みました。 私の場合、この決定は「車よりも馴染みがあるので、馬に乗る」ということです。 Amazonの新しいSDKは逆行を追跡しません-すぐに使用できるC ++ 11のすべての機能(自動、スマートポインター、ラムダなど)が提供されます。 ラムダをコールバック関数として指定する機会を与えることは重要であり、ラムダを使用しないと、Javascriptでさえ馬鹿になります。 もちろん、明示的に新しい\削除はありません。 美人!



コードのシンプルさ



前の段落の結果として-結果のコードのみを見てください。 DynamoDBにキーと値のペアを配置します。



DynamoDBClient client; AttributeValue haskKeyAttribute; hashKeyAttribute.SetS("SampleHashKeyValue") AttributeValue valueAttribute; valueAttribute.SetS("SampleValue") PutItemRequest putItemRequest; putItemRequest.WithTableName("TestTableName").AddItem("HashKey", hashKeyAttribute).AddItem("Value", valueAttribute); client.PutItem(putItemRequest);
      
      







「C ++は複雑すぎて冗長です」などの表現が好きな人に教えてください。JavaやPythonよりも悪いのは何ですか? 消費するメモリが少なくなり、実行速度が上がります。



不要な依存関係はありません



Amazonの関係者は、プロジェクトを接続および組み立てる際に、不必要な中毒はすべて複雑さを増すため、ユーザー数を減らすことを理解しています。 したがって、AWS C ++ SDKは、ブーストにも他の基本的なフレームワークにも依存しません。 ロギングのような小さなライブラリでさえ、そこにはありません。 唯一の依存関係はHTTPクライアントです。 それでも、この問題の独自の実装をSDKにプッシュするのは多すぎます。 すぐに使用できるように、システムCURL、WinHTTP、WinInetにバインドするか、実装を実装するかを選択できます。



CMake



C ++の世界は、プロジェクトの説明を標準化する方向に少し進んでいます。 CMakeはまだ完全に勝っていないかもしれませんが、可能な限り幅広いプラットフォームとコンパイラーのセットをビルドできるようにする必要がある場合、このオプションが最初に思い浮かびます。 Amazonもここで違いはありませんでした-すべてがCMakeにあり、好きなものを自分でコンパイルします。 CLionで作業することは非常に便利です。



依存性注入



アプリケーション構成の基礎としての依存性注入。 Amazonのデフォルトの実装を使用するか、http-client、logging、authorization、memory allocator、速度制限と再試行戦略、非同期イベントハンドラーなどすべてに対して文字通り独自の実装を使用する機会があります。 その結果、これらの各コンポーネントは小さく、テスト可能であり、統合の問題を引き起こしていません。



ロギング



依存関係にログインするためのライブラリはありません。 ログを受信する場合は、特定のインターフェイスを実装し、クライアントを初期化するときにそれを構成に渡します。 ログのテキストを含むコールバックを受け取り、必要な場所に書き込みます。 デフォルトの実装では、すべてのログ、現在のフォルダーにすべてが書き込まれ、古いログは1時間ごとに削除されます。



すべての操作の同期および非同期バージョン



Amazonは、アプリケーションのアーキテクチャが異なる場合があるため、すべての操作が同期バージョンと非同期バージョンの両方で提示されることを理解しています。 同期バージョンでは、操作が完了するまで待機し(たとえば、大きなファイルをロードする場合は、長時間待機する場合があります)、その後、関数が返されたことを確認します。



 CreateTableOutcome createTableOutcome = dynamoDbClient->CreateTable(createTableRequest); if (createTableOutcome.IsSuccess()) { ... } else { ... }
      
      







非同期バージョンでは、操作の終了時に呼び出されるコールバック関数を指定します。 要求、応答、およびコールがコールバック関数に転送される前に定義できるコンテキストにより、コールとは何か、その結果を処理する方法を理解できます。



 void putItemFinished(const DynamoDBClient *client, const PutItemRequest& request, const PutItemOutcome& outcome, const std::shared_ptr<AsyncContext>& context) { if (outcome.IsSuccess()) { SEND_QUEUE.erase(context->GetUUID()); } } auto context = Aws::MakeShared<AsyncContext>("Hello!"); context.SetUUID("UniqueRequestKey"); SEND_QUEUE["UniqueRequestKey"] = putItemRequest; client.PutItemAsync(putItemRequest, &putItemFinished, context);
      
      







C ++ 11に再び栄光を。コールバックとして、関数だけでなく、オブジェクトのクラスメソッド(std :: bindを介して)またはラムダを渡すことができます。



非同期エグゼキューターのサポート



非同期操作が好きで、非同期操作を実行するためのクラスであるプログラムにバックグラウンドフローのプールが既にある場合は、それを使用してAWS C ++ SDK操作を開始できます。 したがって、アプリケーション内のすべての非同期操作は1つのスキームに従って実行され、それ以外の場合はSDKが起動するバックグラウンドスレッドにリソースを保存します。



制限速度



特定の操作のデータ転送速度を制限する必要がある場合-すべてはあなたの力です。 RateLimiterインターフェースを実装し、初期化中に実装を構成に転送し、データ転送帯域を完全に制御します。



例外なし



例外を使用するか使用しないかの問題は、C ++の世界では長年のホリバーです。 しかし、最近の例では、例外を避けようとしています。 AWS C ++ SDKには例外はありません。 彼らは、より高い柔軟性とパフォーマンスを主張しています。 エラーコードが必要です-結果を確認してください。IsSuccess()、falseの場合-結果に追加のエラーデータもあります。 あなたのことは知りませんが、私はこのアプローチが好きです。



デフォルトの再試行再試行戦略



Amazon SDKは主にネットワーク操作に関するストーリーであるため、ネットワーク操作はしばしばエラーで終わることを理解する必要があります。 どこかでWi-Fiが失敗し、どこかでモバイルネットワークが、どこかで何らかの安定した地上波チャネルが3テラバイトの面白いファイルのダウンロードを拒否しました。 AWS C ++ SDKは、デフォルトで、失敗した操作の再試行を試みます。 アルゴリズムの詳細(再試行の回数、試行間の時間)は、再試行戦略の独自の実装によって制御できます。



メモリアロケーターを定義する機能



あなたのアプリケーションがどれだけのメモリを使用するか、それを割り当てるとき、削除するとき、それがどれくらい速く起こるかが重要な場合(そしてあなたにとってそれはすべて興味深いはずです、なぜ他にC ++で書くのですか?)-あなたはあなた自身のアロケータを定義できますメモリ。 これを行うには、MemorySystemInterfaceを継承し、いくつかのメソッドを定義する必要があります。 優れたアロケーターをどこかから盗み、データボリュームとアルゴリズムに合わせてシャープにし、パフォーマンスを大幅に向上させることができます。



Github



すべてがGitHubに存在し 、問題、プルリクエストが受け入れられます。 コミュニティとの連絡は良好です。



C ++アプリケーションからAWSを使用して頑張ってください!



All Articles