@yanglfyangl
2018-08-09T07:36:41.000000Z
字数 2177
阅读 454
大型项目发展到一定阶段,往往为了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...
这样,未来的整个