文档章节

amqp_login 有时会耗时较长时间

andrew810810
 andrew810810
发布于 2016/07/12 17:26
字数 320
阅读 416
收藏 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
博文 142
码字总数 118091
作品 0
朝阳
私信 提问
加载中

评论(0)

用 PHP 收发 RabbitMQ 消息

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

mac_zhao
2014/09/26
22
0
phpamqp消息队列教程-代码实现实例

逻辑: 创建连接-->创建channel-->创建交换机-->创建队列-->绑定交换机/队列/路由键-->接收消息 生产者: $conn_args = array( 'host' => '127.0.0.1', 'port' => '5672', 'login' => 'gedai......

osc_hxycq6oq
2019/10/22
2
0
Django 学习之Celery(芹菜)

Celery 介绍 文档:http://docs.celeryproject.org/en/latest/index.html Celery 是一个功能完备,即插即用的异步任务队列,可以独立于主进程运行,在主进程退出后,也不影响队列中的任务的执...

osc_gepa6v61
2019/01/03
3
0
SSM-网站前台博客系统制作(2)---完善版Google的Kaptcha

  前提:     在上一篇文章中,可以加入基本的验证码,但是很呆板,验证码也无法传输到Controller进行处理,然后现在改正了一下,可以刷新验证码,然后和登录名,密码一起提交过去, ...

osc_ertc0ko2
2019/01/23
1
0
【原创】RabbitMQ 之 no_ack 分析

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

摩云飞
2013/07/10
8.5K
0

没有更多内容

加载失败,请刷新页面

加载更多

RestTemplate调用Https接口

本文简单示例 Java 实例化一个可调用 https 请求的 RestTemplate: public static RestTemplate getRestTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementExce......

osc_91g5cdgs
35分钟前
25
0
我们为什么推荐在Json中使用string表示Number属性值?

原文: 我们为什么推荐在Json中使用string表示Number属性值? 在这篇简短的文章中,我将解释在使用JSON传输数据时,为什么浮点数或大十进制值应表示为字符串 。 long类型引发的诡异情况 长话短...

osc_rki151ee
36分钟前
16
0
如何使用 Istio 进行多集群部署管理:多控制平面

作者 | 王夕宁 阿里云高级技术专家 导读:本文摘自于阿里云高级技术专家王夕宁撰写的《Istio 服务网格技术解析与实战》一书,讲述了如何使用 Istio 进行多集群部署管理来阐述服务网格对多云环...

osc_n3mzii7x
37分钟前
25
0
DHCP中继实验练习

DHCP中继 实验环境 需求分析 了解DHCP中继的作用 给某个PC分配固定的ip地址 统一从路由器R3上面获取ip地址减少路由器R1上面的负载 实验步骤 一、在交换机SW1上面配置信息 1、创建vlan 10 20 ...

osc_eijjkem1
38分钟前
38
0
Amadeus Pro for mac(音频编辑器)

Amadeus Pro for Mac是应用在Mac上的多轨音频编辑软件,通过标记的广泛支持,进一步促进了大声音的处理。其出色的声音修复和去噪能力使得Amadeus Pro for Mac特别适合于在CD上传输唱片。 Am...

osc_n1x6m26g
38分钟前
39
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部