【GHS】利用 Watermill 实现 Golang CQRS

编程开发   © 文章版权由 admin 解释,禁止匿名转载

#楼主# 2020-12-30

。我们分离了命令(写请求)和查询(读请求)之间的责任。写请求和读请求由不同的对象处理。 就是这样。我们可以进一步分割数据存储,使用单独的读写存储。一旦发生这种情况,可能会有许多读取存储,这些存储针对处理不同类型的查询或跨越多个边界上下文进行了优化。虽然经常讨论与 CQRS 相关的单独读写存储,但这并不是 CQRS 本身。CQRS 只是命令和查询的第一部分。 ## 术语 ### Command 该命令是一个简单的数据结构,表示执行某些操作的请求。 ### Command Bus 完整源码: * github.com/ThreeDotsLabs/watermill/components/cqrs/command_bus.go ```go // ... // CommandBus 将命令(commands)传输到命令处理程序(command handlers)。 type CommandBus struct { // ... ``` ### Command Processor 完整源码: * github.com/ThreeDotsLabs/watermill/components/cqrs/command_processor.go ```go // ... // CommandProcessor 决定哪个 CommandHandler 应该处理这个命令 received from the command bus. type CommandProcessor struct { // ... ``` ### Command Handler 完整源码: * github.com/ThreeDotsLabs/watermill/components/cqrs/command_processor.go ```go // ... // CommandHandler 接收由 NewCommand 定义的命,并使用 Handle 方法处理它。 // 如果使用 DDD, CommandHandler 可以修改并持久化聚合。 // // 与 EvenHandler 相反,每个命令必须只有一个 CommandHandler。 // // 在处理消息期间使用 CommandHandler 的一个实例。 // 当同时发送多个命令时,Handle 方法可以同时执行多次。 // 因此,Handle 方法必须是线程安全的! type CommandHandler interface { // ... ``` ### Event 该事件表示已经发生的事情。 事件是不可变的。 ### Event Bus 完整源码: * github.com/ThreeDotsLabs/watermill/components/cqrs/event_bus.go ```go // ... // EventBus 将事件传输到事件处理程序。 type EventBus struct { // ... ``` ### Event Processor 完整源码: * github.com/ThreeDotsLabs/watermill/components/cqrs/event_processor.go ```go // ... // EventProcessor 确定哪个 EventHandler 应该处理从事件总线接收到的事件。 type EventProcessor struct { // ... ``` ### Event Handler 完整源码: * github.com/ThreeDotsLabs/watermill/components/cqrs/event_processor.go ```go // ... // EventHandler 接收由 NewEvent 定义的事件,并使用其 Handle 方法对其进行处理。 // 如果使用 DDD,CommandHandler 可以修改并保留聚合。 // 它还可以调用流程管理器、saga 或仅仅构建一个读取模型。 // 与 CommandHandler 相比,每个 Event 可以具有多个 EventHandler。 // // 在处理消息

成为第一个回答人

评论

登录后才可发表内容
  • 主题

    106

  • 帖子

    82

  • 关注者

    0

Copyright © 2019 凯特网.   Powered by HYBBS 2.3.4  

Runtime:0.1325s Mem:2047Kb