@yanglfyangl
2018-08-09T07:36:41.000000Z
字数 2177
阅读 493
大型项目发展到一定阶段,往往为了1%的事做的工作,并不会是简单的1%,可能是多的多。
对于我们目前的项目,一致性的问题可能会体现在如下几个地方
- Kafka的某个时刻不可用
- Redis的某个时刻不可用
- 与其它系统的配合过程中,某个时刻的不同步。(异构)
如果说涉及到的数据源,按照优先级,可以如下排列
- 缓存不同步
- 图库不同步
- ES不同步
- Mongo或Mysql不同步
@nomedeng;void add(a, b){return a+b;}void publicSomthingB(){add();if(para1){if(doA(para1)){BService.save();BService.countIncrease(3)} else {BService.updated();BService.countIncrease(4)Log.Error("adfasdf");}}}public void publicSomthing(){if(para1){if(doA(para1)){BService.save();BService.countIncrease(2)if(error){Log.Error();}} else {BService.updated();BService.countIncrease(1)if(publicSomthingB()){Log.Error("failed", "asdfas");}}}.........}Log.Fatel("", "补偿API");
public void addForError(String userId,Integer num){
Integer moneyResult= userService.addMoney(userId,num);
}
如果方法抛出异常,则根据@Idempotent来进行处理。
@buchang()
public void SerC::add(String userId,Integer num){
Integer moneyResult= userService.addMoney(userId,num);
if(moneyResult%2==1){
Log.Fatal("", isRetry = true); //如果没有定义,则是当前函数
return success;
}
Integer sorceResult=userService.addSorce(userId,num);
if(sorceResult%2==0){
Log.Fatal("", "addForError", parm1, parm2);
}
}
public void SerC::addB(String userId,Integer num){
userService.addMoney(userId,num);
if(moneyResult%2==1){
Log.Fatal("");
}
throws Exception
}
int test1(){
alwaysSuccess(SerC->add());
return success;
}
大概的语句:
fromMysql("dbname").get("sql语句", resultsA).fromMongo("dbname").get("mongo语句", resultsB).calc().filter(resultsA, "去掉的item").filter(resultsA, "去掉的item").merge(resultsA, resultsB).intersection(resultsA, resultsB).then().putToRedis().asZSet(“语句”, [resultsA.id, resultsA.scroe]).asSet(“语句”).as...putToTuDB().asNode(nodeType, [resultsA.id, ...]).asRelation(relation, [resultsA.id, resultsB.id]).putToAnalysis().to...putToRelationEngine().to...
这样,未来的整个