文档章节

amqp_login 有时会耗时较长时间

andrew810810
 andrew810810
发布于 2016/07/12 17:26
字数 320
阅读 129
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

移动端Appium自动化测试框架的优势

众所周知,现在市面上的移动端操作系统已被Android和IOS占领,其中Android的份额更是在80%以上。那么面对市面上林林总总的自动化测试框架和工具,为什么说Appium在自动化测试框架的统治级优势...

程序猿拿Q
4分钟前
0
0
设计模式 之 观察者模式

设计模式 之 观察者模式 场景 场景比较简单,当一个对象的状态发生改变时,自动通知所有依赖(或观察)它的对象。 比如:发布/订阅 原理:发布者存储N个订阅者的对象信息,当发布者发布消息时...

GMarshal
8分钟前
0
0
linux 常用

netstat -tunlp |grep 8080 查看8080 占用 netstat -tunlp 用于查看所有的端口号的进程情况

west_coast
12分钟前
1
0
Bytom信息上链教程

比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 很多了解比原链的都知道,比原链是专注信息和数字资产在链上交互和流转的...

比原链Bytom
18分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部