- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我刚开始学习 rabbitMQ,但遇到了一个问题。
使用 http://pecl.php.net/package/amqp版本 1.4(最新版本)和 RabbitMQ 3.3.1。我们必须使用 php5-fpm 和带有 amqp->pconnect() 的持久连接。
一段时间后(我猜是 65500 个请求)出现一个问题,停止所有写入"
Could not create channel. Connection has no open channel slots remaining
”
根据我在源代码中读到的内容,因为每个 tcp 连接都有一个达到其最大值的自动增量 channel ID。发生这种情况是因为每个请求都必须使用 channel ,并且无法使用相同的 channel (我找不到进入 php-amqp channel 类以使其持久化的方法)并且脚本无法通信(使用相同的实例作为 php 对象的 channel )。
降低 php-fpm 的生命周期不是一种选择,要么通过另一种技术/库等来解耦应用程序-rabbitmq 通信。
有什么简单的方法可以解决这个问题吗?
理论上它应该是每个线程一个 channel (在这种情况下是 php5-fpm worker)但是如何使用这个库来实现?
我现在使用的代码(类似)
$this->con = new AMQPConnection(array(
'host' => $this->con_params['host'],
'port' => $this->con_params['port'],
'vhost' => $this->con_params['vhost'],
'login' => $this->con_params['user'],
'password' => $this->con_params['pass'],
'read_timeout' => 1,//seconds
'write_timeout' => 1,//seconds
'connect_timeout' => 1,//seconds
));
$this->con->pconnect();
$channel = new AMQPChannel($this->con);
$queue = new AMQPQueue($channel);
$queue->setName($queueName);
$queue->setFlags(AMQP_DURABLE);
//$queue->declareQueue();//make sure it exists
$exchange = new AMQPExchange($channel);
$exchange->setName($exchangeName);
$exchange->setFlags(AMQP_DURABLE);
$exchange->setType(AMQP_EX_TYPE_DIRECT);
//$exchange->declareExchange();
$this->queues[$queueName]->bind($exchangeName);
谢谢!!
最佳答案
简短回答:不要使用带有 php-amqp
扩展的持久连接,使用常规的 connect()
打开连接应该不会降低性能即使在高负载下(如 2k+req/sec)也很重要。
长答案:
在 php-amqp 中每个连接限制同时硬编码了最大同时打开的 channel 数扩展名(#define DEFAULT_CHANNELS_PER_CONNECTION 255
)。关闭的 channel 在关闭后尝试重用。
但是rabbitmq-c (aka librabbitmq)还有另外一个限制到一个物理连接内的最大 channel 数 - #define AMQP_DEFAULT_MAX_CHANNELS 0
,这意味着没有应用自定义限制,因此应用了协议(protocol)限制。根据规范 ( section 4.9 Limitations ),协议(protocol)限制为:
Number of channels per connection: 16-bit channel number.
这是according to wikipedia 无符号:从 0 到 65,535
。在 AMQP 中,0 永远不会用作 channel 号并被解释为错误。
因此,当您在本地关闭所有 channel 但未关闭时,RabbitMQ 将继续 channel 编号序列,从而达到指定的上限。
除非关闭您的连接,否则没有其他方法可以摆脱这种行为。
此外,我建议您根本不要使用持久连接,因为它有 potential memory leak。总的来说有点不稳定。有计划从 php-amqp 中完全删除持久性。
关于rabbitmq - 如何避免使用 amqp php、持久连接和 php-fpm 的每个 tcp 连接的最大 channel 数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23864647/
在 Spring AMQP 项目中, 如果 messageProperties 没有 messageId,它们总是创建 messageId。 像这样.. if (this.createMessageI
我不确定我对 errorHandler 和 returnExceptions 的理解是否正确。 但这是我的目标:我从 App_A 发送了一条消息,使用 @RabbitListener 在 App_B
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我们希望将大型机放在总线上。我相信是AS400。为此,我想让 CICS 大型机向代理发送 AMQP 消息。有几十个AMQP客户端,包括JMS客户端。我对大型机上可能发生的事情了解不够,无法判断是否可以
我们希望将大型机放在公共(public)汽车上。我相信它是AS400。为此,我想让 CICS 大型机向代理发送 AMQP 消息。有几十个 AMQP 客户端,包括 JMS 客户端。我不太了解大型机上的可
我即将实现一个基于 PHP 的系统,该系统使用 RabbitMQ。我可以看出那里有 2 个成熟的库:PECL AMQP和 php-amqp . 我将同时为客户端和工作人员使用 PHP。 有人对这两个库
我正在使用 RabbitMQ 和 ruby-amqp与 Rails。当 Controller 收到消息时,我执行以下操作: def create AMQP.start("amqp://localh
我有两个困惑。 1.如果消息监听器抛出RuntimeException,SimpleMessageListenrContainer会停止吗?2.如果SimpleMessageListenerConta
我们在绑定(bind)到 Rabbit MQ 实例的 Java 应用程序的日志中遇到以下异常。 这是必须要注意的事情,表示Spring AMQP的实现中存在问题,还是可以忽略的事情?在后一种情况下,此
场景:微服务从 RabbitMQ 队列中获取消息,将其转换为对象,然后微服务对外部服务进行 REST 调用。 它将处理成千上万条这样的消息,如果我们知道外部 Rest 服务已关闭,有没有办法告诉我的消
我有一个使用带有 webflux 的 Boot 2.0 的应用程序,并且有一个端点返回 ServerSentEvent 的 Flux。这些事件是通过利用 spring-amqp 从 RabbitMQ
我正在尝试使用 streadway/amqp 连接到 RabbitMQ 总线Go 的驱动程序。我正在处理重新连接例程,为此,我有一个 rabbitMQConsume 函数调用 rabbitMQConn
我正在尝试通过 SSL 连接到 RabbitMQ。我遵循了此处链接的 RabbitMQ SSL 文档 https://www.rabbitmq.com/ssl.html根据 RabbitMQ SSL
这些 amqp 客户端库之间有什么区别?哪一个是最推荐的?主要区别是什么? 最佳答案 我会推荐 amqp.node和 bramqp通过 node-amqp。 node-amqp 有很多错误并且维护不善
我得到的错误: 2019-12-09 06:39:33.189 ERROR 107132 --- [http-nio-8082-exec-5] o.a.c.c.C.[.[.[/].[dispatche
所以我已经让 MQTT -> MQTT 和 AMQP -> AMQP 工作;不过,MQTT -> AMQP 的翻译似乎在某处不起作用。这是我的测试,如果我的“监听器”也在使用 paho 的 MQTT
我得到的错误: 2019-12-09 06:39:33.189 ERROR 107132 --- [http-nio-8082-exec-5] o.a.c.c.C.[.[.[/].[dispatche
几天前我问了同样的问题:Unable to "Peek" messages from an Azure Service Bus Queue using AMQP and Node 。我再次问同样的问题
我有一个当前与 RabbitMQ 集成的组件。我想将 RabbitMQ 替换为 Azure Event Hub,因为我们现在位于云中。 AMQP 0.9.1 与 AMQP 1.0 兼容吗?交换会无缝进
我有一个当前与 RabbitMQ 集成的组件。我想将 RabbitMQ 替换为 Azure Event Hub,因为我们现在位于云中。 AMQP 0.9.1 与 AMQP 1.0 兼容吗?交换会无缝进
我是一名优秀的程序员,十分优秀!