Tweets de roteiro de Crate Docs
portunusd é um servidor de aplicativos de rede inspirado no relayd do OpenBSD e na herança UNIX inetd . Ele ouve uma conexão de rede recebida, encaminhando os dados recebidos sobre uma porta Illumos para o aplicativo pretendido e retornando a resposta de maneira semelhante. portunusd mapeia cada porta conectada a uma porta no sistema de arquivos fornecido pelo aplicativo de destino.
Sequenciadoiagram
cliente participante
Participante Portunusd
porta do participante
Aplicação do participante
APLICAÇÃO->> PORTA: CREATE /VAR/RUN/App.door
PORTUNUSD->> PORTA: Aberto
Portunusd->> Portunusd: Ouça na porta 80
Solicitações de manuseio de loop
Cliente->>+Portunusd: Enviar solicitação HTTP
PORTUNUSD->>+APLICAÇÃO: Solicitação de encaminhamento via Door_Call
APLICAÇÃO->>-Portunusd: Envie a resposta via Door_RETURN
Portunusd->>-Cliente: Envie a resposta HTTP
fim
O principal objetivo do portunusd é facilitar a escala de aplicativos de thread único. Sob o modelo inetd , um novo processo é criado para lidar com todas as solicitações. Ao alavancar as portas, portunusd pode criar um novo thread no processo de aplicação somente quando uma nova marca de concorrência highwater foi atingida; Caso contrário, os threads existentes serão reutilizados para lidar com solicitações subsequentes.
Queremos que nossos aplicativos voltados para a rede escalem de acordo com a demanda do usuário. Queremos minimizar o custo do recurso de nossos aplicativos quando estiverem ociosos e queremos manter nossos custos lineares em termos de demanda. Queremos minimizar o grau em que o desenvolvedor de aplicativos é responsável pelo gerenciamento de recursos e queremos reter (na medida do possível) o ambiente de desenvolvimento familiar das ferramentas de linha de comando do UNIX.
Escolher no Rails como exemplo, um aplicativo Ruby on Rails de thread único pode lidar com uma solicitação de usuário por vez. Várias solicitações simultâneas não podem ser tratadas sem várias cópias do aplicativo residente na memória (em intérpretes de rubi separados). Esse modelo consome muita memória, mesmo quando há pouca demanda do usuário, dificultando a execução de outras cargas de trabalho. Muita paginação e ranger o disco se seguirão.
Ambientes como Node.js lidam com esse problema, tornando a assincronicidade mais transparente para o programador. Embora possa ser útil adotar a natureza assíncrona dos computadores, ele também introduziu alterações nos idiomas que a suportam; Esta não é uma mera mudança de sintaxe, mas também uma mudança não trivial no modelo mental que um usa para ler, escrever e entender programas.
No outro extremo do espectro, os aplicativos CGI requerem um processo e espaço de endereço exclusivos para cada solicitação. Esses aplicativos podem escalar linearmente com a demanda do usuário, incluindo diminuir para o uso de memória / CPU zero quando ocioso, mas o custo de chamar execv(2) para cada solicitação pode dificultar a taxa de transferência.
A abordagem pós -moderna "sem servidor" satisfaz esses critérios, mas com o custo de abandonar o sistema operacional . É uma abordagem muito desconhecida para o desenvolvimento de software e joga muitas ferramentas que podem ser usadas para observar e depurar o aplicativo em tempo de execução.
As portas permitem um novo (antigo?)
Essas qualidades nos permitem abordar nossa declaração de problemas desenvolvendo aplicativos de rede que parecem como ferramentas de linha de comando Unix de thread único, apresentam uma despesa mínima quando ociosos e escalam linearmente em uma granularidade por solicitação.
Obviamente, as portas por si só não lidam com a escala no limite de uma única instância do sistema operacional, mas uma colaboração no estilo revezamento com o firewall pode facilitar isso, assumindo que cópias do aplicativo estejam disponíveis em vários hosts. É aqui que entra portunusd .
A imagem de visualização de mídia social é de Loudon Dodd - Own Work, CC BY -SA 3.0.
Muitas perguntas obscuras de ilumos / ferrugem / portas foram respondidas por @jasonbking.