web-dev-qa-db-ja.com

REST APIを公開するマイクロサービスでファイルイベントを処理する方法

少しコンテキスト。

私が働いている会社は、現在モノリシックである主力製品のモジュール式アーキテクチャー(マイクロサービスに似たもの)に移行し始めています。最初のステップは、現在製品に含まれていないサービスを構築することです。モノリスの外側に構築して、サービスのサイズと複雑さの増大を防ぐ必要があります。

このコンポーネントは、「コネクタ」です。つまり、すべてが異なるプロトコル、標準、およびフォーマットを使用する外部関係者へのメッセージの送信を処理する必要があります。それは、顧客が標準化されたAPI /サービスを介してこれらの外部サービスと対話するための簡単な方法を提供することを目的としています。現在、主な製品がメッセージを生成しますが、メッセージの送信は行いません。

ここで私は苦労しています。この新しいコネクタにREST apiを公開して、顧客がそれとやり取りできるようにして、POST送信するメッセージ、詳細を取得するためにメッセージで、送信されたメッセージのリストなどを取得します。これで問題ありません。問題は、アプリケーションがファイル共有からファイルを取得して送信し、結果を表示できるようにすることです。 REST api。これは、現在の製品に対する自然な改善であるためです。モノリスはファイルをフォルダXに配置し、コネクタはそれらを取得します。

しかし、それをどのように拾うべきでしょうか? RESTとファイルイベントに反応することの両方でマイクロサービスに近づけることは悪い考えです。サーブレットコンテナーはREST経由で呼び出すときにすべてのスレッドを処理します。ファイル共有を介して取得されるファイル?ここでは、同期RESTとイベントベースのファイル共有を組み合わせています。

たぶん、より良いアイデアは、ファイルをピックアップして、POSTファイルをコネクタAPIに渡すことです。

選択する言語はJavaですが、それは設計上の問題です。

前もって感謝します。

5
GalacticDessert

最善の解決策は、ファイルを生成するものを変更して、ファイルに保存するのではなく、APIに送信することです。

これにより、追加される新しいファイルでAPIがトリガーされ、適切な処理を行うことができます。つまり、コンテンツとメタデータを何らかのデータベースに保存します。

ファイルのソースを変更できない場合は、はい。ディレクトリを監視し、IOイベントに応答してファイルをポストする3次アプリケーションは、APIにそのロジックを追加するよりも優れています。

一般的に言って分離は良いです。単一の「コネクター」APIについて話しているときに、心に留めておくべきこと。たぶん、あなたはより具体的な目的を持つ複数のAPIについて考える必要がありますか?

4
Ewan

マネージAPIにファイルを公開できます。

たとえば、ファイルをcdnに保存します。ストレージバケットのようにファイルオブジェクトストレージを使用すると、さまざまな権限でファイルを保存できるため、{key,client_id}ペアを使用したり、粗いIPフィルターのポリシーを設定したりすることによってのみアクセスできます。例として、 this リソースは、S3でそれを行う方法を示しています。

オブジェクトストレージは、分散ファイルシステムなどのコンテンツ配信ネットワークの他の利点を提供する可能性があります(ファイルが世界中にアクセスされている場合に非常に役立ちます)。

このファイルを取得する方法により、いくつかの解決策が可能になります。

1つは、API(client_id、key)にキーを追加して、保護されたファイルリソースをAPIと共有し、次のような形でファイルの保護されたURLにアクセスできるようにすることです。

https://files.anycdn.com/path/to/file.extension?Policy=bnQiOldGF0ZW1lt7IlJl-SaeO27zJXgtYtk&KeyPairId=APKAQADZ7BCN2PFPW8DA

このようにして、APIをファイルcdnのクライアントとして扱います。

もう1つはURLをマスクすることで、クライアントはファイルを取得するために次のように要求できます。

GET https://rest.api/file/endpoint/filename

API側では、内部的に、ファイル(別の場所にある)を取得し、ファイルのコンテンツを含むHTTPストリームをクライアントに送り返します。
または、APIがリクエストディスパッチャーとして機能している場合は、ファイルサービスにストリームをリクエストし、このストリームをレスポンスとして転送します。

シンプルにしてください。通常、最良の結果が得られます。
APIと共有される制御された資格情報の下でファイルのURLを保護し、この資格情報を定期的に更新する方法を設定することが可能です。

0
Evhz