Если ваше приложение также работает в OpenShift, запустите oc get svc
, чтобы найти имена каждого брокера. Обратите внимание, что эти имена доступны только внутри кластера OpenShift.
Например, если oc get svc
возвращает:
> oc get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-cluster-kafka-0 ClusterIP 172.30.210.241 9094/TCP 109d
my-cluster-kafka-1 ClusterIP 172.30.39.25 9094/TCP 109d
my-cluster-kafka-2 ClusterIP 172.30.93.193 9094/TCP 109d
, вы можете получить доступ к kafka-0
с помощью my-cluster-kafka-0
или my-cluster-kafka-0.
Если ваше приложение работает за пределами OpenShift, пожалуйста, настройте стримзи внешних слушателей . Среди трех вариантов настройки внешних слушателей , NodePort
может быть проще, если вы запускаете локальный OKD.
Вот некоторый код, который может быть полезен.
<?
define('WANT_PROCESSORS', 5);
define('PROCESSOR_EXECUTABLE', '/path/to/your/processor');
set_time_limit(0);
$cycles = 0;
$run = true;
$reload = false;
declare(ticks = 30);
function signal_handler($signal) {
switch($signal) {
case SIGTERM :
global $run;
$run = false;
break;
case SIGHUP :
global $reload;
$reload = true;
break;
}
}
pcntl_signal(SIGTERM, 'signal_handler');
pcntl_signal(SIGHUP, 'signal_handler');
function spawn_processor() {
$pid = pcntl_fork();
if($pid) {
global $processors;
$processors[] = $pid;
} else {
if(posix_setsid() == -1)
die("Forked process could not detach from terminal\n");
fclose(stdin);
fclose(stdout);
fclose(stderr);
pcntl_exec(PROCESSOR_EXECUTABLE);
die('Failed to fork ' . PROCESSOR_EXECUTABLE . "\n");
}
}
function spawn_processors() {
global $processors;
if($processors)
kill_processors();
$processors = array();
for($ix = 0; $ix < WANT_PROCESSORS; $ix++)
spawn_processor();
}
function kill_processors() {
global $processors;
foreach($processors as $processor)
posix_kill($processor, SIGTERM);
foreach($processors as $processor)
pcntl_waitpid($processor);
unset($processors);
}
function check_processors() {
global $processors;
$valid = array();
foreach($processors as $processor) {
pcntl_waitpid($processor, $status, WNOHANG);
if(posix_getsid($processor))
$valid[] = $processor;
}
$processors = $valid;
if(count($processors) > WANT_PROCESSORS) {
for($ix = count($processors) - 1; $ix >= WANT_PROCESSORS; $ix--)
posix_kill($processors[$ix], SIGTERM);
for($ix = count($processors) - 1; $ix >= WANT_PROCESSORS; $ix--)
pcntl_waitpid($processors[$ix]);
} elseif(count($processors) < WANT_PROCESSORS) {
for($ix = count($processors); $ix < WANT_PROCESSORS; $ix++)
spawn_processor();
}
}
spawn_processors();
while($run) {
$cycles++;
if($reload) {
$reload = false;
kill_processors();
spawn_processors();
} else {
check_processors();
}
usleep(150000);
}
kill_processors();
pcntl_wait();
?>
Похоже, у вас уже есть MQ, работающий в системе * nix, и вы просто хотите управлять работниками
Очень простой способ сделать это - использовать экран GNU. Чтобы запустить 10 рабочих, вы можете использовать:
#!/bin/sh
for x in `seq 1 10` ; do
screen -dmS worker_$x php /path/to/script.php worker$x
end
Это запустит 10 рабочих в фоновом режиме, используя экраны с именем worker_1,2,3 и т. Д.
Вы можете присоединиться к экранам, выполнив screen -r worker_ и составить список запущенных работники с помощью screen -list.
Для получения дополнительной информации это руководство может быть полезным: http://www.kuro5hin.org/story/2004/3/9/16838/14935
Также попробуйте:
Для производственных серверов я бы обычно рекомендовал использовать обычные сценарии запуска системы, но я годами запускал экранные команды из сценариев запуска без проблем.
Вам действительно нужно, чтобы он непрерывно работал?
Если вы хотите создавать новый процесс только по запросу, вы можете зарегистрировать его как службу в xinetd.