❤️‍🔥 Solon Cloud Event 新的事务特性与应用

1、Solon Cloud Event?

复制代码
是 Solon 分布式事件总线的解决方案。也是 Solon "最终一致性"分布式事务的解决方案之一

2、事务特性

事务?就是要求 Event 有原子性,当多个 Event 发布时,要么全成功,要么全失败。

java 复制代码
public class EventDemo {
    public void event_tran() {
        //新建一个 Event 事务
        EventTran eventTran = CloudClient.event().newTran();

        try {
            //发布,并使用事务
            CloudClient.event().publish(new Event("user.event1", "test1").tran(eventTran));
            CloudClient.event().publish(new Event("user.event2", "test2").tran(eventTran));
            CloudClient.event().publish(new Event("user.event2", "test3").tran(eventTran));

            //如果没问题,提交事务
            eventTran.commit();
        } catch (Throwable ex) {
            //如果有问题,回滚事务
            eventTran.rollback();
        }
    }
}

上面的体验与经典的 Jdbc 事务是很像的。加入 Solon 的事务注解管理后,体验可以再简洁些,也能与 Jdbc 事务整合到一起。

java 复制代码
@Component
public class EventDemo {
    //使用 @Tran 管理事务(将 jdbc, event 事务整合到一起)
    @Tran
    public void event_and_jdbc_tran() {
        //新建一个 Event 事务,并加入 @Tran 的管理
        EventTran eventTran = CloudClient.event().newTranAndJoin(); 

        CloudClient.event().publish(new Event("user.event1", "test1").tran(eventTran));
        CloudClient.event().publish(new Event("user.event2", "test2").tran(eventTran));
        CloudClient.event().publish(new Event("user.event2", "test3").tran(eventTran));
    }
}

3、拟模真实的场景应用:

我们设计一个用户注册的场景应用:

  • 持久层添加用户记录
  • 注册后发布一个已注册事件;再发布一个10天后触发的已唤醒事件
  • 在已注册事件里,我们给用户送10个金币;再送手机100元冲值
  • 在已唤醒事件里,我们检查用户的活动行为;如果有,再送100个金币(作为奖励);如果没发推送,告知有抽奖

主服务程序,负责主业务:

java 复制代码
@Component
public class UserService {
    @Inject
    UserDao userDao;
    
    //用户注册
    @Tran
    public void userRegister(long userId, String name){
        userDao.addUser(userId, name);
        this.onUserRegistered(userId);
    }
    
    //当用户完成注册时(发布事件)
    private void onUserRegistered(long userId) {
        String eventJson = String.format("{\"userId\":%d}", userId);
        Date  eventTime = DateTime.Now().addDay(10);
        
        EventTran eventTran = CloudClient.event().newTranAndJoin();
        
        //发布用户已注册事件
        CloudClient.event().publish(new Event("user.registered", eventJson).tran(eventTran));
        //发布用户已唤醒事件(用于检查用户在10内,有没有活动行为)
        CloudClient.event().publish(new Event("user.reawakened", eventJson).scheduled(eventTime).tran(eventTran));
    }
}

次服务程序,负责辅助业务(也可以合到主服务程序):

java 复制代码
@CloudEvent("user.registered")
public class UserRegisteredEventHandler implements CloudEventHandler {
    @Inject
    UserService userService;
    @Inject
    MobileService mobileSerivce;
    
    @Override
    public boolean handler(Event event) throws Throwable {
        long userId = ONode.load(event.context()).get("userId").getLong();
        
        //送10个金币
        userService.addGold(userId, 10);
        
        //送手机充值100块
        String mobie = userService.getMobile(userId);
        mobileSerivce.recharge(mobile, 100);
        
        return true;
    }
}

@CloudEvent("user.reawakened")
public class UserReawakenedEventHandler implements CloudEventHandler {
    @Inject
    UserService userService;
    @Inject
    PushService pushService
    
    @Override
    public boolean handler(Event event) throws Throwable {
        long userId = ONode.load(event.context()).get("userId").getLong();
        
        if (userService.hasLive(userId, 10)) {
            //再送100个金币
            userService.addGold(userId, 100);
        } else {
            //获取设备id
            String duid = userService.getDuid(userId);
            //发布推送
            pushService.push(duid, "有100个金币等你来拿哟...")
        }
        
        return true;
    }
}
相关推荐
only-qi6 天前
空回滚、悬挂、幂等——TCC 分布式事务的三道暗礁
架构·分布式事务·空回滚、悬挂、幂等
only-qi7 天前
主流分布式事务框架与方案:从 XA 到 Seata 四模式
分布式·seata·分布式事务·xa·tcc
only-qi7 天前
分布式系统四问:幂等、时钟、隔离、权衡
架构·分布式事务·幂等性·时钟回拨·性能与一致性权衡
洛邙7 天前
互联网大厂Java求职面试实录:Spring Boot与微服务实战解析
java·spring boot·缓存·微服务·面试·分布式事务·电商
better_liang8 天前
每日Java面试场景题知识点之-Spring Cloud微服务分布式事务解决方案
java·spring cloud·微服务·seata·面试题·分布式事务·tcc
笨手笨脚の13 天前
Java 性能优化
java·jvm·数据库·性能优化·分布式锁·分布式事务·并发容器
肥猪猪爸14 天前
数据库 2PC 极简流程图
java·数据库·分布式·mysql·分布式事务·2pc
带刺的坐椅17 天前
SolonCode v0.0.20 发布 - 编程智能体(新增子代理和浏览器能力)
java·ai·agent·solon·solon-ai·claude-code·openclaw
带刺的坐椅1 个月前
Solon AI v3.9.4 发布(智能体开发框架,支持 Java8 到 Java25)
ai·llm·agent·solon·mcp·tool-call·skills
递归尽头是星辰1 个月前
微服务事务分级治理:从 Seata 全模式到 TDSQL 实战
微服务·云原生·架构·分布式事务·事务分级治理