【问题标题】:CommandBus Responsibilities, redis or kafkaCommandBus 职责,redis 或 kafka
【发布时间】:2021-04-28 16:05:54
【问题描述】:

你好,我正在尝试开始学习es,微服务然后我想了解命令总线我基本上认为他的职责只是执行命令处理程序? 一定要排队吗? 你能把kafka做成命令总线或者redis吗? 我有一个简单的命令总线实现,但我想实现一个命令总线,以便为 3 个微服务使用相同的命令总线,按照我的做法,我必须为每个 ms 提供一个命令总线,并注册命令和每个微服务的命令处理程序

使用打字稿实现:

export class CommandBus<Command extends ICommand = ICommand>
  implements ICommandBus<Command> {
  private handlers = new Map<string, ICommandHandler<Command>>()

  public execute<T extends Command>(command: T): Promise<any> {
    const handler = this.handlers.get(command.constructor.name)
    if (!handler) throw new Error(``)
    return handler.execute(command)
  }

  public register(
    data: { commandHandler: ICommandHandler; command: Type<ICommand> }[],
  ): void {
    data.forEach(({command,commandHandler}) => {
            this.bind(commandHandler, command.name)
        })
  }

  private bind<T extends Command>(handler: ICommandHandler<T>, name: string) {
    this.handlers.set(name, handler)
  }
}

我想知道使用 kafka 为所有微服务只有一个命令总线的最佳选择是什么?还是使用redis的实现就足够了?有人可以帮我怎么做吗? 如果可能的话,我会非常感激的例子

【问题讨论】:

  • cqrs.nu 上查看我维护的示例 CQRS/ES 代码

标签: typescript apache-kafka redis event-sourcing


【解决方案1】:

您通常不需要命令总线/队列,而是将命令从用户/客户端直接发送到命令处理程序/聚合。

Kafka 更适合事件驱动架构,在这种架构中,各种服务发布事件,表示发生的精简,然后供其他服务使用。

此外,CQRS/EventSourcing 是您在一个服务(有界上下文)中应用的模式,而不是跨多个服务应用的模式。您可以使用事件在服务之间进行通信,但这是一个单独的东西,就像这张图片试图展示的那样:

内部事件与外部事件不同

【讨论】:

  • 我完全同意。任何命令总线的问题在于它在命令开始和执行之间引入了时间延迟。在大多数情况下,调用命令的人会要求命令是否成功执行。通过外部化命令处理,您将开始处理诸如使用事件通知调用者有关执行结果的问题,这只会增加复杂性。
猜你喜欢
  • 2021-09-05
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多