如何从EventEmitter侦听器函数调用NestJs微服务?

时间:2019-05-23 14:15:20

标签: javascript node.js events microservices nestjs

我正在使用NestJS和Typescript开发两个微服务,以在两个不同的队列上使用和发布消息。情况如下

  1. 消费者微服务从Kafka主题或队列中读取消息
  2. 然后将其发送到第二个微服务。

问题出现在第二步,消费者微服务从不发送消息。


消息消费是通过库Consumer中的kafka-node实现的。消息已正确使用并且可以记录。

微服务之间的通信是使用RedisClient软件包中的@nestjs/microservices进行的,并且在从侦听器方法外部执行时可以正常工作。

当微服务之间的消息从其他任何地方发送时,我可以在redis-cli MONITOR上看到它们,但是当从侦听器功能发送时,什么也没有出现。

代码

Redis客户和Kafka消费者喜好:

private readonly kafkaClient: kafka.KafkaClient;
private readonly consumer: kafka.Consumer;
private readonly client: ClientRedis;

constructor() {
    this.kafkaClient = new kafka.KafkaClient(KAFKA_HOST);
    this.consumer = new kafka.Consumer(this.kafkaClient, TOPICS, OPTIONS);
    this.client = new RedisClient(REDIS_URL);
}

用于消费消息的侦听器功能是:

async onApplicationBootstrap() {
    this.consumer.on('message', message => {
        // Sends the message to Redis
        this.client.send<Message>(PATTERN, message);
    });
}

然后,第二个微服务应该由于@MessagePattern(PATTERN) NestJS的装饰器而收到消息。但是它甚至没有像我之前所说的那样在Redis上发布。

1 个答案:

答案 0 :(得分:0)

好吧,问题出在Observable方法返回的ClientRedis::send()上。只需将Observable转换为Promise就可以解决问题:

  this.client.send<Message>(PATTERN, message).toPromise()