Nestjs-redis使用ClientProxy在2个微服务之间进行通信



我需要有经验的人的帮助。我最近构建了两个微服务(我们称之为Amber和Boris(,它们使用ClientProxy和REDIS进行通信。当Amber不时向Boris请求数据时,会得到超时错误

这是琥珀色配置:

constructor(companyName: string, userId: number) {
this.companyName = companyName;
this.userId = userId;
this.client = ClientProxyFactory.create({
transport: Transport.REDIS,
options: {
retryAttempts: 0,
retryDelay: 0,
url: 'redis://<some_url>:<some_port>,
},
});
}

然后请求响应:

private async sendRequest(pattern: string, payload?: object): Promise<any[]> {
payload = payload || {};
try {
const result = await this.client.send(
{ type: pattern },
{ userId: this.userId, companyName: this.companyName, ...payload}
)
.pipe(
timeout(30000),
map((response: any) => { // Success...
return response;
}),
catchError((error) => { // Error...
return throwError(error);
}),
)
.toPromise();
return result;
} catch (err) {
Logger.error('Couldn't get data from Boris service: ' + err.message)
}
}

然后在Boris服务上,我基本上只使用@MessagePattern设置了Controller,我只是返回数据:

@MessagePattern({type: 'getAvailableCases'})
findAll(@Payload() data: object): Promise<object> {
this.assignPayload(data);
return this.getData();
}

重要的是,Boris服务正在对数据库进行查询,以便返回数据。但在数据库方面似乎没有问题。

我最感兴趣的是:

  1. 是否正确设置了ClientProxy
  2. 我是否使用pipe((和toPromise((正确设置了应答处理,因为我不太熟悉ClientProxy和RxJs

百次感谢您的回复!

事实证明,ClientProxy在通信完成后没有释放到Redis的连接。通过这种方式,连接的数量不断增加,直到没有连接为止。解决方案是在返回数据后关闭连接:

this.client.close();

相关内容

  • 没有找到相关文章

最新更新