|
|
|
@ -33,6 +33,7 @@ using namespace std;
|
|
|
|
|
#include <srs_app_utility.hpp>
|
|
|
|
|
#include <srs_kernel_utility.hpp>
|
|
|
|
|
#include <srs_kernel_balance.hpp>
|
|
|
|
|
#include <srs_kafka_stack.hpp>
|
|
|
|
|
|
|
|
|
|
#ifdef SRS_AUTO_KAFKA
|
|
|
|
|
|
|
|
|
@ -40,12 +41,16 @@ SrsKafkaProducer::SrsKafkaProducer()
|
|
|
|
|
{
|
|
|
|
|
lb = new SrsLbRoundRobin();
|
|
|
|
|
worker = new SrsAsyncCallWorker();
|
|
|
|
|
transport = new SrsTcpClient();
|
|
|
|
|
kafka = new SrsKafkaClient(transport);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SrsKafkaProducer::~SrsKafkaProducer()
|
|
|
|
|
{
|
|
|
|
|
srs_freep(lb);
|
|
|
|
|
srs_freep(worker);
|
|
|
|
|
srs_freep(kafka);
|
|
|
|
|
srs_freep(transport);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int SrsKafkaProducer::initialize()
|
|
|
|
@ -86,25 +91,46 @@ int SrsKafkaProducer::request_metadata()
|
|
|
|
|
{
|
|
|
|
|
int ret = ERROR_SUCCESS;
|
|
|
|
|
|
|
|
|
|
// ignore when disabled.
|
|
|
|
|
bool enabled = _srs_config->get_kafka_enabled();
|
|
|
|
|
if (!enabled) {
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// select one broker to connect to.
|
|
|
|
|
SrsConfDirective* brokers = _srs_config->get_kafka_brokers();
|
|
|
|
|
if (!brokers) {
|
|
|
|
|
srs_warn("ignore for empty brokers.");
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
srs_assert(!brokers->args.empty());
|
|
|
|
|
std::string broker = lb->select(brokers->args);
|
|
|
|
|
std::string server;
|
|
|
|
|
int port = SRS_CONSTS_KAFKA_DEFAULT_PORT;
|
|
|
|
|
if (true) {
|
|
|
|
|
srs_assert(!brokers->args.empty());
|
|
|
|
|
std::string broker = lb->select(brokers->args);
|
|
|
|
|
srs_parse_endpoint(broker, server, port);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// connect to kafka server.
|
|
|
|
|
if ((ret = transport->connect(server, port, SRS_CONSTS_KAFKA_TIMEOUT_US)) != ERROR_SUCCESS) {
|
|
|
|
|
srs_error("kafka connect %s:%d failed. ret=%d", server.c_str(), port, ret);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// do fetch medata from broker.
|
|
|
|
|
std::string topic = _srs_config->get_kafka_topic();
|
|
|
|
|
if ((ret = kafka->fetch_metadata(topic)) != ERROR_SUCCESS) {
|
|
|
|
|
srs_error("kafka fetch metadata failed. ret=%d", ret);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// log when completed.
|
|
|
|
|
if (true) {
|
|
|
|
|
std::string senabled = srs_bool2switch(enabled);
|
|
|
|
|
std::string sbrokers = srs_join_vector_string(brokers->args, ",");
|
|
|
|
|
srs_trace("kafka ok, enabled:%s, brokers:%s, current:[%d]%s",
|
|
|
|
|
senabled.c_str(), sbrokers.c_str(), lb->current(), broker.c_str());
|
|
|
|
|
srs_trace("kafka ok, enabled:%s, brokers:%s, current:[%d]%s:%d, topic:%s",
|
|
|
|
|
senabled.c_str(), sbrokers.c_str(), lb->current(), server.c_str(), port, topic.c_str());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|