- 使用kafka作为事件通知
- 利用redis作为分布式协调存储
- 使用mysql存储分布式日志
- 有个脑裂情况没有考虑需要加入一个超时机制保障一下
- 使用kafka的消费原则与redis特性,创造分布式任务task,及服务单元的task,做到kafka最终保障消费的最大可能性来处理任务,主要任务存储在redis中 任务一旦完成,会移动到mysql进行持久化,并且对每步的分布式task处理有对应的操作日志存入mysql
- 需要有kafka服务、redis服务、mysql服务
@Component @Order public class TransactionHandleRegister extends TransactionHandleRegisterImpl implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
Map<String, Class> handleRegisterMap = new HashMap<>();
//增加一个参与者 test,参与操作实例 Test.class
handleRegisterMap.put("test", Test.class);
super.init(handleRegisterMap);
}
}
public class Test extends TransactionService {
@Override
public DistributionTaskInvoke exec(Object... objects) throws Exception {
DistributionTaskInvoke rlt = new DistributionTaskInvoke();
//这里写你的执行代码
System.out.println("test exec");
return rlt;
}
@Override
public DistributionTaskInvoke execBack(Map map) throws Exception {
DistributionTaskInvoke rlt = new DistributionTaskInvoke();
//这里写你的执行失败后回滚代码
System.out.println("test execBack==" + map.toString());
return rlt;
}
}
@RestController public class TestWeb { @Autowired SendEvent sendEvent;
@RequestMapping("/send/{expects}")
public void send(@PathVariable("expects") String expects) {
Map map = new HashMap();
map.put("id", 1111);
map.put("date", new Date());
try {
sendEvent.send("test", map, Collections.singleton(expects));
} catch (Exception e) {
e.printStackTrace();
}
}
}