Nest.js-使用ClientProxy在2个微服务之间进行Redis通信

时间:2020-04-03 14:24:26

标签: redis rxjs timeout microservices nestjs

我需要经验丰富的人的帮助。我最近建立了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服务上,我基本上只是将Controller设置为@MessagePattern,而我只是返回数据:

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

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

我最感兴趣的是:

  1. 我是否已正确设置 ClientProxy
  2. 由于我对ClientProxy和RxJ不太熟悉,因此是否使用pipe() toPromise()正确设置了答案处理。

谢谢您一百次回应!

1 个答案:

答案 0 :(得分:0)

结果是,通信完成后,ClientProxy并未释放与Redis的连接。这样,连接数一直增加,直到没有剩余连接为止。 解决方案是在返回数据后关闭连接:

this.client.close();