Pergunta

Tenho 1 processo que recebe conexão de entrada da porta 1000 em 1 linux servidor.No entanto, um processo não é rápido o suficiente para lidar com todas as solicitações recebidas.

Quero executar vários processos no servidor, mas com 1 ponto final.Desta forma, o cliente verá apenas 1 endpoint/processo e não vários.

Eu verifiquei o LVS e outras soluções de balanceamento de carga.Essas soluções parecem voltadas para o balanceamento de carga de vários servidores.

Alguma outra solução para ajudar no meu caso?


estou procurando algo mais parecido com o nginx, onde precisarei executar várias cópias do meu aplicativo.

Deixe-me tentar isso.

Obrigado pela ajuda.

Foi útil?

Solução

Você também pode querer usar um servidor web como nginx.Ele pode balancear a carga do seu aplicativo em várias portas do mesmo aplicativo e é comumente usado para balancear a carga de aplicativos Ruby on Rails (que são de thread único).A desvantagem é que você precisa executar várias cópias do seu aplicativo (uma em cada porta) para que esse balanceamento de carga funcione.

Outras dicas

A questão não está clara para mim, mas suspeito que a resposta que você está procurando é ter um único processo aceitando tarefas da rede e, em seguida, bifurcando 'processos de trabalho' para realmente executar o trabalho (antes de retornar o resultado para o do utilizador).

Dessa forma, o trabalho que está sendo realizado não impede a aceitação de mais solicitações.

Como você destacou, o termo balanceamento de carga implica vários servidores - o que você deseja procurar são informações sobre como escrever um daemon de rede Linux.

As duas chamadas de sistema kes que você deseja ver são chamadas garfo e executivo.

Parece que você só precisa integrar seu servidor com xinetd.

Este é um servidor que escuta portas predefinidas (que você controla por meio de configuração) e bifurca processos para lidar com a comunicação real nessa porta.

Você precisa de multiprocessamento ou multithreading.Você não é específico sobre os detalhes do servidor, então não posso lhe dar conselhos sobre o que fazer exatamente.fork e exec como Matt sugeriu pode ser uma solução, mas na verdade:de que tipo de protocolo/servidor estamos falando?

estou pensando em executar vários aplicativos semelhantes a ypop.

O nginx é ótimo, mas se você não gosta de um servidor web totalmente novo, o apache 2.2 com mod proxy balancer fará o mesmo trabalho

Talvez você possa modificar seu cliente para portas round-robin (digamos) 1000-1009 e executar 10 cópias do processo?

Alternativamente, deve haver alguma maneira de refatorá-lo internamente.

É possível que vários processos escutem o mesmo soquete ao mesmo tempo, abrindo-o antes de chamar fork(), mas (se for um soquete TCP) uma vez que accept() é chamado, o soquete resultante pertence ao processo que aceitou a conexão com sucesso.

Então, essencialmente, você poderia usar:

  • Pré-fork, onde você abre o soquete, bifurca um número específico de filhos que então compartilham a carga
  • Pós-fork, onde você tem um processo mestre que aceita todas as conexões e bifurca os filhos para lidar com soquetes individuais
  • Threads - você pode compartilhar os soquetes da maneira que quiser com eles, já que os descritores de arquivo não são clonados, eles estão apenas disponíveis para qualquer thread.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top