0

定義により、CRDT (競合のない複製データ型) は競合のないものです。したがって、1 つのノードで行われた更新は、最終的に他のすべてのノードに適用 (マージ) されることを意味します。

そのため、環境が通常の状態 (ハードウェア障害がないなど) にある場合、CRDT は論理的に更新を制限したり、拒否したり、拒否したりすることはできないという仮定につながります。

一方、定義上、トランザクションは承認または拒否され、要件が満たされない場合 (競合が検出された場合) はロールバックされます。したがって、(競合に基づく) トランザクションは (競合のない) CRDT では実装できないことを意味します。そうですか?

例を考えてみましょう - 簡単な銀行口座。残高は負でない数値です。PN-Counter(Positive-Negative Counter)で実装してみました。私はそれを非負にしたかった-残高がゼロを下回った場合、支出を制限します。しかし、それは不可能のようです。PN-Counter で実装されているため、ゼロ未満にすることができます。または、それを制限したい場合は、確認を得るためにすべてのノードを同期 (ロック) する必要があります。

CRDT を使用して単純なトランザクションを実装できる場合は、与えられた例 (非負の数) を使用してどのように実装できるかを説明してください。

4

1 に答える 1

1

あなたはここで2つの別々の問題を説明しているようです:

  1. 最初の質問: CRDT でトランザクションを実装することは可能ですか? はい。実際、CRDT をターゲットにできることを明示的に示す 2 つのトランザクション プロトコルがあります: RAMPCUREです。後者は中止メカニズムを提供します。
  2. あなたの例:非負のカウンターを実装することは可能ですか? はい。実際、 Bounded Counterはまさにそれを行います。ただし、これには制限があり、一度に 1 つの値に対してのみ機能します。

目標を達成するには、おそらく両方を組み合わせる必要があります。

トランザクションは、必ずしもアボート メカニズムや条件付き更新を提供する必要はないことに注意してください (実際、RAMP トランザクション プロトコルはそれらのいずれも保証しません)。

PS: ユースケースに基づいて、他の質問 (CRDT を使用することの有効性や非負であるカウンターの要件など) がありますが、これらは StackOverflow では資格がありません。

于 2021-11-05T10:27:13.410 に答える