CommandBus 职责,redis or kafka

CommandBus Responsibilities, redis or kafka

你好我正在尝试开始研究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 的实现就足够了?有人可以帮我我该怎么做吗? 如果可能的话,我将非常感激

您通常不需要 command-bus/queue,而是将命令从 user/client 直接发送到 Commandhandler/aggregate。

Kafka 更适合事件驱动架构,其中各种服务 post 事件代表发生的事情,然后供其他服务使用。

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

里面的活动和外面的活动不一样