gpt4 book ai didi

microservices - nestjs 微服务 - 有一个 clientProxy 将消息发布到任何微服务

转载 作者:行者123 更新时间:2023-12-04 12:36:35 24 4
gpt4 key购买 nike

有时,你想说,“我有这个消息,谁能处理?”
nestjs客户端代理直接绑定(bind)到单个 microservice .
因此,举个例子,假设我有以下微服务:CleaningService , FixingService .
以上都可以处理消息car ,但只有 CleaningService可以处理留言glass .
所以,我想要一些类似的东西:

this.generalProxy.emit('car', {id: 2});
在这种情况下,我想要 2 种不同 microservices办车: CleaningServiceFixingService .
在这种情况下:
this.generalProxy.emit('glass', {id: 5});
我只想要 CleaningService来处理它。
这怎么可能?我如何创建 clientProxy未直接连接到 specific microservice .

最佳答案

底层传输层很重要,因为尽管在不同传输之前有一个抽象,但每个底层都具有完全不同的特性和功能。您正在谈论的消息传递模式类型使用 RabbitMQ 很容易实现,因为它具有交换、队列、发布者、订阅者等概念,而基于 TCP 的微服务需要从一个服务到另一个服务的连接。同样,Redis 传输层使用简单的 channel ,没有必要的底层实现,能够支持将一些消息散布到多个订阅者,而一些直接发送到特定订阅者。
这可能不是最受欢迎的意见,但我专业使用 NestJS 已经 3 年多了,我可以肯定地说,官方微服务包对于大多数实际生产应用程序来说是不够的。它们作为概念证明效果很好,但由于这些类型的问题,它们很快就会崩溃。
幸运的是,NestJS 以模块和 DI 系统的形式提供了很棒的构建块和原语,以允许构建更多功能丰富的插件。我专门为 RabbitMQ 创建了一个,以便能够支持您所描述的确切类型的场景。
我强烈建议您既然已经在使用 RabbitMQ,请查看 @golevelup/nestjs-rabbitmq它可以轻松支持您使用 native RMQ 概念(如交换和路由 key )完成的任务。 (免责声明:我是作者)。它还允许您根据需要管理任意数量的交换和队列(而不是被迫尝试通过单个队列推送所有内容),并且对包括 PubSub 和 RPC 在内的多种消息传递模式具有 native 支持。
您只需使用适当的元数据装饰您想要充当微服务消息处理程序的方法,消息就会按预期工作。例如:

@Injectable()
export class CleaningService {
@RabbitSubscribe({
exchange: 'app',
routingKey: 'cars',
queue: 'cleaning-cars',
})
public async cleanCar(msg: {}) {
console.log(`Received message: ${JSON.stringify(msg)}`);
}

@RabbitSubscribe({
exchange: 'app',
routingKey: 'glass',
queue: 'cleaning-glass',
})
public async cleanGlass(msg: {}) {
console.log(`Received message: ${JSON.stringify(msg)}`);
}
}
@Injectable()
export class FixingService {
@RabbitSubscribe({
exchange: 'app',
routingKey: 'cars',
queue: 'fixing-cars',
})
public async fixCar(msg: {}) {
console.log(`Received message: ${JSON.stringify(msg)}`);
}
}
通过这种设置,清洁服务和修理服务都将收到汽车消息给各自的处理程序(因为他们使用相同的路由 key ),只有清洁服务会收到玻璃消息
Publishing message is simple .您只需包含交换和路由 key ,正确的处理程序将根据其配置接收它:
amqpConnection.publish('app', 'cars', { year: 2020, make: 'toyota' });

关于microservices - nestjs 微服务 - 有一个 clientProxy 将消息发布到任何微服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64203140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com