Existe uma maneira "agradável" de lidar com multicasts de remontagem de várias fontes?

StackOverflow https://stackoverflow.com/questions/346650

Pergunta

Atualmente, estou reformulando nosso código de invólucro de soquete proprietário existente para usar o Boost ASIO, para que ele possa fazer parte do trabalho pesado para nós. Talvez a área mais complexa do nosso código existente seja o código de manuseio multicast. O código permite que nossos servidores de camada média (dos quais eu pode me muitos em um sistema) enviar multicasts para caixas de clientes, que as usam para apresentar atualizações aos usuários do sistema.

O motivo pelo qual o código é complexo e propenso a erros é que ele usa vários buffers brutos para remontar os fluxos multicast de acordo com de onde vieram. Parece que, mesmo com o Boost.asio, terei que lidar com esse mesmo problema; portanto, antes de ficar preso, pensei que valeria a pena perguntar como outras pessoas lidaram com essa situação.

Parece um caso de uso muito comum. Existe algo por aí que possa me ajudar a fazer esse trabalho sem o tipo de código que tenho agora? Ou existe um modelo C ++ estabelecido (Boost ou não) que possa fazer esse tipo de trabalho?

Obviamente, eu poderia facilitar as coisas e usar contêineres STL para amortecer os pacotes em vez de matrizes brutas, mas esse código precisa ser realmente alto desempenho. Em grandes instalações, há um grande número de pacotes voando e precisa responder o mais próximo possível do tempo real.

Agradecemos antecipadamente por qualquer pensamento sobre esse assunto.

Jamie

Foi útil?

Solução

Não parece que você tenha fornecido informações suficientes para respostas detalhadas, mas existem algumas dicas gerais a serem consideradas para o manuseio em tempo real de dados multicast.

  • Se você estiver usando o Multicast UDP bruto, provavelmente está fazendo algum tipo de seqüenciamento de protocolo no espaço do usuário para lidar com pacotes perdidos ou duplicados. Quaisquer otimizações que você queira fazer, resistir a tentação Para quebrar a camada entre seu aplicativo e sua camada de protocolo.
  • std::vector, para a maioria dos propósitos, é idêntico a um tampão de caractere alocado dinamicamente. Não evite usá -lo apenas porque é uma camada de abstração. Existem dois casos em que você deve evitá -lo, no entanto:
    • Se você pode se safar com buffers alocados estaticamente
    • Se você precisar transferir a propriedade do buffer a jusante (embora se você projetar cuidadosamente, swap() pode ser suficiente)
  • Pré -realocação é seu amigo. Se você puder ter um conjunto de buffers disponíveis para uso quando os dados entrarem, poderá remover a alocação mais dinâmica do caminho rápido da execução.
  • Minimizar cópias de memória. Se você pode processar dados em uma única pilha de chamadas, terá a chance de evitar cópias. Se você precisar passar dados para um encadeamento diferente, poderá ser forçado a copiar dados.
  • Se o seu aplicativo puder lidar writev e readv.

Não acredito que nenhuma solução enlatada resolva seus problemas. Boost Asio, libevent, etc., todos lidarão com as abstrações de soquete para você, mas o que você faz com seus dados ainda é de sua responsabilidade, uma vez entregue.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top