べき乗等性設計

4205 ワード

転載:https://www.cnblogs.com/zxf330301/p/10079997.html
一、定義
インタフェースのべき乗等性は実際にはインタフェースが繰り返し呼び出すことができ,呼び出し側が複数回呼び出す場合,インタフェースが最終的に得た結果は一致する.いくつかのインタフェースは天然にべき乗などを実現することができます.例えば、クエリーインタフェースは、クエリーにとって1回と2回クエリーします.システムにとって、何の影響もありません.検出された結果も同じです.
クエリー機能には天然のべき乗等性があるほか、追加、更新、削除はべき乗等性を保証します.では、乗等性を保証するにはどうすればいいのでしょうか.
二、実現
  • グローバル一意ID
  • グローバル一意IDを使用すると、業務の操作とコンテンツに基づいてグローバルIDが生成され、実行前にこのグローバル一意IDが存在するか否かに基づいて、その操作が実行されたか否かが判断される.存在しない場合は、グローバルIDを、データベース、redisなどのストレージシステムに格納します.存在する場合は、メソッドが実行されたことを示します.
  • エンジニアリングの観点から言えば、グローバルIDをべき乗とするなど、一つの業務の基礎となるマイクロサービスが存在し、多くのマイクロサービスでこのようなサービスが使用され、各マイクロサービスでこのような機能が完成し、ワークロードが重複する.また、高信頼性のべき乗などのサービスを構築するには、1台のマシンがグローバルIDを先にストレージに書き込んだが、書き込み後に停止したため、グローバルIDのタイムアウトメカニズムを導入する必要があるなど、多くの問題を考慮する必要がある.
  • は、グローバル一意IDを使用する汎用スキームであり、トラフィックの挿入、更新、削除をサポートすることができる.しかし、この案は美しく見えますが、実現するのは面倒で、次の案は特定のシーンに適用されますが、実現するのは簡単です.
  • 再表するこの方法は、例えば、上記の支払いシーンでは、1つの注文が1回しか支払わない場合、注文IDを一意の識別として使用することができる、ビジネスに一意のマークがある挿入シーンに適用される.この場合、デリバリー・テーブルを作成し、一意の識別子を一意のインデックスとして使用できます.実装時に、支払文書の作成とデリバリー・テーブルの書き込みをトランザクションに保存します.繰り返し作成すると、データベースは一意の制約異常を放出し、操作はロールバックします.
  • この方法を挿入または更新して一意のインデックスを挿入し、例えば、商品のIDと品目のIDが一意のインデックスを構成し、データテーブルにも一意のインデックスを追加する商品品目を関連付ける場合.この場合、InsertOrUpdate操作を使用できます.mysqlデータベースでは、
  • 	insert into goods_category (goods_id,category_id,create_time,update_time)
    	values(#{goodsId},#{categoryId},now(),now())
    	on DUPLICATE KEY UPDATE
    	update_time=now()
    
  • マルチバージョン制御この方法は、商品の名前を更新するなど、更新されたシーンに適しています.この場合、更新されたインタフェースにバージョン番号を追加して、べき乗などの
  • を作ることができます.
    	boolean updateGoodsName(int id,String newName,int version);
    
    	        
    	update goods set name=#{newName},version=#{version} where id=#{id} and version<${version}
    
  • ステータスマシン制御この方法は、ステータスマシンのフローがある場合に適しています.たとえば、受注の作成と支払が行われ、受注の支払は必ず前に行われます.この場合、ステータスフィールドを設計するときにintタイプを使用し、受注の作成が0で、支払が100に成功するなど、値タイプのサイズでべき乗を行うことができます.支払いに失敗したのは99,
  • です.
    	        ,          
    	update `order` set status=#{status} where id=#{id} and status<#{status}