【问题标题】:NestJS provider classes overwriting each-other in different event loopsNestJS 提供程序类在不同的事件循环中相互覆盖
【发布时间】:2021-07-30 06:41:53
【问题描述】:

我遇到了一个问题,我的常用库注射剂被彼此覆盖

引导文件与代理服务器一起运行此文件以初始化本地微服务

import { serviceA } from '@company/serviceA'
import { serviceB } from '@company/serviceB'
import { serviceC } from '@company/serviceC'
import { Worker } from 'worker_threads'
import path from 'path'

enum Services {
  serviceA = 'serviceA',
  serviceB = 'serviceB',
  serviceC = 'serviceC'
}

interface WorkerData {
  service: Services
}
export class ServiceStarter {
  private readonly filePath = path.join(__dirname, '..', 'dist', 'bootstrap.js')
  constructor(private readonly isMainThread: boolean, private readonly workerData: WorkerData) { }

  async startAllServices(): Promise<void> {
    try {
      if (this.isMainThread) {
        new Worker(this.filePath, { workerData: { service: Services.serviceA } });
        new Worker(this.filePath, { workerData: { service: Services.serviceB } });
        new Worker(this.filePath, { workerData: { service: Services.serviceC } });
      } else {
        await this.childService(this.workerData)
      }
    } catch (error) {
      console.log(JSON.stringify(error, null, 2))
    }

  }

  async childService({ service }: WorkerData) {
    console.log(`Starting Service - ${service}`)
    switch (service) {
      case Services.serviceA:
        return await serviceB()
      case Services.serviceB:
        return await serviceA()
      case Services.serviceC:
        return await serviceC()
      default:
        throw new Error('Service Unavailable');
    }
  }
}

在构造函数中有一个包含大量可注入的通用文件夹,并且不同的类在 .module 文件夹中声明的不同服务中有它们的实现

实施 1

@Module({
  imports: [CommonModule],
  providers: [
    ...commonProviders,
    {
      provide: CARD_PROVIDER_FACADE_FACTORY,
      useClass: serviceAFactory,
    },

实现 2

@Module({
  imports: [CommonModule],
  providers: [
    ...commonProviders,
    {
      provide: CARD_PROVIDER_FACADE_FACTORY,
      useClass: serviceBFactory,
    },

我出现的问题是首先初始化的内容会覆盖提供程序,因此如果 serviceBFactory 先初始化,那么它将服务 B 注入应该注入 serviceAFactory 的其他微服务

TLDR:当我们的门面调用 serviceA 时,如果 serviceB 最后初始化,则 serviceB 的工厂被注入。我假设通过在他们自己的线程中定义每个范围将分离范围。我在这里想念什么?他们是干净的解决方案吗?

对不起,如果这是一个有点令人费解的第一个堆栈溢出问题

编辑:作为我认为解决问题的更新。我使用 await import('') 语法懒惰地导入了每个文件。因此,只有工作人员可以访问他自己的导入服务。

【问题讨论】:

    标签: node.js typescript nestjs


    【解决方案1】:

    我认为“新员工”的行为与您的预期略有不同。这是一个非阻塞指令,所以这意味着所有三个worker都是在this.mainThread循环中一次创建的。

    当它们被初始化为承诺 (https://nodejs.org/api/worker_threads.html) 时,您可以从工作人员那里发送一些消息,并且您可以按顺序触发新的工作人员创建(在创建第一个工作人员时创建一个新工作人员)。但在这种情况下,您不能一次启动所有这些。

    【讨论】:

      猜你喜欢
      • 2019-02-05
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      • 2020-03-08
      • 2017-05-28
      • 2020-01-23
      • 1970-01-01
      • 2020-05-15
      相关资源
      最近更新 更多