配布ロックできるサービスのMySql/GigaSpaces/Netapp[定休日]
-
21-08-2019 - |
質問
免責事項:どのくらいかかるのかそれが問題 この質問, なの 展開に必要です。私 その答えた3upvotes場 編集中の問題の展開の要求に答えし となり関係ありません。その理由を私 resubmittingたいと考えて の質問'答え',も がんにおいても有意義なupvoted 答えになります。オープンしま uservoice 提出 この問題です。こういう掲はStackOverflowの元々の質問に答えよう示されないの未解決の問題'タブがあります。
る分散型ロックサービスをお使いになりますか?
の要件は次の通りである。
- 相互排除ロックから見た異なるプロセス/機械
- ロック---リリース味
- 自動ロックをリリースした後、特定のタイムアウトの場合、ロックをホルダーダイス、自動的に解放された後のX秒
- Java実施
- 簡単に展開 -必ず必要としない複雑な展開を超えては業などを含め、MySqlはGigaSpaces.必要なくなってしまったことは、我々も製品(特にGigaSpaces-この英語表記に切り替えたのを支配しています。
- 索:.純実装
- の場合は無料:行き詰まり検出/低減
僕は興味ないで回答ようにすることができれぞれのデータベース"、"できる以上のJavaSpaces"-分かっています。関連する答えだけが含まれ、out-of-the-box実績のある実装されます。
解決
ここでは正確にあなたが、私はネットからGigaSpacesと連携3.基準に何を意味するのか、ないのJavaに応じて、あなたの基準を満たしているGigaSpaces基づいて回答の概要です
ロックとデータメンバーブールプロパティのロックが解除されているものをSpaceID + SpaceRoutingプロパティIDingでロッククラスを作成します。
sealed public class IdLockTrans
{
[SpaceID]
[SpaceRouting]
public string ID
{
get;
set;
}
[DataMember]
public bool Unlocked
{
get;
set;
}
public IdLockTrans(Id id)
{
ID = id.ID;
}
public IdLockTrans()
{
}
}
あなたは、特定の後にロック解除用GigaSpaces'リース時間を使用します。 タイムアウト。これはGigaSpacesはIdLockTransオブジェクトを削除します 宇宙から自動的に彼らは、タイムアウトのためにアイドルになった後、 期間。 ID用IdLockTransの欠如は、IDのロックが解除されていることを意味する。
あなたのロッカーのクラスを定義し、これらのクラスのメンバを初期化します。
private readonly ISpaceProxy _proxy;
private readonly long _leaseTime;
public override bool Lock(Id id, long timeout)
{
bool locked;
IdLockTrans lockTransTemplate = new IdLockTrans(id);
// Assume that this is a new id.
try
{
_proxy.Write(lockTransTemplate, null, _leaseTime, 0, UpdateModifiers.WriteOnly);
locked = true;
}
catch (EntryAlreadyInSpaceException)
{
using (ITransaction tx = _proxy.CreateLocalTransaction())
{
try
{
lockTransTemplate.Unlocked = true;
IdLockTrans lockTrans = _proxy.Take(lockTransTemplate, tx, timeout);
locked = (lockTrans != null);
if (lockTrans != null)
{
lockTrans.Unlocked = false;
_proxy.Write(lockTrans, tx, _leaseTime, 0, UpdateModifiers.WriteOnly);
}
tx.Commit();
}
catch
{
tx.Abort();
throw;
}
}
}
return locked;
}
public override void Unlock(Id lockedId)
{
IdLockTrans lockTrans = new IdLockTrans(lockedId);
lockTrans.Unlocked = true;
try
{
_proxy.Update(lockTrans, null, _leaseTime, 0, UpdateModifiers.UpdateOnly);
}
catch (EntryNotInSpaceException)
{
throw new Exception("IdLockTrans for " + lockTrans.ID
+ " not found on Unlock. Lock time exceeded lease time.");
}
}
他のヒント
あなたの.NET実装では、Java APIを提供ボックスのロックのうち、既存の/アンロックAPIは非常に近いです。見る: http://www.gigaspaces.com/docs/JavaDoc8 .0 / ORG / openspaces /コア/ DefaultGigaMap.html の
あなたは製品に付属gs-openspaces-src.zipファイルの一部として、このJavaクラスのソースコードを発見したことがあります。 Gigaspacesの.NET APIと同じを持つことはstraightfwdする必要があります。
あなたはまだ探している場合は、 Apacheの飼育係のを見てみます:
のZooKeeperは、命名分散同期を提供し、グループのサービスを提供し、設定情報を維持するための集中型サービスです。サービスのこれらの種類のすべては、分散アプリケーションによって何らかの形で使用されます。
飼育係のドキュメントには、ロックサービスを構築する方法をの例を提供します飼育係の一番上にを。
ユニークキーは非常に簡単ですロックするMySQLを使用します。
仮定1:
あなたはトランザクションを使用して、分離レベルは、コミット読み込まれます。
仮定2: あなたは一意のキーでスレッドを処理ロック、およびトランザクションがコミットしたときにそれを解放します。
そして、あなたが配布するロックとしてこのSQLを使用することができます:
distributed_lockに挿入します(キー) キーDUPLICATE KEY UPDATEキー= ON値(#{キー});