Estou no início de um projeto que envolve a leitura de vários sensores e a fusão dos dados desses sensores. Ao todo, haverá 4 sensores conectados via USB e uma webcam, também conectados via USB.
Um de meus colegas é muito sincero sobre como é bom dividir programas em partes menores e fazer com que eles se comuniquem pela rede. Ele sugere que devemos ter um executável para cada sensor (ou câmera) e, em seguida, um aplicativo de controle central que se comunique com os outros.
Eu intuitivamente não gosto dessa idéia. O colega em questão trabalhou em outro projeto que usava essa abordagem e não tinha problemas com problemas difíceis de rastrear e depurar.
Não parece um projeto muito estatal e me parece um tanto deselegante. Gostaria de escrever uma biblioteca para lidar com cada sensor e talvez executá-los em threads separados.
Também deve ser salientado que os cálculos que precisamos fazer fornecerão atualizações para outro sistema a quase 1000Hz. Adicionar uma camada de comunicação de rede parece adicionar um gargalo em potencial.
Eu estaria interessado em ouvir as opiniões de outras pessoas sobre isso e talvez algumas referências sobre esse tipo de prática.
Respostas:
Bem, intuitivamente, gosto da ideia de dividir programas em partes menores. Mas se os diferentes processos executam sempre todos na mesma máquina, a comunicação em rede provavelmente não é a forma ideal de IPC. Para comunicação de alta velocidade entre processos, a memória compartilhada pode ser a melhor opção. Seja qual for a abordagem escolhida, você deve medir ou pelo menos estimar o desempenho antes de fazer qualquer julgamento.
Você precisa verificar que tipo de problemas e onde estão as causas principais. Se eles tiveram problemas devido à concorrência, você encontrará os mesmos problemas (se não mais) ao tentar uma solução multiencadeada.
Se isso é "alta velocidade", depende da velocidade das máquinas de produção e do tamanho da operação envolvida em cada atualização. No que diz respeito ao desempenho, os sentimentos intestinais não são confiáveis, você precisa medir as coisas . Se o seu colega acredita que sua abordagem será rápida o suficiente, e você acredita que não, pelo menos um de vocês terá que provar ou falsificar a crença dele. Por exemplo, um de vocês pode implementar um pequeno protótipo para simular a comunicação entre processos e medir a velocidade. Todo o resto está olhando para uma tigela de vidro.
fonte
Eles podem ou não ser relevantes para a sua aplicação, mas alguns benefícios para a solução de multiprocessos que você ainda não considerou são:
Desvantagens adicionais para a solução de múltiplos processos:
fonte
A abordagem que seu colega está defendendo é frequentemente chamada de arquitetura de microsserviços e está em voga nos dias de hoje. Tem várias vantagens em potencial :
Ele também tem várias desvantagens:
Não sei bem o que você quer dizer quando diz que o design "não parece um design muito moderno". Geralmente "state-ful" é considerado uma característica ruim de um design e microsserviços "sem estado" são considerados um bom design.
Porém, considerando as informações sobre seus requisitos que você fornece em sua postagem, acho que um design baseado em microsserviços seria um exagero para o seu caso de uso e os benefícios não justificariam a complexidade adicional. Os benefícios das arquiteturas de microsserviços tendem a realmente entrar em jogo ao criar serviços da Web em maior escala que valorizam a escalabilidade, robustez e extensibilidade.
Os benefícios potenciais de uma arquitetura de microsserviços são realizados apenas com um design bem pensado. Na minha opinião, essa arquitetura requer um design mais inicial (principalmente quando se trata do protocolo de comunicação entre microsserviços) do que um único design de processo para que seja bem-sucedido na solução do problema em questão.
fonte