❤️‍🔥 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;
    }
}
相关推荐
Net开发-孔明9 天前
.Net Web项目中,实现轻量级本地事件总线 框架
.net·事件总线
灰色孤星A11 天前
分布式事务学习笔记(四)微服务实现Stata AT模式、Stata Saga模式介绍
微服务·seata·分布式事务·at模式·saga模式·微服务实现seata
灰色孤星A16 天前
分布式事务学习笔记(二)Seata架构、TC服务器部署、微服务集成Seata
分布式·微服务·架构·seata·分布式事务·tc服务器·微服务集成seata
组合缺一1 个月前
骨灵冷火!Solon Cloud Gateway 照面发布
java·gateway·开放原子·web·solon·应用开发框架
长安初雪1 个月前
微服务集成 Seata
微服务·云原生·架构·seata·分布式事务
Xiaohong07161 个月前
Solon2 接口开发:实战 Gateway 模式效果
java·solon
丁总学Java1 个月前
使用kafka改造分布式事务
分布式·kafka·分布式事务
JinYD20182 个月前
分布式事务和一致性
分布式·分布式事务·一致性
组合缺一2 个月前
分布式接口文档聚合,Solon 是怎么做的?
java·分布式·solon·国产·应用开发框架·接口文档
tmax52HZ2 个月前
分布式事务-使用队列实现最终一致性
消息队列·分布式事务·cap·最终一致性·下单扣减库存