序文
まず、ビジネスシナリオについての話:サードパーティのクラウドプラットフォーム上のすべての私たちのシステムビデオ店は、我々はビデオを操作するために、そのインターフェイスを呼び出す必要があります。サードパーティのプラットフォームに、この操作は、ビデオは並行性の問題を(ビデオは一度だけ動作させる)が表示されます動作させるための他の要求がある場合は、その間0-30秒の遅延が生じることがあります。
ソリューション
システムは、分散システムであり、他の同期動作の同期キューの従来の使用は、使用することができないので、分散ロックの使用は、この問題を解決します。分散ロック実装は一般的に3つの方法があります:2のRedisベースのロック、データベースのロックをもとにして1〜3 ZKベースロック....
ビジネスロジックは非常に高い信頼性を必要としないため、分散ロックについて私は、その独自の並行処理をここにフォローアップのブログ記事を書きます高くないので、最も簡単なロックベースのデータベースを使用します。
データベースのロックが要求を受信したユニークなインデックスデータベースの使用での成功した挿入がロック獲得成功、または失敗を言った場合、それは、データベースにデータを挿入します。このフローチャートは以下のようです:
コアロックステップ次のように
最初の使用後1は、ビデオが動作を開始する最初の操作であることを意味する場合に成功するためにロックを取得するために、データベース・インサートにユーザ要求データを受信します。
2.障害がビデオ出力が再び行われる場合には、ロック取得操作は、タイムアウトしたか否かが判断された場合、タイムアウトは、任意の治療ではありません。
PS:残業の導入はここからですので、映像が運転されている場合は、この時間サーバーの崩壊、ユーザが第2の操作を要求したときに、このビデオは操作を再開できるようにします。
実際には、上記の二つの判決は、SQLを使用して完了することができます。
INSERT INTO lock_table(video_id, STATUS, overtime) VALUES (#{videoId},#{status},#{overtime}) WHERE NOT EXISTS ( SELECT 1 FROM lock_table WHERE video_id = #{videoId} AND CURRENT_TIMESTAMP () > overtime )
当第一次操作该视频时where条件返回true可以正常获取锁,当第二次操作该视频且操作未超时,则where条件返回false,当第二次操作该视频且操作超时,where条件返回true但是SQL会报错,以此来表示操作超时。