Microservices 我们可以在nestjs中使用服务器发送的事件而不使用interval吗?

Microservices 我们可以在nestjs中使用服务器发送的事件而不使用interval吗?,microservices,mqtt,nestjs,server-sent-events,nestjs-gateways,Microservices,Mqtt,Nestjs,Server Sent Events,Nestjs Gateways,我正在使用nestjs创建一些微服务 例如,我有x,y和z服务,所有这些服务都通过grpc互连,但我希望服务x在特定实体更改时向Web应用发送更新,因此我考虑了服务器发送的事件[接受任何其他更好的解决方案] 根据nestjs文档,它们有一个以n间隔运行的函数,用于sse路由,似乎资源耗尽。是否有一种方法可以在有更新时实际发送事件 假设我在同一服务中有另一个api调用,该调用是由另一个Web应用程序上的按钮单击触发的,我如何仅在单击按钮时触发事件,而不是持续发送事件。另外,如果您知道任何一种惯用的

我正在使用nestjs创建一些微服务

例如,我有xyz服务,所有这些服务都通过grpc互连,但我希望服务x在特定实体更改时向Web应用发送更新,因此我考虑了服务器发送的事件[接受任何其他更好的解决方案]

根据nestjs文档
,它们有一个以n间隔运行的函数,用于sse路由,似乎资源耗尽。是否有一种方法可以在有更新时实际发送事件

假设我在同一服务中有另一个api调用,该调用是由另一个Web应用程序上的按钮单击触发的,我如何仅在单击按钮时触发事件,而不是持续发送事件。另外,如果您知道任何一种惯用的方法来实现这一点,而黑客会很感激,那么希望它成为最后的手段

[奖金问题] 我还考虑使用MQTT发送事件。但我觉得单个服务不可能有MQTT和gRPC。我对使用MQTT持怀疑态度,因为它的延迟以及它将如何影响内部消息传递。如果我可以限制到外部客户机,那就太好了(即,使用gRPC进行内部连接的x服务和使用MQTT进行webapp的MQTT只需要MQTT公开一条路由)。 (PS我是微服务新手,请全面介绍您的解决方案:p)


提前感谢您阅读到最后 你可以。重要的是,在NestJS
SSE
中,SSE是用可观察对象实现的,因此只要您有一个可观察对象可以添加到,就可以使用它发回SSE事件。处理此问题的最简单方法是使用。我曾经在某个地方有过这样的例子,但一般来说,它看起来像这样

@Controller()
导出类控制器{
构造函数(私有只读sseService:sseService){}
@SSE()
多特塞(){
返回此.sseService.sendEvents();
}
}
@Injectable()
出口类服务{
私有事件=新主题();
附录(事件){
这个。事件。下一个(事件);
}
sendEvents(){
返回此.events.asObservable();
}
}
@Injectable()
导出类按钮触发服务{
构造函数(私有只读sseService:sseService){}
buttonClickedOrSomething()按钮{
此.sseService.addEvent(按钮ClickedEvent);
}
}

请原谅上面的伪代码性质,但一般来说,它确实说明了如何使用主题为SSE事件创建可观察对象。只要
@SSE()
端点返回一个具有适当形状的可观察对象,您就是金色的。

有没有办法将该事件与特定用户隔离开来?对于控制器中的SSE,我正在执行类似于@SSE('/status/update/:userId')的操作。我想我应该用地图。有更好的解决办法吗?地图对我来说不是个糟糕的主意。我对sse过滤了解不多,所以可能需要研究一下