2016-11-03 10 views
0

AWS内のオブジェクトにアクセスするために、複数のAWSラムダ関数(および複数の同じインスタンス)を使用しています。ラムダのスレッドの安全性に関する情報は?書き込みの順序は重要ではありませんが(私の場合)、読み取り - 変更 - 書き込みのアトミック性は重要です。 誰かが適切な/意図した解決策を見つけましたか?aws lambda間の同期

+1

あなたは文字通り*スレッド*の安全性について話していますか、まれに用語を使用していますか?ラムダ関数は、同じ関数を複数同時に呼び出す場合でも、個々のコンテナで実行されるため、同じ関数の異なる関数または異なる呼び出しの間に実際のスレッド安全性の問題はありません。 –

+0

マイケル - はい、私は偶然という言葉を使用しています。 S3ファイルの変更を考慮してください:2つのラムダは同じファイルを変更する必要があります。どちらも/ tmp/spaceに読み込み、S3に修正して書き戻します。後でそれをした人は、最初のものの結果を上書きします。私はIoTブローカーの影で同じ問題を抱えています。 – vitalyr

答えて

1

厳密なリード・モディファイ・ライト・アトミック性は、処理の直列化(多分ロックなどを使用)を必要とします。これはラムダでは不可能です。

あなたができることは次のとおりです。SQSキューに要求を書き込んだ後、単一のEC2インスタンス上で単一スレッド(または適切に同期された)ソフトウェアを使用してキューエントリを処理します。

CAP定理(https://en.wikipedia.org/wiki/CAP_theorem)は、設計上の1つのEC2インスタンス上のこのプロセスが単一障害点になるため、これがあなたの可用性に影響すると言います。

また、トランザクションでRDS DBを使用することもできます(または条件付き書き込み/一貫性読み込みを使用するDynamoDB)。

+0

ありがとうございます - 非常に興味深い所見ですが、AWSは完全に分散されたシステムではないと思います。通常の一般的な意味では配布されていません。理論的には、AWSは、本質的には、通常のアクセス方法を使用してテストおよび設定命令によって制御される単一のビットである種の集中ロックオブジェクトを提供できます。しかし、おそらくそれはしません。 – vitalyr

+0

さて、DBトランザクションが機能します。 Elasticacheはmemcachedコマンドとcasコマンドで動作します。しかし、ボトルネックを避けるために、SQS FIFOを使用するほうがよいでしょう。しかし、最良の選択肢は、可能な限りロックを避けることです。 – Digitalkapitaen

1

私は同じことを達成しようとしているので、私はこれを見つけました。

問題:私は、EC2インスタンスで稼動するステートマシンのクラスタを持っています。それぞれは、ラムダを非同期的に呼び出す(InvocationType.Event)。毎回ラムダコードを実行したいが、ラムダ内からダウンストリームネットワークコールを1回だけ実行する。

解決策:TTLが比較的低いDynamoDBテーブルを使用して、イベントデータから生成された一意のIDを持つアイテムの条件付きプットを実行します。このデータは、その一意イベントのすべてのラムダ呼び出しで同じになります。次に、条件付きプットが成功した場合にのみ、ダウンストリームネットワークコールを実行します。

分散システムでは、「フェイルファスト」システムのために、ラムダ経由で使用されることが多い分散同期技術です。