Node.js应用程序充当生产者和消费者

时间:2020-01-17 07:08:10

标签: node.js rabbitmq amqp

我现在正在使用REST API将数据保存到数据库中的应用程序上工作。基本流程是:REST API->对象->保存到数据库。考虑到生产者和消费者是上述应用程序的一部分的想法,我想向应用程序介绍队列。

Node.js应用程序是否可以同时充当队列的生产者和使用者?知道Node.js是单线程语言,它是否给我其他选择,而不是创建两个应用程序(一个生成到队列,另一个生成到队列中的应用程序),主动等待队列中的消息并保存到数据库?

此外,这里的要求是应用程序处理重新启动时队列上尚未确认的任何项目。这也使我认为“两个应用程序”体系结构是最好的主意。

谢谢您的帮助。

2 个答案:

答案 0 :(得分:0)

是的,nodejs能够做到这一点,并且非常适合每个I / O密集型应用程序使用案例。这里的重点是“您要实现什么”?消息队列的目的是使不同的应用程序一起通信,而如果您需要进程内事件总线,则完全是徒劳的。在同一个nodejs应用程序的解耦组件之间传播消息有许多简便有效的方法。其中一种方法是EventEmitter,让您的组件以pubsub方式进行协作

如果您确信AMQP经纪人是您的解决方案,则只需

  • 定义一个“生产者”类,该类在交易所 myExchange
  • 上发布数据
  • 定义一个“消费”队列,该队列声明一个队列 myQueue
  • 基于某些路由键,在应用程序启动时在myExchange和myQueue之间创建绑定。然后,当收到来自“消费者”的消息时,您需要在保存数据库后进行确认。确认消息后,由于该消息已被使用,因此将被销毁。您可以在发生错误后决定通过NACK恢复消息

有些nodejs库可以简化代码,例如Rascal

答案 1 :(得分:0)

简短答案:使用两个单独的连接进行发布和使用

NodeJS应用程序既可以充当队列的生产者又可以充当队列的使用者吗?

我什至会说这是一个很好的用例,与NodeJS原理和线程机制非常匹配。

知道Node.js是单线程语言,它是否给我其他选择,而不是创建两个应用程序(一个生成到队列,另一个生成到队列中的应用程序),积极地等待队列中的消息并保存到数据库?

您可以让一个应用程序同时处理这两个应用程序,只是要注意,如果您的客户端发布得太快而服务器无法处理,RabbitMQ可以对TCP连接施加背压,因此消耗背压TCP连接将极大地影响消费者表现。