文档章节

amqp_login 有时会耗时较长时间

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

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 识别慢性能的宏

Page Profiling 给你了有关页面在载入的时候操作缓慢的邪教,你可以将下面的内容添加到调试(debug)级别: Version 3.1 及其后续版本 设置包名字为 com.atlassian.renderer.v2.components.M...

honeymose
10分钟前
0
0
day93-20180920-英语流利阅读-待学习

时尚之觞:外表光鲜靓丽,其实穷得要命 Lala 2018-09-20 1.今日导读 讲到时尚界,我们脑海里浮现的可能都是模特和设计师光鲜靓丽、从容潇洒的模样。可是,最近在法国出版的一本书却颠覆了我们...

飞鱼说编程
25分钟前
0
0
maven的pom.xml用解决版本问题

maven管理库依赖,有个好处就是连同库的依赖的全部jar文件一起下载,免去手工添加的麻烦,但同时也带来了同一个jar会被下载了不同版本的问题,好在pom的配置里面允许用<exclusion>来排除一些...

JAVA码猿
49分钟前
1
0
20180920 rzsz传输文件、用户和用户组相关配置文件与管理

利用rz、sz实现Linux与Windows互传文件 [root@centos01 ~]# yum install -y lrzsz # 安装工具sz test.txt # 弹出对话框,传递到选择的路径下rz # 回车后,会从对话框中选择对应的文件传递...

野雪球
今天
2
0
OSChina 周四乱弹 —— 毒蛇当辣条

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 达尔文:分享花澤香菜/前野智昭/小野大輔/井上喜久子的单曲《ミッション! 健?康?第?イチ》 《ミッション! 健?康?第?イチ》- 花澤香菜/前野智...

小小编辑
今天
40
10

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部