%PDF- %PDF-
| Direktori : /www/varak.net/wiki.varak.net/vendor/nmred/kafka-php/src/Kafka/ |
| Current File : /www/varak.net/wiki.varak.net/vendor/nmred/kafka-php/src/Kafka/MetaDataFromKafka.php |
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
// +---------------------------------------------------------------------------
// | SWAN [ $_SWANBR_SLOGAN_$ ]
// +---------------------------------------------------------------------------
// | Copyright $_SWANBR_COPYRIGHT_$
// +---------------------------------------------------------------------------
// | Version $_SWANBR_VERSION_$
// +---------------------------------------------------------------------------
// | Licensed ( $_SWANBR_LICENSED_URL_$ )
// +---------------------------------------------------------------------------
// | $_SWANBR_WEB_DOMAIN_$
// +---------------------------------------------------------------------------
namespace Kafka;
/**
+------------------------------------------------------------------------------
* Cluster metadata provided by kafka
+------------------------------------------------------------------------------
*
* @package
* @version $_SWANBR_VERSION_$
* @copyright Copyleft
* @author ebernhardson@wikimedia.org
+------------------------------------------------------------------------------
*/
class MetaDataFromKafka implements ClusterMetaData
{
// {{{ consts
// }}}
// {{{ members
/**
* client
*
* @var \Kafka\Client
* @access private
*/
private $client;
/**
* list of kafka brokers to get metadata from
*
* @var array
* @access private
*/
private $hostList;
/**
* List of all kafka brokers
*
* @var array
* @access private
*/
private $brokers = array();
/**
* List of all loaded topic metadata
*
* @var array
* @access private
*/
private $topics = array();
// }}}
// {{{ functions
// {{{ public function __construct()
/**
* @var string|array $hostList List of kafka brokers to get metadata from
* @access public
*/
public function __construct($hostList)
{
if (is_string($hostList)) { // support host list 127.0.0.1:9092,192.168.2.11:9092 form
$this->hostList = explode(',', $hostList);
} else {
$this->hostList = (array)$hostList;
}
// randomize the order of servers we collect metadata from
shuffle($this->hostList);
}
// }}}
// {{{ public function setClient()
/**
* @var \Kafka\Client $client
* @access public
* @return void
*/
public function setClient(\Kafka\Client $client)
{
$this->client = $client;
}
// }}}
// {{{ public function listBrokers()
/**
* get broker list from kafka metadata
*
* @access public
* @return array
*/
public function listBrokers()
{
if ($this->brokers === null) {
$this->loadBrokers();
}
return $this->brokers;
}
// }}}
// {{{ public function getPartitionState()
/**
* @param string $topicName
* @param int $partitionId
* @return null
*/
public function getPartitionState($topicName, $partitionId = 0)
{
if (!isset( $this->topics[$topicName] ) ) {
$this->loadTopicDetail(array($topicName));
}
if ( isset( $this->topics[$topicName]['partitions'][$partitionId] ) ) {
return $this->topics[$topicName]['partitions'][$partitionId];
} else {
return null;
}
}
// }}}
// {{{ public function getTopicDetail()
/**
*
* @param string $topicName
* @access public
* @return array
*/
public function getTopicDetail($topicName)
{
if (!isset( $this->topics[$topicName] ) ) {
$this->loadTopicDetail(array($topicName));
}
if (isset( $this->topics[$topicName] ) ) {
return $this->topics[$topicName];
} else {
return array();
}
}
// }}}
// {{{ private function loadBrokers()
private function loadBrokers()
{
$this->brokers = array();
// not sure how to ask for only the brokers without a topic...
// just ask for a topic we don't care about
$this->loadTopicDetail(array('test'));
}
// }}}
// {{{ private function loadTopicDetail()
/**
* @param array $topics
*/
private function loadTopicDetail(array $topics)
{
if ($this->client === null) {
throw new \Kafka\Exception('client was not provided');
}
$response = null;
foreach ($this->hostList as $host) {
try {
$response = null;
$stream = $this->client->getStream($host);
$conn = $stream['stream'];
$encoder = new \Kafka\Protocol\Encoder($conn);
$encoder->metadataRequest($topics);
$decoder = new \Kafka\Protocol\Decoder($conn);
$response = $decoder->metadataResponse();
$this->client->freeStream($stream['key']);
break;
} catch (\Kafka\Exception $e) {
// keep trying
}
}
if ($response) {
// Merge arrays using "+" operator to preserve key (which are broker IDs)
// instead of array_merge (which reindex numeric keys)
$this->brokers = $response['brokers'] + $this->brokers;
$this->topics = array_merge($response['topics'], $this->topics);
} else {
throw new \Kafka\Exception('Could not connect to any kafka brokers');
}
}
// }}}
// }}}
}