Nest js - переадресация связи между двумя микросервисами с помощью ClientProxy - PullRequest
0 голосов
/ 03 апреля 2020

Мне нужна помощь от кого-то опытного. Недавно я создал 2 микросервиса (назовем их Amber и Boris), которые взаимодействуют друг с другом с помощью ClientProxy и REDIS. Время от времени, когда Амбер запрашивает данные у Бориса, получает сообщение об ошибке «1002 *».

Это конфигурация Amber:

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)
    }
}

Затем на службе Бориса у меня в основном установлен только Controller с @MessagePattern и я Я просто возвращаю данные:

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

Важно отметить, что служба Борис выполняет запросы к базе данных, чтобы вернуть данные. Но на стороне базы данных, похоже, нет никаких проблем.

Больше всего меня интересует:

  1. правильно ли настроен ClientProxy
  2. правильно ли настроена обработка ответа с pipe () и toPromise () , так как я не очень хорошо знаком с ClientProxy и Rx Js.

Спасибо вам сто раз за любой ответ!

1 Ответ

0 голосов
/ 04 мая 2020

Оказалось, что ClientProxy не освобождает соединения с Redis после того, как связь установлена. Таким образом, количество подключений увеличивалось, пока не осталось никаких подключений. Решение состоит в том, чтобы закрыть соединение после возвращения данных:

this.client.close();
...