我正在使用NestJS和Typescript开发两个微服务,以在两个不同的队列上使用和发布消息。情况如下
问题出现在第二步,消费者微服务从不发送消息。
消息消费是通过库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上发布。
答案 0 :(得分:0)
好吧,问题出在Observable
方法返回的ClientRedis::send()
上。只需将Observable
转换为Promise
就可以解决问题:
this.client.send<Message>(PATTERN, message).toPromise()