/**
  * 从meta中获取可订阅的broker group
  * @return sub_info on success or false on failure
  */
 public function get_sub_broker_group($pipe_name, $pipelet_id, $start_point)
 {
     if (false === $this->_inited) {
         BigpipeLog::warning("[%s:%u][%s][call uninited object]", __FILE__, __LINE__, __FUNCTION__);
         return false;
     }
     if (empty($this->meta_name)) {
         // 缺少关键条件
         BigpipeLog::warning("[%s:%u][%s][missing meta name]", __FILE__, __LINE__, __FUNCTION__);
         return false;
     }
     // pack reqestion
     $cmd = new GetSubInfoFrame();
     $cmd->meta_name = $this->meta_name;
     $cmd->pipe_name = $pipe_name;
     $cmd->pipelet_id = $pipelet_id + 1;
     // 用于组成pipelet name
     $cmd->start_point = $start_point;
     // send
     $res_body = $this->_request($cmd);
     if (null === $res_body) {
         BigpipeLog::warning("[%s:%u][%s][fail to get sub info][meta:%s][pipe_name:%s][pipelet_id:%d][start_point:%d]", __FILE__, __LINE__, __FUNCTION__, $this->meta_name, $pipe_name, $pipelet_id, $start_point);
         return false;
     }
     // parse ack
     $ack = new GetSubInfoAckFrame();
     if (!$ack->load($res_body)) {
         BigpipeLog::warning("[%s:%u][%s][error ack]", __FILE__, __LINE__, __FUNCTION__);
         return false;
     }
     $broker_group = json_decode($ack->broker_group);
     $sub_info = array('stripe_name' => $ack->stripe_name, 'stripe_id' => $ack->stripe_id, 'begin_pos' => $ack->begin_pos, 'end_pos' => $ack->end_pos, 'broker_group' => $broker_group);
     return $sub_info;
 }