问题标签 [node-amqplib]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
9090 浏览

node.js - amqplib: Socket closed abruptly during opening handshake

What I am trying to do

I try to create rabbit-mq publisher & subscriber. It works as expected until I try to restart my rabbit-mq server.

What works

I use rabbitmq:3-management docker image, ampqlib 5.3, and Node.js 11.10.0 to make this simple program:

So, first of all, I made two channels. One as publisher, and the other as consumer.

The publisher emit something to do message to tasks queue.

The consumer then catch the message and print it to the screen using console.log.

It works as expected.

What doesn't work

First Attempt

Similar to my previous attempt, but this time I try to stop and start rabbit-mq container (restarting the server) before proceed.

It doesn't work, I get this error instead:

Second attempt

My first attempt didn't work. So, I try to create new channel after restarting the server:

And this time, I got this error instead:

I'm not really sure, but I think the error is related to It might be related to https://github.com/squaremo/amqp.node/issues/101.

What I want

I want workaround/solution to reconnect to rabbitmq after the server restarted. Any explanation/suggestion is also welcomed.

Edit

I try to go deeper and modify my code a bit:

And I get this output:

So I guess amqplib is able to re-connect but fail to create channel.

0 投票
2 回答
362 浏览

javascript - 在nodejs中等待与rabbit的正确连接

我尝试为 amqplib/callback_api 编写我的简单事件发射器包装器。当兔子不可用或断开连接时,我无法处理情况。我有getConnect返回 Promise 的方法,该方法在建立连接时解决。但是如果连接被拒绝,Promise 显然会拒绝。如何在连接未建立时强制此方法重新连接

整个代码在这里https://github.com/kimonniez/rabbitEE

也许,我已经很困了,但我完全糊涂了:)提前谢谢!

0 投票
1 回答
771 浏览

node.js - 我可以从我的 NodeJS 应用程序动态创建 RabbitMQ 铲子吗?

RabbitMQ 铲子插件提供了一个 HTTP API 来创建和配置铲子。假设我为我的 RabbitMQ 服务器实例启用了铲子和铲子管理插件,我可以从我的 NodeJS 应用程序动态创建铲子吗?

我目前使用 amqplib 连接到交易所。https://www.squaremobius.net/amqp.node/channel_api.html

但是我没有看到任何 API 可以动态创建铲子。这是可以实现的还是有任何其他库支持这一点?

0 投票
0 回答
65 浏览

rabbitmq - 从性能角度看 RabbitMQ Exchange 是什么意思

我试图找到答案,但找不到任何可靠的东西。

假设我有一个分成 3 个模块的系统。(只是一个例子)

用户

产品

订单

我可以创建 3 个 Exchange,每个模块 1 个。(假设它们都是相同的类型)或者我可以为每个人创建 1 个 Exchange。

会有什么区别(除了模块之间的逻辑分离)

在这种情况下,是否有与性能相关的最佳实践?

还有一个..在nodeJS中拆分通道有什么意义吗?Nodejs 是单线程的,但 I/O 调用在操作系统线程上工作

谢谢你的帮助..我很想得到澄清,如果有任何官方参考,那就太好了

编辑:我正在努力实现非常好的性能和低延迟流,这对我的业务至关重要。我以前和rabbit一起工作过,我很了解他(用Java工作)但是当我开始阅读时,我不确定交换的好处是什么?如果我们有默认值(性能方面)并且通道在每个节点都是单个进程的 nodejs 应用程序集群中是否有意义,为什么我们需要创建新的交换

0 投票
1 回答
1704 浏览

javascript - 如何在发送后立即从 RabbitMQ 中的队列中删除消息

所以我开始使用 RabbitMQ 并在网站https://www.rabbitmq.com/tutorials/tutorial-one-javascript.html上做教程,但我没有 100% 理解如何设置确认功能以便删除队列在发送消息后立即发送消息,无论消息是否被消费都无关紧要。我正在尝试创建一个队列,该队列将在发送后立即删除所有消息

我尝试了教程中的示例,例如 hello world 示例显示 noAck 属性设置为 true,这意味着我们没有确认消息,因此队列实际上应该在发送这些消息后删除这些消息,但事实并非如此,因为当我运行 send.js 3 次然后运行 ​​receive.js 然后我会收到 3 次 hello world 消息,这不是我想要的

例如,如果我运行 3 次 send.js,则可能会发生 2 种情况。情况 1 是消息将从接收方消费并完成。case2 是它不会从接收器中消耗,在这种情况下,我希望将其删除,如果我在 send.js 一个月后运行 receive.js,我不希望消息被消耗,但我也希望我的队列耐用而不是排他性。当我继续调用 send.js 并且消息将一直推送到该队列中时,这也是一个问题,然后如果我运行 receive.js,我将同时收到 1000 条消息,所以我的目标是避免这种情况。我很感激任何帮助

0 投票
1 回答
250 浏览

node.js - 过了一会儿我得到了这个错误:错误:没有通道可以分配

我想在兔子中发送和保存一些数据;过了一会儿,我运行我的代码,向我的兔子发送了一些数据后,我得到了一些像这样的错误:错误:没有通道可以分配

我多次使用此代码,因为我有几个数据要发送到rabbitMQ

0 投票
1 回答
248 浏览

node.js - amqp client doesn't show that RabbitMQ server connection is blocked

I run RabbitMQ image in docker-compose like this:

Then connect to via other Node.js app like this:

It works fine but few questions:

  1. Why console.log(this._connection.blocked); outputs undefined;
  2. How do I detect that connection is already blocked when I start the client? I.e. service is out of resources and RabbitMA manager says that connection is in 'blocking' state right after it connected. This is why this._connection.on("blocked" doesn't work

enter image description here

0 投票
1 回答
1682 浏览

node.js - 使用 amqplib-mocks 库进行 rabbitMQ 单元测试

我正在尝试使用amqplib-mocks编写单元测试,但我无法使用来自消费者的消息,我得到未定义,我尝试调试但不成功。

前两个测试通过,但第三个测试得到未定义的值。任何帮助将不胜感激。

0 投票
0 回答
349 浏览

node.js - 使用 Mocha 对在 AMQP 消息接收事件时应触发的回调进行集成测试

我有一个 Feathers 应用程序,它使用 RabbitMQ 和一个自定义 amqplib 包装器来与在其他地方运行的其他代码进行通信,我正在努力编写一个好的集成测试,以显示收到消息时运行的回调运行正确。实际的回调只是获取接收到的消息的主体并调用内部服务将数据放入数据库中。

我有一个在测试环境中运行的 RabbitMQ 服务器,想法是编写一个测试,将一些虚拟数据发布到正确的交换,然后检查数据是否最终进入数据库。问题是在我检查数据库之前我不知道如何判断回调已经完成。

现在,我只是发布消息,然后在检查数据库之前使用超时等待几秒钟,但我不喜欢这样,因为不能保证回调会完成。

我正在测试的代码看起来像这样(不是实际代码只是一个示例):

我的测试看起来像这样:

在检查记录是否存在之前,不只是等待任意时间限制,有没有更好的方法来构建这个测试?

还是等待某个时间对于事件驱动功能完全有效?

0 投票
1 回答
362 浏览

node.js - 递归承诺,用于 AMQPLIB 重新连接方法

我正在创建一个重新连接到 RabbitMQ(使用 amqplib)的方法,使用递归并返回一个传递连接对象的 Promise。这是我到目前为止所拥有的:

我这样称呼这个方法:

问题是,如果我运行它并且 RabbitMQ 正在运行,它就可以工作。如果 RabbitMQ 关闭,代码会重新连接 OK,但永远不会调用 Promise。

如果 RabbitMQ 已关闭,则 if (err) == TRUE 并调用 setTimeout(connectServiceBus, 1000)。由于递归调用,Promise 永远不会被解决,但不知道如何修复它。

我试过更换

但这也不起作用。

谁能解释我如何解决这个问题,或提供任何见解?