amqp_login 有时会耗时较长时间
amqp_login 有时会耗时较长时间
andrew810810 发表于1年前
amqp_login 有时会耗时较长时间
  • 发表于 1年前
  • 阅读 95
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: amqp_login

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

标签: amqp_login
共有 人打赏支持
粉丝 4
博文 127
码字总数 117648
×
andrew810810
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: