浅谈CQRS架构

   我们在对数据库的操作时,可以进行读写分离,但是我们的业务层却没有做到读写分离,因为业务的读和写都是公用一个

model对象,需要进行一些并发的控制。

          cqrs(Command Query responsibility segregation) Command就是包含增删改,query就是查询,通过这种分离的好处就是可以分别对Command操作和query操作分开进行优化或者一些处理。

          在cqrs架构中,增删改都会相当于发送了一个command,然后通过commandBus来进行分发。示例demo如下:

          

public interface Command<T> {

    Object execute(T commandModel);
}

 

Command接口即是对增删改操作的抽象接口

 

public class CreateOrderCommand implements Command<CreateOrderCommandModel>{
    @Override
    public Object execute(CreateOrderCommandModel commandModel) {
        return Info.container.put(commandModel.getId(),commandModel);
    }
}

 

具体的实现类(新增订单命令)

@Component
public class CommandBus<T> {

    public Object dispatch(Command cmd,T model){
        return cmd.execute(model);
    }
}

 

commandBus负责分发command,交给具体的实现类去处理

@RestController
public class OrderController {

    @Autowired
    private CommandBus commandBus;


    @PostMapping("order")
    public ResponseEntity addOrder(@RequestBody CreateOrderCommandModel model){
        commandBus.dispatch(new CreateOrderCommand(),model);
        return ResponseEntity.ok("SUCCESS");
    }
}

 

这个是Controller类,通过commandBus来分发不同的命令

@Data
public class CreateOrderCommandModel {

    private Integer id;

    private String name;


}

 

实体类

 

通过上面的简单demo即演示了一下cqrs的简单流程,对于大家理解cqrs可能会有一些帮助。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CQRS(Command Query Responsibility Segration)架构,大家应该不会陌生了。简单的说,就是一个系统,从架构上把它拆分为两部分:命令处理(写请求)+查询处理(读请求)。然后读写两边可以用不同的架构实现,以实现CQ两端(即Command Side,简称C端;Query Side,简称Q端)的分别优化。CQRS作为一个读写分离思想的架构,在数据存储方面,没有做过多的约束。所以,我觉得CQRS可以有不同层次的实现,比如: 1.CQ两端数据库共享,CQ两端只是在上层代码上分离;这种做法,带来的好处是可以让我们的代码读写分离,更好维护,且没有CQ两端的数据一致性问题,因为是共享一个数据库的。我个人认为,这种架构很实用,既兼顾了数据的强一致性,又能让代码好维护。 2.CQ两端数据库和上层代码都分离,然后Q的数据由C端同步过来,一般是通过Domain Event进行同步。同步方式有两种,同步或异步,如果需要CQ两端的强一致性,则需要用同步;如果能接受CQ两端数据的最终一致性,则可以使用异步。采用这种方式的架构,个人觉得,C端应该采用Event Sourcing(简称ES)模式才有意义,否则就是自己给自己找麻烦。因为这样做你会发现会出现冗余数据,同样的数据,在C端的db中有,而在Q端的db中也有。和上面第一种做法相比,我想不到什么好处。而采用ES,则所有C端的最新数据全部用Domain Event表达即可;而要查询显示用的数据,则从Q端的ReadDB(关系型数据库)查询即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值