首页 > 解决方案 > CommandBus 职责,redis 或 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的实现就足够了?有人可以帮我怎么做吗?如果可能的话,我将不胜感激

标签: typescriptapache-kafkaredisevent-sourcing

解决方案


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

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

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

在此处输入图像描述

内部事件与外部事件不同


推荐阅读