文档章节

amqp_login 有时会耗时较长时间

andrew810810
 andrew810810
发布于 2016/07/12 17:26
字数 320
阅读 111
收藏 0
点赞 0
评论 0

rabbitmq-c 的amqp_login(),有时会耗时较长时间

通过增加打印,发现耗时发生在:

 

  res = amqp_simple_wait_method(state, 0, AMQP_CONNECTION_START_METHOD,
                                &method);

 

其中内部调用了函数:

static int wait_frame_inner(amqp_connection_state_t state,
                            amqp_frame_t *decoded_frame,
                            struct timeval *timeout)
{
  amqp_time_t deadline;
  amqp_time_t timeout_deadline;
  int res;

  res = amqp_time_from_now(&timeout_deadline, timeout);
  if (AMQP_STATUS_OK != res) {
    return res;
  }

  while (1) {
    int res;

    while (amqp_data_in_buffer(state)) {
      res = consume_one_frame(state, decoded_frame);

      if (AMQP_STATUS_OK != res) {
        return res;
      }

      if (AMQP_FRAME_HEARTBEAT == decoded_frame->frame_type) {
        amqp_maybe_release_buffers_on_channel(state, 0);
        continue;
      }

      if (decoded_frame->frame_type != 0) {
        /* Complete frame was read. Return it. */
        return AMQP_STATUS_OK;
      }
    }

beginrecv:
    res = amqp_time_has_past(state->next_send_heartbeat);
    if (AMQP_STATUS_TIMER_FAILURE == res) {
      return res;
    } else if (AMQP_STATUS_TIMEOUT == res) {
      amqp_frame_t heartbeat;
      heartbeat.channel = 0;
      heartbeat.frame_type = AMQP_FRAME_HEARTBEAT;

      res = amqp_send_frame(state, &heartbeat);
      if (AMQP_STATUS_OK != res) {
        return res;
      }
    }
    deadline = amqp_time_first(timeout_deadline,
                               amqp_time_first(state->next_recv_heartbeat,
                                               state->next_send_heartbeat));

    /* TODO this needs to wait for a _frame_ and not anything written from the
     * socket */
    res = recv_with_timeout(state, deadline);

    if (AMQP_STATUS_TIMEOUT == res) {
      if (amqp_time_equal(deadline, state->next_recv_heartbeat)) {
        amqp_socket_close(state->socket);
        return AMQP_STATUS_HEARTBEAT_TIMEOUT;
      } else if (amqp_time_equal(deadline, timeout_deadline)) {
        return AMQP_STATUS_TIMEOUT;
      } else if (amqp_time_equal(deadline, state->next_send_heartbeat)) {
        /* send heartbeat happens before we do recv_with_timeout */
        goto beginrecv;
      } else {
        amqp_abort("Internal error: unable to determine timeout reason");
      }
    } else if (AMQP_STATUS_OK != res) {
      return res;
    }
  }
}

 

阻塞发生在函数res = recv_with_timeout(state, deadline);

使用wireshark抓包分析,发现broker给producer的响应较慢

 

原因:

该测试的broker使用了一台,没有主备,所以在/etc/hosts下没有配置IP和域名的对应关系。因此导致producer调用api登陆broker有时候比较耗时。

 

参考broker上IP和hostname配置说明:

http://www.rabbitmq.com/clustering.html

http://docs.celeryproject.org/en/latest/getting-started/brokers/rabbitmq.html

© 著作权归作者所有

共有 人打赏支持
andrew810810
粉丝 3
博文 141
码字总数 117648
作品 0
朝阳
用 PHP 收发 RabbitMQ 消息

AMQP 扩展的安装参照《给 PHP 安装 amqp 扩展》 消费者:接收消息 逻辑: 创建连接 --> 创建 channel--> 创建交换机 --> 创建队列 --> 绑定交换机 / 队列 / 路由键 --> 接收 消息 <?php /* *...

mac_zhao
2014/09/26
0
0
【原创】RabbitMQ 之 no_ack 分析

熟悉 RabbitMQ 的人肯定知道 noack 属性是在调用 Basic.Consume 方法时可以设置的一个重要参数。本文主要针对 noack 设置的两种情况,通过抓包分析的形式讲解下实际应用中的异同,并总结一下...

摩云飞
2013/07/10
0
0
【原创】rabbitmq-c源码分析之amqp_socket.c

走读 amqp_socket.c 源码,发现若干值得注意的细节: 【amqpopensocket 】 在 amqpopensocket 函数中通过 getaddrinfo 函数进行域名解析可能会产生阻塞。其中参数指定了 struct addrinfo hi...

摩云飞
2013/01/25
0
1
php操作rabbitmq教程

1: 连接rabbitmq 新建exchange和queue amqp_manager.php <?php $connargs = array('host' => 'localhost', 'port' => '5672', 'login' => 'guest', 'password' => 'guest'); $conn = new AMQ......

tuerqidi
2015/10/12
774
0
RabbitMQ

RabbitMQ是流行的开源消息队列系统,用erlang语言开发。RabbitMQ是AMQP(高级消息队列协议)的标准实现。如果不熟悉AMQP,直接看RabbitMQ的文档会比较困难。不过它也只有几个关键概念,这里简...

souldepth
2016/07/04
28
0
保持Qt程序中GUI的响应流畅

如何使Qt 平台中的GUI保持响应流畅?一般来说耗时较长的操作,分为计算密集型操作和IO密集型操作,对于这两类操作如何提高响应速度。 而从操作的本质上来说,操作又可分为不可分解操作,如在...

水海云
2012/03/24
0
0
PHP 的 AMQP 无法往队列里写消息

'localhost', 'port' => '5672', 'vhost' => '/', 'login' => 'guest', 'password' => 'guest']); $connectionO->connect(); $channelO = new AMQPChan......

Titaniums
2013/07/21
1K
5
spring rabbitmq 配置文件简单介绍

rabbitmq 一个java 开源的消息中间件,可以用来对应用之间的调用解耦,比如说,我要对登陆事件进行多种操作(记录日志、更新某些信息)。这些应用依赖登陆事件,但登陆本身并不对这些应用有依...

巡山
2016/07/12
784
0
rabbitmq channel

Connection 连接,与rabbitmq server建立的一个连接,由ConnectionFactory创建,虽然创建时指定 了多个server address,但每个connection只与一个物理的server进行连接,此连接是基于Socket进...

cjun1990
2014/12/19
0
0
php---ubuntu下使用RabbitMQ

RabbitMQ是一个开源的基于AMQP(Advanced Message Queuing Protocol)标准,并且可靠性高的企业级消息系统,目前很多网站在用,包括reddit,Poppen.de等。 1. Ubuntu下安装RabbitMQ sudo apt...

durban
2012/03/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

idea tomcat 远程调试

tomcat 配置 编辑文件${tomcat_home}/bin/catalina.sh,在文件开头添加如下代码。    CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7829" Idea端配......

qwfys
今天
1
0
遍历目录下的文件每250M打包一个文件

#!/usr/bin/env python # -*- utf-8 -*- # @Time : 2018/7/20 0020 下午 10:16 # @Author : 陈元 # @Email : abcmeabc@163.com # @file : tarFile.py import os import tarfile import thr......

寻爱的小草
今天
1
0
expect同步文件&expect指定host和要同步的文件&构建文件分发系统&批量远程执行命令

20.31 expect脚本同步文件 expect通过与rsync结合,可以在一台机器上把文件自动同步到多台机器上 编写脚本 [root@linux-5 ~]# cd /usr/local/sbin[root@linux-5 sbin]# vim 4.expect#!/...

影夜Linux
今天
1
0
SpringBoot | 第九章:Mybatis-plus的集成和使用

前言 本章节开始介绍数据访问方面的相关知识点。对于后端开发者而言,和数据库打交道是每天都在进行的,所以一个好用的ORM框架是很有必要的。目前,绝大部分公司都选择MyBatis框架作为底层数...

oKong
今天
13
0
win10 上安装解压版mysql

1.效果 2. 下载MySQL 压缩版 下载地址: https://downloads.mysql.com/archives/community/ 3. 配置 3.1 将下载的文件解压到合适的位置 我最终将myql文件 放在:D:\develop\mysql 最终放的位...

Lucky_Me
今天
2
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

问题终结者
今天
2
0
expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 vim 4.expect [root@yong-01 sbin]# vim 4.expect#!/usr/bin/expectset passwd "20655739"spawn rsync -av ro...

lyy549745
今天
1
0
36.rsync下 日志 screen

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 10.32/10.33 rsync通过服务同步: rsync还可以通过服务的方式同步。那需要开启一个服务,他的架构是cs架构,客户端服务...

王鑫linux
今天
1
0
matplotlib 保存图片时的参数

简单绘图 import matplotlib.pyplot as pltplt.plot(range(10)) 保存为csv格式,放大后依然很清晰 plt.savefig('t1.svg') 普通保存放大后会有点模糊文件大小20多k plt.savefig('t5.p...

阿豪boy
今天
3
0
java 8 复合Lambda 表达式

comparator 比较器复合 //排序Comparator.comparing(Apple::getWeight);List<Apple> list = Stream.of(new Apple(1, "a"), new Apple(2, "b"), new Apple(3, "c")) .collect(......

Canaan_
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部