単純な一貫性の使用

事前定義済の一貫性定数を使用して、特定の厳密な一貫性保証を指定できます。そのように使用できるインスタンスは3つあります。

  1. ABSOLUTE

    操作がマスター・ノードでサービスされることを要求します。この場合、は常にマスターと一致します。

    これは、要求できる一貫性保証のうち最も厳しいものですが、すべての読取りと書込みのリクエストがマスター・ノードでサービスされるというコストを伴います。すべてのトラフィックをマスター・ノード(パーティションごとに1台のみのマシン)に送ると、読取り操作をレプリカに分散しないことになります。また、マスターが読取りリクエストの処理でビジー状態になるため、書込み操作の速度も遅くなります。このことから、この一貫性保証はあまり使用しないようにします。

  2. NONE_REQUIRED

    マスターと比較したレプリカの状態に関係なく、格納操作を進めることができます。これは、要求できる一貫性保証のうち最も緩やかなものです。格納のパフォーマンスは最もよくなりますが、アプリケーションが、古い(最新でない)情報を操作する可能性が高くなります。

  3. NONE_REQUIRED_NO_MASTER

    読取り操作がマスターではなく常にレプリカでサービスされることが必要です。このポリシーが使用されると、使用可能なノードがマスターのみである場合、読取り操作は実行されません。

    可能であれば、セカンダリ・ゾーン機能のためにも、この一貫性ポリシーを使用しないようにしてください。

たとえば、必ず最新データを扱う必要があるクリティカルな読取り操作を行うとします。この場合、次のようにします。

...
### Store handle configuration and open skipped for brevity

def do_store_ops(store):
    ## Create the simple consistency guarantee to use for this
    ## store read. 
    ro = ReadOptions({ONDB_CONSISTENCY : ABSOLUTE,
                      ONDB_TIMEOUT : 600})
    try:
        primary_key_d = {"item" : "bolts"}
        row = store.get("myTable", primary_key_d, ro)
        if not row:
            logging.debug("Row retrieval failed")
        else:
            logging.debug("Row retrieval succeeded.")
            display_row(row)
    except IllegalArgumentException, iae:
        logging.error("Row retrieval failed.")
        logging.error(iae.message)
        return
    except ConsistencyException, ce:
        logging.error("Row retrieval failed due to Consistency.")
        logging.error(ce.message)
    except RequestTimeoutException, rte:
        logging.error("Row retrieval failed, exceeded timeout value.")
        logging.error(rte.message)