Tag: rabbitmq

node-amqp队列销毁:通知订户

我使用node-amqp和rabbit作为一些pub / sub工具。 我想知道是否有可能通知订阅者某人/某事(在其他进程中)已经销毁他们正在收听的队列。 例如,处理一: connection.queue(name = "test-queue1", options, function(queue) { queue.subscribe({}, function(message, headers, deliveryInfo) { deliverMessage(message); }).once('error', function(error) { logger.error(error) }).once("queueDeleteOk", function bindHandler() { queue.close(); }); }; 现在,其他进程可能会破坏该队列。 用户如何知道这一点? 例如,stream程二可以做到: connection.queue(name = "test-queue1", options, function(queue) { queue.destroy(delete_options); }).once("queueDeleteOk", function bindHandler() { queue.close(); }); 我试图听取“queueDeletedOk”这个事件的作用,但是它只在进程2中被发送和接收,这正在销毁队列。 尝试事件“closures”在队列上同样发生。 感谢和最好的问候,

如何从node.js检查RabbitMQ中是否存在交换?

我想从node.js检查一个特定的RabbitMQ交换是否存在。 我正在使用Mocha作为testing框架。 我写了相同的代码,但我的期望似乎是不正确的。 如果没有交换,我希望交换variables具有未定义的值,但事实并非如此。 我正在使用amqp模块与RabbitMQ进行交互。 以下是代码: var should = require('should'); var amqp = require('amqp'); //Configuration var amqpConnectionDetails = { 'host':'localhost', 'port':5672, 'login':'guest', 'password':'guest' }; describe('AMQP Objects', function(){ describe('Exchanges', function(){ it('There should exist an exchange', function(done){ var amqpConnection = amqp.createConnection(amqpConnectionDetails); amqpConnection.on('ready', function(){ var exchange = amqpConnection.exchange('some_exchange', {'passive':true, 'noDeclare':true}); exchange.should.not.be.equal(undefined); exchange.should.not.be.equal(null); done(); }); }); }); }); 什么是检查交换存在的正确方法? […]

为什么node-amqp出现问题时会“closures”事件?

(我正在使用node-amqp和rabbitmq服务器。) 我想猜测为什么我有一个closures事件,如果出现错误。 例如,如果我尝试打开连接到队列(具有错误的参数),我收到一个错误事件。 这是完美的。 但是,在发生任何错误之后,我将收到一个closures的连接(在这种情况下,可能是因为closures了失败的套接字到队列)。 之后,自动重新连接,我收到(初始)准备好的事件。 问题: connection.on('ready', function() { do_a_lot_of_things }).on(error, function(error){ solve_the_problem }); 如果出现错误,我收到错误,但是“准备就绪”事件,它将重新do_a_lot_of_things。 我的方法错了吗? 最好的祝福

使用amqplib控制Node.JS,控制RabbitMQ使用者的使用率

我的应用程序使用RabbitMQ队列来存储消息,然后我有一个工作人员消费这些消息,并将其插入到数据库中。 目的不是强调工作负载高峰期的数据库。 我遇到的问题是,在那些高峰期,队列的发布率真的很高,工作人员每秒钟开始接收的消息比它能处理的时间多,直到它崩溃。 有什么办法来控制消费率,所以我可以确保工人收不到消息比消耗更快? 信息并不重要,所以我不介意他们有多less时间入队,直到工作人员能够处理。 我使用的Node.JS amqplib,这是我使用的工人代码: open.then(function(conn) { var ok = conn.createChannel(); ok = ok.then(function(ch) { ch.assertQueue(q); ch.consume(q, function(msg) { if (msg !== null) { message = JSON.parse(msg.content.toString()); processMessage(message); } }, {noAck: true}); }); return ok; }).then(null, console.warn);

何时在node.js中创buildRabbitMQ通道

我读过的关于为RabbitMQ创build通道的常见build议build议每个线程使用一个通道。 但是在node.js中,我们根本不pipe理线程。 那么我们什么时候创build渠道 ? 我的使用案例是使用AMQPLib的节点Web服务器,它需要使用请求/响应模式与单个RabbitMQ服务器进行通信。 每个HTTP请求可能需要多个RabbitMQ请求才能生成HTTP响应。 我打算在每个节点进程中使用一个Rabbit连接,但是就各种请求或响应队列而言,重用通道有多less,我不确定。 一个附加问题:如果答案是为每个单独的请求使用一个通道,那么在发送每个消息之前必须创build一个通道会有很多的延迟惩罚吗?

如何发送一个消息给所有的订阅者,除了发布者也是同一个rabbitMQ队列上的一个侦听器

我有一个由nodeJS服务器安装的rabbitMQ。 我使用rabbit.js库与兔子进行交互,到目前为止,我对此感到满意。 我在扇出模式的同一个队列中有多个用户,每个节点都是一个订阅者,也是一个发布者,这对我很有好处,并且工作正常,因为在很多情况下,我想通知所有服务器一些发生的更新在这些节点之一(这也是出版商…) 我偶然发现一个情况,我需要发送队列中的所有侦听器的消息,除了发送它的人(这也是同一队列中的侦听器)。 我不知道谁在监听(可能有一个,可能有几百万),所以我不能通过一些白名单的路由规则将它路由到一些特定的节点。 它必须是某种排除通配符路由规则(一些黑名单),例如,发送这个消息给每个人听谁不对应我自己的唯一ID … 可以使用rabbit.js来完成吗? 它可以甚至在rabbitmq以某种方式完成? 我不太了解那只兔子,所以要对我温柔:) 顺便说一句,如果你知道如何使用rabbit.js,甚至更好… 编辑:: 根据Derick Bailey的要求,这是我需要这个的原因 我有一个系统,其中有许多负载平衡的nodeJS服务器作为web服务运行。 他们是完全透明的。 他们都不知道哪些其他节点存在。 我想保持这种方式,因为这种分离使我更容易通过添加和删除其他“并行”节点来更好地扩展。 这些节点中的每一个都有自己的内存本地caching服务。 我偶然发现了一个单个节点更新某个实体的情况。 现在我需要使这个节点可以通知所有其他并行节点(可能在caching中具有相同的实体)使其无效。 问题在于发送消息的节点(更新节点)也会收到消息,因为他也是一个监听者。 所以我希望他以某种方式排除自己的特定消息的接收者列表…因此需要一些路由黑名单。 (他知道自己,所以除了自己的身份证之外,我可以让他通往所有人……但即使有人确实在听另一端的话,他也不知道……所以它不能成为白名单) 希望我的需要现在更清楚。 我已经想到了解决我的问题,但它需要额外的发展在我身边,我想通过使用兔子的当前能力(如果可能的话),以避免它我可以只添加一个唯一的ID的内容的消息。 那么发送节点可以认识到这个消息来自他并忽略这个消息。 但正如你可以明白,这可能会变得棘手,因为我需要考虑更多的陷阱和其他边缘情况下可能会失败… 如果有人能告诉我如何使用一些兔子现有的configuration,我会很高兴听到如何:)

头文件在Node.js中使用RabbitMQ交换示例

我一直在寻找在Node.js中使用RabbitMQ的headers exchange示例。 如果有人能把我指向正确的方向,那就太好了。 以下是我到目前为止: 发布者方法 (创build发布者) RabbitMQ.prototype.publisher = function(exchange, type) { console.log('New publisher, exchange: '+exchange+', type: '+type); amqp.then(function(conn) { conn.createConfirmChannel().then(function(ch) { publishers[exchange] = {}; publishers[exchange].assert = ch.assertExchange(exchange, type, {durable: true}); publishers[exchange].ch = ch; }); },function(err){ console.error("[AMQP]", err.message); return setTimeout(function(){ self.connect(URI); }, 1000); }).then(null, console.log); }; 发布方法 RabbitMQ.prototype.publish = function(exchange, routingKey, content, headers) { try { […]

不能有RabbitMQ Clojure客户端工作

我有我的RabbitMQ实例的2个客户端,但我没有设法使Clojure版本工作。 我可能错过了一些RabbitMQconfiguration,但无法弄清楚什么。 我的交换是数据,队列是警报。 任何想法在Clojure版本中缺less什么? 工作Node.js RabbitMQ客户端 var amqp = require('amqplib/callback_api'); amqp.connect('amqp://192.168.99.100', function(err, conn) { conn.createChannel(function(err, ch) { var ex = 'data'; ch.assertExchange(ex, 'direct', {durable: true}); ch.assertQueue('', {exclusive: true}, function(err, q) { console.log(' [*] Waiting for logs. To exit press CTRL+C'); ch.bindQueue(q.queue, ex, 'ALERT'); ch.consume(q.queue, function(msg) { console.log(" [x] %s: '%s'", msg.fields.routingKey, msg.content.toString()); }, {noAck: true}); […]

队列与非阻塞I / O

所以,我们正在devise一个新的微服务架构。 内部沟通是最大的挑战之一。 对于需要响应的通信,我们使用REST API。 但对于只想传递信息的服务,这个API处理是不必要的开销。 一种方法是使用队列。 service1将信息推入队列,service2可以从那里消耗。 因此,service1不必等待(不像API调用)。 (如果在处理信息时有任何错误,service2可以通过callbackURL通知service1,或者以其他方式通知;这点不是问题[1]) 现在有了Queue,有两个选项,一个是RabbitMQ 。 另一个是AWS SQS 。 有了RabbitMQ,我不得不担心服务器设置和一切(可以完成,但是要避免它)。 所以在SQS的POC之后,这似乎是一个不错的select,但SQS在内部使用Rest API与AWS服务器进行通信,在这两个时间点(service1在推送时,service2在消费时)都会有开销。 所以现在我想为什么不在NodeJS中做,service1将打到service2的信息。 Service2将立即作出回应,确认它已收到信息,如果有任何错误[1]。 现在我可以总结的优点/缺点是 – 的RabbitMQ 易于实施 如果接收方不可用,发送方不必担心重试。 服务器设置成本+维护(+调整) SQS 最容易实施 价钱 对消息进行持续轮询 在推/收上的开销 非阻塞API 没有第三个媒体需要沟通 Service1必须pipe理重试机制 相对于SQS,更less的开销 信息将在内存中处理 所以到了某种程度,我的问题是,使用非阻塞API是否是个好主意? 或者在制度可扩展性方面哪一个更好。 编辑 – 像PubNub或Pusher的PubSub提供程序可以用来代替队列吗?

distibuted信号量系统序列化不能在同一时间运行的任务

我正在寻找一种方法来序列化影响数据存储中的数据的任务,而不使用MySQL ex:在group1上执行记帐的工作人员应该是唯一一个在第一组上进行记帐的工作人员,并且如果另一个工作人员正在对第一组进行记帐, 。 我可以通过设置信号表来实现这一点,启动一个事务,在group1的行上进行更新,完成我的任务,然后提交。 我在想,也许0mq redis或某种消息传递系统可以用来实现相同的目标,并允许我使用我想要的任何数据存储。 我也在想,ScalienDB可能能够解决与mysql相同的庄园问题,因为它支持交易。 ScalienDB的文档似乎有些不完整,所以我不能确定它是否可以以这种方式进行交易。 所以我的问题是: 1. ScalienDB可以执行一个事务来强制客户端等待另一个客户端提交,如果它想要编辑另一个客户端也做了编辑的表中的一行。 2.使用消息传递系统,你会如何build议实现一些归结为这样的东西: var semaphore = semaphore_group() semaphore.acquire('task1',function(){ // do work after a sophomore is locked in semaphore.release() // }) 理想情况下,我不希望这个系统依赖于一个集中的经纪人 3.有没有一个可以解决这个问题的替代解决scheme