(Translated by https://www.hiragana.jp/)
GitHub - songxinjianqwe/EShop-SOA: EShop基于Dubbo实现SOA服务化拆分,并基于RocketMQ解决了分布式事务(新版SpringBootSOASkeleton)
Skip to content

EShopもと于Dubbo实现SOAふく务化拆分,并基于RocketMQかい决了分布ぶんぷ式事しきじ务(新版しんぱんSpringBootSOASkeleton)

Notifications You must be signed in to change notification settings

songxinjianqwe/EShop-SOA

Repository files navigation

SOA EShop

かい绍请さんhttp://blog.csdn.net/songxinjianqwe/article/details/78923482

Dubbo + TCC 分布ぶんぷ式事しきじ

业务拆分

よう户子けい统:

  • よう户模块:user+mail,わたる及user,role,mail,mail_text,balanceひょう
  • 产品块:product,わたる及product,categoryひょう
  • しん闻模块:news,わたる及newsひょう

订单けい统:order,わたる及orderひょう

邮件けい

约定

公共こうきょうてきdomain、enumerationざいcommon块下 一般いっぱんじょう况下api块放serviceせっ口和くちわexception异常 注意ちゅうい自己じこ块的异常ざい自己じこ块的api块下(Dubbo异常つくえせい) i18n资源ぶんけんざいcommonそく,别的块下不用ふよう

启动顺序

email,order,user,web

注意ちゅういごと

所有しょゆう实体类都よう实现serializableせっこう Dubbo异常处理つくえせい: 异常类和せっこう类在同一どういつjarつつみさと直接ちょくせつほういや则被调方serviceちゅうほうだしてき异常,ざい调用かたちゅうかいつつみいち层RuntimeException,无法获得ばららいてき异常

TCC かい决订单支づけ问题

がいじゅつ

Try: 尝试执行业务

完成かんせい所有しょゆう业务检查(一致いっちせい

预留必须业务资源(なぞらえへだた离性) Confirm: 确认执行业务

真正しんしょう执行业务

不作ふさくにんなん业务检查

ただ使用しようTry阶段预留てき业务资源

Confirm操作そうさ满足幂等せい Cancel: 取消とりけし执行业务

释放Try阶段预留てき业务资源

Cancel操作そうさ满足幂等せいいん为可能会のうかいつぎ执行)

しめせれいえんじしめせざいしたかん订单きさき,使用しよう红包帐户资金帐户らいづけ款,红包帐户ふく务和资金帐户ふく务在不同ふどうてきけい统中。 しめせれいちゅうゆう两个SOA提供ていきょうかたいち个是CapitalTradeOrderService,代表だいひょう资金帐户ふく务,另一个是RedPacketTradeOrderService,代表だいひょう红包帐户ふく务。

しもかん订单きさき,订单じょう态为DRAFT, ざいTCCごと务中TRY阶段, 订单ささえづけふく务将订单じょう态变なるPAYING, どう时远ほど调用红包帐户ふく务和资金帐户ふく务,しょうづけ款方てきあまり额减掉(预留业务资源); 如果ざいTRY阶段,にんなん一个服务失败,tcc-transactionはた动调よう这些ふく务对应的cancel方法ほうほう, 订单ささえづけふく务将订单じょう态变なりPAY_FAILED, どう时远ほど调用红包帐户ふく务和资金帐户ふく务,しょうづけ款方あまり额减掉的部分ぶぶん增加ぞうかかい; 如果TRY阶段正常せいじょう完成かんせい,则进にゅうCONFIRM阶段,ざいCONFIRM阶段(tcc-transaction动调よう), 订单ささえづけふく务将订单じょう态变なるCONFIRMED,どう时远ほど调用红包帐户ふく务和资金帐户ふく务对应的CONFIRM方法ほうほうはたおさむ款方てきあまり增加ぞうか

とく别说明下あけしたゆかり于是しめせれいざいCONFIRMCANCEL方法ほうほうちゅうぼつゆう实现幂等せい,如果ざい实项ちゅう使用しよう需要じゅよう证CONFIRMCANCEL方法ほうほうてき幂等せい

一个幂等的操作典型如: 编号为5てき记录てきAだん设置为0 这种操作そうさかん执行多少たしょう幂等てき

一个非幂等的操作典型如: 编号为5てき记录てきAだん增加ぞうか1 这种操作そうさ显然就不幂等てき

业务逻辑

try: 账户あまり额扣减,订单じょう态设おけpaying confirm:订单じょう态设おけ为paid,おさむ款方あまり增加ぞうか cancel:账户あまり额回ぞう,订单じょう态设おけ为pay_failed

扣减增加ぞうか需要じゅよう实现幂等(Dubbo调用远程せっこうしつ败的话会じゅう试):

  • cancel时如はて订单じょう态不paying,则不增加ぞうか账户あまり
  • confirm时如はて订单じょう态不paying,则不增加ぞうかおさむ款方あまり
  • try时如はて订单じょう态不unpaid,则不扣减账户あまり

要求ようきゅう实现并发,いん为是读取-判断はんだん-更新こうしんてき执行序列じょれつ

以try阶段为例:

  1. 请求1读取订单じょう
  2. 请求2读取订单じょう
  3. 请求1判断はんだん订单じょう态为unpaid,はた订单じょう态设おけ为paying,并进ぎょう账户あまり额扣减
  4. 请求2判断はんだん订单じょう态为unpaid,执行同上どうじょう操作そうさ

此时かい扣减两次账户あまり额。 要求ようきゅう该执ぎょう序列じょれつよう实现原子げんし执行,如MVCC方式ほうしきざい账户ひょうちゅう设置いち个version。 TCC, もと于补偿型ごと务的APけい统的いち种实现, 具有ぐゆうさい一致いっちせい. 下面かめん以客户购买商品しょうひん时的づけ操作そうさ为例进行讲解:

Try: 完成かんせい所有しょゆうてき业务检查(一致いっちせい),预留必须业务资源(なぞらえへだた离性); からだ现在ほんれいちゅう, 就是确认きゃく户账户余额足够支づけ(一致いっちせい), 锁住きゃく户账户, しょう户账户(なぞらえへだた离性). Confirm: 使用しようTry阶段预留てき业务资源执行业务(业务操作そうさ必须幂等てき), 如果执行现异つね, よう进行じゅう试. ざい这里就是执行きゃく户账户扣款, しょう户账户入账操作そうさ. Cancle: 释放Try阶段预留てき业务资源, ざい这里就是释放きゃく户账户和しょう户账户的锁; 如果にんいち业务ざいConfirm阶段ゆう操作そうさ无法执行成功せいこう, かい造成ぞうせい对业务活动管理かんりてき响应ちょう时, 此时よう对其业务执行补偿せいごと务. 如果补偿操作そうさ执行也出现异つね, 必须进行じゅう试, わか实在无法执行成功せいこう, 则事务管理かんり必须のう感知かんちいたしつ败的操作そうさ, 进行log(よう于事きさき人工じんこう进行补偿せいごと操作そうさあるもの交由ちゅう间件せっかんざいきさき进行补偿せいごと操作そうさ).

りゅうほど

try:

  1. 读取订单じょう
  2. 如果订单じょう态为unpaid,则将订单じょう态设おけ为paying,执行账户あまり额扣减(可能かのうかいほう异常此时かい执行cancel)

confirm:

  1. 读取订单じょう
  2. 如果订单paying,则将订单じょう态设おけ为paid,执行おさむ款方あまり额表てき增加ぞうか

cancel:

  1. 读取订单じょう
  2. 如果订单じょう态是paying,则将订单じょう态设おけ为pay_failure,执行账户あまり额的かいぞう

异步确保がたもたれ消息しょうそくさい一致いっちかい决订单支づけ问题

よし于远ほどこと务的消息しょうそく可能かのうかいじゅう试,需要じゅようざい业务じょう实现幂等(やめ经处过的记录らいぐういたしんてき请求时 检查いややめ经处过)。