私は現在、データベースへのアクセスを許可するシステムを設計しています。前提条件は次のとおりです。
- データベースにはアクセス層が必要です。アクセス層は、データベーステーブルを表すオブジェクトを提供する必要があります。(これは、いくつかのORMフレームワークを使用して行われます)。
- データベースからデータを取得したいクライアントは、最初にアクセスレイヤーからオブジェクトを取得してから、それらのオブジェクトを使用してデータを取得する必要があります。
- クライアントはPython、Java、またはC++を使用できます。
- アクセス層はJavaに基づいています。
- 多くのクライアントは存在しませんが、大量のデータを処理することになります。
私にとって難しい質問は、アクセスレイヤーとクライアントの間でオブジェクトを渡すためにどのテクノロジーを使用すべきかということです。ZeroC ICE、Apache Thrift、またはGoogleProtocolBuffersの使用を検討しています。どれを使う価値があるか誰かが意見を持っていますか?
これはプロトコルバッファに関する私の研究です:
利点:
- 使いやすく、簡単に始められます
- 十分に文書化されている
- 高度に最適化
- Javaのような言語でオブジェクトのデータ構造を定義する
- セッターとゲッターの実装を自動的に生成し、Python、Java、C++のメソッドを構築します
- 他の言語のオープンソース入札
- 古いバージョンのアプリケーションに影響を与えることなく、オブジェクトを拡張できます
- オープンソースのRpcChanelとRpcControllerの実装がたくさんあります(テストされていません)
短所:
- オブジェクト転送を実装する必要があります
- オブジェクトの構造は、使用する前に定義する必要があります。
そのため、その場でいくつかのフィールドを追加することはできません(更新:それを行う可能性があります、コメントを参照してください) - 1つのオブジェクトのファイルを読み取る必要がある場合は、ファイル全体を解析する必要があります(対照的に、XMLでは選択したタグを無視できます)
- オブジェクトメソッドの呼び出しにRPCを使用する場合は、サービスを定義し、RpcChanelとRpcControllerの実装を提供する必要があります
これは、ApacheThriftに関する私の調査です。
利点:
- サポートされている言語(クラス、重要なすべてのもの)のソースコードを生成するコンパイラを提供します
- 構造体にオプションのフィールドを定義できるようにします(フィールドに値を設定しない場合、転送されるデータのサイズは小さくなります)
- enableは、「一方向」であるいくつかのメソッドを指摘します(呼び出し後に何も返さず、クライアントはクエリの完了処理に関するサーバーからの応答を待ちません)
- コレクション(マップ、リスト、セット)、オブジェクト、プリミティブのシリアル化(逆シリアル化)、定数、列挙、例外をサポートします
- ほとんどの問題、エラーは解決され、説明されています
- シリアル化のさまざまな方法を提供します:(TBinaryProtocol ...)およびデータを交換するさまざまな方法:(TBufferedTransport、TZlibTransport ...)
- コンパイラは、いくつかの新しいメソッドを追加することで拡張できる言語の解凍用のクラス(構造)を生成します。
- プロトコル(サーバーとクライアント)にフィールドを追加し、他の古いコードを削除して、新しいコードを適切に相互作用させることができます(更新中のいくつかのルール)
- 非同期呼び出しを有効にする
- 使いやすい
短所:
- ドキュメント-問題の原因を知るのが非常に難しい場合があるいくつかのエラーが含まれています
- 常に問題が適切にタグ付けされているわけではありません(インターネットで解決策を探す場合)。
- サービスメソッドのオーバーロードをサポートしていません
- チュートリアルでは、節約の使用法の簡単な例のみを取り上げています
- 始めるのは難しい
ICE ZeroC: たとえばソケットを介して自分でオブジェクトを渡す必要がないため、ProtocolBuffersよりも優れています。ICEは、接続の管理を提供できるServantLocatorsも提供します。問題は、ICEがPBよりもはるかに遅く、効率が悪いかどうかです。