2

e コマース アプリケーションを想像してみてください。

Node cluster N1, N2, N3.3 つ持っていて、一貫性レベル (CL) が弱いとしましょう。

Read CL = N/2+1 = 2 (in this case), Write CL = Any (alteast 1)

次のような製品テーブルがあります

これは、3 つのノード間で同期されている初期データです。

 product_info : { 'computer': 1}
  1. クライアント A は N1 から情報を読み取り、クライアント B は N2 から情報を読み取ります。

    クライアント 1 は、1 台のコンピューターが使用可能であることを確認します

    クライアント 2 は、1 台のコンピューターが使用可能であることを確認します

  2. クライアント A が最初に注文します。したがって、N1 の場合、テーブルは次のようになります。

    product_info : {'computer':0}

  3. クライアント 2 が注文を行うため、N2 ではテーブルは次のようになります。

    product_info : {'computer':0}

    しかし実際には、クライアント 2 の注文は処理されていないはずです。

  4. クライアント C は N3 経由でアクセスします。ここで、N1 で読み取りが行われ、0 が返されます。(クォーラムは少なくとも 2 つのノードが応答する必要があるため) N3 の値は 1 ですが、そのタイムスタンプは古くなっています。その値を更新し、利用可能なコンピューターがないことをクライアントに示します。これはいい

    この例では、最初の product_info がクライアント A と B によってロードされた時点でデータが同期されているため、弱い一貫性レベルと強い一貫性レベルの両方が間違った結果につながります。これを Cassandra でどのように処理できますか?

4

1 に答える 1

3

レプリケーション係数について言及していません。

読み取りの一貫性 + 書き込みの一貫性 > レプリケーション係数の場合、すぐに一貫性が得られます。

複製係数が 3 であるとします。即時の整合性と RC = 2 の場合、少なくとも 2 の WC が必要です。即時の整合性と WC = 1 が必要な場合、RC は 3 である必要があります。注意してください。これは可用性に深刻な影響を与えるため、 1 つのノードがダウンすると、読み取りができなくなります。

即時の一貫性とは、書かれたものは何でも読むことを意味します。つまり、書き込みが成功した後は、以前の値を読み取る読み取りは行われません。ただし、これは、アプリケーションが以前に読み取った値を使用することを妨げるものではありません。

この場合、軽量トランザクションを使用できます。更新 ..... IF [何らかの条件]. これは実行が遅くなりますが、ユースケースには十分かもしれません。

多くの場合、特に分散シナリオでは、「悪い」ことが起こらないようにしようとするよりも、失敗に対処する方が適切です。それをビジネス ケースにすることもできます。このようなエッジ ケースは、ビジネスと話し、隠れた機会を見つける機会です。

  • 商品をオーバーブッキングするとどうなりますか?
  • 注文をキャンセルするか、注文が必然的に遅れていることを顧客に知らせて、販売を行い、ギフトバウチャーを提供する方がよいでしょうか.
  • 利益にわずかな打撃を与えても、顧客にもう少し優れたコンピュータを提供できますか? これは、私たちが販売を行い、顧客を満足させ、おそらく返品ビジネスを提供するのに役立ちます. デルはよくこれを行います。
  • 顧客に電話して、アップセルの可能性があるシナリオを説明できますか?

注文を受け付けて、問題があることがわかったときに 1 人の顧客に知らせることもできます。私は個人的に Amazon でこれを確認しました。

販売時の過剰販売を絶対に防止する必要がある場合は、そのためのパターンもあります。raft や Zookeeper などを使用した分散ロックを使用して、cassandra の外部で調整を処理できます。また、アイテムごとに TTL を使用して論理ロックを実装することもできます。TTL を使用して、乱雑なコードが在庫を台無しにしないようにします。

それは、あなたが望む保証がどの程度のものであるか、そしてこれを達成するためにどれだけの苦労をいとわないかによって異なります. そして、それを解決しない方が有益でない場合はなおさらです。

それが役立つことを願っています。

于 2014-07-24T21:18:06.270 に答える