Serverless na prática de educação de programação

Por falar na palavra sem servidor, acho que todos deveriam estar familiarizados com ela. Então, o que significa a palavra sem servidor? Que problema o Serverless pode resolver? Muitos dos meus amigos podem não ter uma profunda experiência e sentido do corpo. Neste artigo, falarei sobre Serverless com você.

O que é sem servidor

Vamos dar uma olhada na palavra sem servidor primeiro. Servidor, todos sabem o significado de servidor, o que significa que o escopo do problema que o Serverless resolve está no lado do servidor. Menos, todos também devem saber que significa menos. Então o serverless é conectado, e então modificado um pouco, o que significa menos preocupação com o servidor.

Era Serverfull

Todos nós sabemos que haverá duas funções de pessoal de P&D e de operação e manutenção no lado de P&D. Quando um novo sistema está para ser desenvolvido, o pessoal de P&D começa a escrever funções de desenvolvimento de código de acordo com o PRD do gerente de produto. Quando as funções são desenvolvidas e testadas, elas devem ser liberadas. Para o servidor. Neste momento, o pessoal de operação e manutenção começou a planejar as especificações do servidor, o número de servidores, o número de nós implantados para cada serviço, as estratégias e mecanismos de expansão e contração dos servidores, o processo de publicação de serviços, o elegante mecanismo online e offline de serviços e assim por diante. Este modelo é a separação de P&D e operação e manutenção, e a operação e manutenção do servidor são feitas por uma equipe dedicada de operação e manutenção e, em muitos casos, é feita por recursos humanos puros, que é a era Serverfull.

Era DevOps

Quem é a coisa mais difícil nas empresas de Internet? Acredito que a maioria deles são alunos de operação e manutenção. Faça vários planejamentos de rede, planejamento ambiental, planejamento de banco de dados, etc. durante o dia e fique acordado até tarde para lançar novas versões à noite para garantir a garantia online, e muitas coisas são tarefas repetitivas. Então, gradualmente, há a voz de empoderar a P&D. Os alunos de operação e manutenção ajudam os alunos de P&D a construir um conjunto de consoles de operação e manutenção, permitindo que os alunos publiquem serviços, visualizem logs e consultem dados no console de operação e manutenção por conta própria. Desta forma, os alunos de operação e manutenção principalmente mantêm este sistema de console de operação e manutenção, e continuam a melhorar as funções, o que o tornou muito mais fácil. Esta é a era DevOps de P&D, operação e manutenção.

Era sem servidor

Gradualmente, o foco dos alunos de P&D e de operação e manutenção está no console de operação e manutenção. As funções do console de operação e manutenção estão ficando cada vez mais poderosas. Por exemplo, de acordo com as necessidades do lado da operação e manutenção, as funções de expansão elástica automática e monitoramento de desempenho foram adicionadas. De acordo com as necessidades do lado de P&D, a função pipeline de liberação automatizada foi adicionada. Por causa desse sistema, inspeção de qualidade de código, teste de unidade, compilação de pacote, implantação, teste de integração, versão cinza, expansão flexível, monitoramento de desempenho e proteção de aplicativo são basicamente tarefas do lado do servidor que não requerem envolvimento humano. Esta é a era do NoOps, Serverless.

Aplicação de Serverless na Educação de Programação

2020 está destinado a ser um ano extraordinário. Durante a epidemia, quantas empresas caíram como alho-poró e quantas empresas surgiram como cogumelos, como a indústria da educação online.

Isso mesmo, a indústria da educação online é a maior beneficiária desta epidemia. Nesta indústria, existe um segmento de mercado para a educação de programação online, especialmente para crianças e educação de programação para não profissionais, como a programação de gatos. , Zebra AI, Little Elephant Academy, etc. Os sistemas de programação online dessas empresas têm algumas características e demandas comuns:

Escreva o código em um lado da tela, execute o código e exiba o resultado da execução no outro lado.
Os códigos escritos de acordo com as perguntas são todos blocos de código e a quantidade de código para cada pergunta não é muito grande.
Execute o código rapidamente.
Suporte a várias linguagens de programação.
Pode suportar picos de tráfego imprevisíveis.

Por exemplo, a interface da classe de programação da Xiaoxiang Academy:

Serverless na prática de educação de programação

Combinando essas características e demandas, não é difícil ver que o núcleo da construção de tal sistema de programação online é ter um ambiente operacional de código robusto e altamente disponível que suporte várias linguagens de programação.

Então, vamos primeiro dar uma olhada na arquitetura de implementação tradicional:

Serverless na prática de educação de programação

Da perspectiva da arquitetura de alto nível, o front end só precisa passar os trechos de código e a identificação da linguagem de programação para o servidor e, em seguida, aguardar a resposta para exibir os resultados. Portanto, todo o lado do servidor é responsável por classificar e pré-processar os códigos de diferentes linguagens e, em seguida, passá-los para o Runtime de diferentes linguagens de programação. Essa arquitetura tem os seguintes problemas principais.

Grande carga de trabalho e pouca flexibilidade

O primeiro é o problema de P&D e carga de trabalho de operação e manutenção. Quando há novas necessidades no mercado ou novos modelos de negócios precisam ser adicionados, linguagens de programação precisam ser adicionadas. Neste momento, o lado de P&D precisa adicionar classificação de código de programação e lógica de pré-processamento, e precisa construir a programação correspondente. Tempo de execução da linguagem. Do lado da operação e manutenção, é necessário planejar as especificações e a quantidade de servidores que suportam o novo idioma, bem como o processo geral do CICD. Portanto, a necessidade de oferecer suporte à nova linguagem de programação precisa ser implementada e leva muito tempo para pesquisa e desenvolvimento, operação e manutenção. Juntamente com o tempo para teste de caixa preta / branca e teste de processo CICD, o suporte para as necessidades do mercado não pode responder de forma rápida e flexível. Sexo relativamente pobre.

Alta disponibilidade

Em segundo lugar, a estabilidade de todo o sistema de programação online é a principal prioridade. Portanto, todas as arquiteturas de alta disponibilidade para serviços do lado do servidor precisam ser construídas por si mesmas para garantir a estabilidade do sistema em cenários de pico de tráfego e cenários de estado estável. Por um lado, alta disponibilidade é se a lógica do código é elegante e completa. Por outro lado, é o cluster para implantação de serviços. Seja um cluster ECS ou um cluster K8s, os alunos de P&D e operação e manutenção precisam planejar juntos, para a classificação e pré-processamento de linguagens de programação Em termos de serviços a serem processados, vários nós ainda podem ser fornecidos, mas para serviços de Runtime em diferentes linguagens, a demanda do mercado mudará a qualquer momento, por isso é difícil medir especificamente o número de nós para cada serviço. Outro ponto importante é que todos os mecanismos de expansão e redução de serviços exigem que os alunos de operação e manutenção operem manualmente em tempo real.Mesmo que a automação seja obtida por meio de scripts, a velocidade de salto do ECS está muito abaixo das expectativas do negócio.

Granularidade de controle de custo grosso

O terceiro é o controle de custos de todos os recursos de IaaS. Todos nós sabemos que esse tipo de educação online tem óbvias ondas de tráfego, como 10h às 12h, 15h às 17h e 20h às 22h. Quando o tráfego é relativamente grande, em outros momentos o tráfego é relativamente pequeno e não há tráfego à noite. Portanto, neste caso, a arquitetura de implantação tradicional não pode corresponder aos recursos e tráfego de IaaS. Por exemplo, para lidar com o período de pico de tráfego, são necessários 20 clusters ECS para suportar o impacto do tráfego. Neste momento, a taxa de utilização de recursos de cada ECS pode ser superior a 70% e a taxa de utilização é alta, mas quando o tráfego é pequeno e à noite , A taxa de utilização de recursos de cada ECS pode ser superior a dez por cento ou até menor, o que é um desperdício de recursos.

Arquitetura sem servidor

Portanto, vamos dar uma olhada em como usar a arquitetura sem servidor para obter a mesma função e resolver os problemas acima. Ao escolher produtos sem servidor, a primeira coisa que vem à mente na China são os produtos da nuvem Alibaba. O Alibaba Cloud tem dois produtos de arquitetura sem servidor, mecanismo de aplicativo sem servidor e computação funcional. Aqui, usamos a computação funcional para implementar cenários de educação de programação. <br /> Função de computação é um serviço de computação totalmente gerenciado orientado por eventos, conhecido como FC. Usando a computação funcional, não precisamos comprar e gerenciar infraestrutura, como servidores, apenas escrever e fazer upload do código. A computação funcional prepara recursos de computação para você, executa tarefas de maneira flexível e confiável e fornece funções como consulta de log, monitoramento de desempenho e alarmes.

Não vou repetir o significado de FC aqui, apenas dar um exemplo. Existem dois conceitos em FC, um é serviço e o outro é função. Um serviço contém várias funções:

Serverless na prática de educação de programação

Aqui, pegamos a arquitetura de microsserviço Java para corresponder. Pode-se entender que o serviço em FC é uma classe em Java e a função em FC é um método na classe Java:

Serverless na prática de educação de programação

Mas o método na classe Java só pode ser código Java, e a função em FC pode definir Runtime de diferentes linguagens para executar diferentes linguagens de programação:

Serverless na prática de educação de programação

Depois de entender essa estrutura claramente, vamos dar uma olhada em como chamar a função FC, aqui o levará ao conceito de um gatilho. O protocolo de solicitação HTTP que usamos com mais frequência é, na verdade, um tipo de gatilho, que é chamado de gatilho HTTP no FC. Além dos gatilhos HTTP, os gatilhos OSS (Armazenamento de objeto) e os gatilhos SLS (Serviço de log) também são fornecidos. , Gatilho de tempo, gatilho MNS, gatilho CDN, etc.

Serverless na prática de educação de programação

Como pode ser compreendido de maneira aproximada pela figura acima, podemos chamar a função em FC de várias maneiras. Por exemplo, dois cenários. Por exemplo, sempre que faço upload de uma imagem em um determinado diretório do intervalo OSS especificado, posso acionar uma função no FC. A lógica da função é baixar a imagem que acabou de ser enviada e, em seguida, processar a imagem , E depois carregue-o de volta no OSS. Por exemplo, envie uma mensagem para uma fila de MNS e, a seguir, acione a função no FC para processar a lógica dessa mensagem.

Finalmente, vamos dar uma olhada na alta disponibilidade do FC. Quando cada função executa o código, a camada inferior é definitivamente de recursos IaaS, mas só precisamos definir a quantidade de memória necessária para cada função para executar o código, o mínimo é 128M, o máximo é 3G, para usuários, não há necessidade de considerar quantos núcleos. , E você não precisa saber em qual servidor o código está sendo executado, quantas instâncias de função são iniciadas e você não precisa se preocupar com dimensionamento elástico, etc. Tudo isso é tratado pelo FC.

Serverless na prática de educação de programação

Como pode ser visto na figura acima, existem duas estratégias para alta disponibilidade:

Defina o número de instâncias simultâneas para a função. Se for definido como 3, quando três solicitações forem recebidas, a função iniciará apenas uma instância, mas iniciará três threads para executar a lógica.
Depois que o número de threads atingir o limite superior, outra instância de função será puxada.

Como você pode ver aqui, você pode ter um esboço da arquitetura de um sistema de educação de programação online baseado em FC.

Serverless na prática de educação de programação

A imagem acima é o diagrama da arquitetura do sistema de educação de programação online com base na implementação do FC. Nesta arquitetura, vamos ver como resolver os três problemas principais acima:

  • Carga de trabalho e flexibilidade: só precisamos nos concentrar na lógica de negócios de como executar o código. Se quisermos adicionar uma nova linguagem, precisamos apenas criar uma função FC correspondente à linguagem Runtime.
  • Alta disponibilidade: Duas camadas de garantia de alta disponibilidade para lógica de negócios em execução multithread e lógica de negócios em execução em várias instâncias, e a expansão e contração de instâncias de função são processadas automaticamente pelo FC, sem qualquer configuração por R&D e alunos de operação e manutenção.
  • Otimização de custos: Quando não houver solicitação, a instância da função não será acionada e não haverá cobrança neste momento, portanto, o custo de todo o FC é muito baixo durante o período de baixo tráfego ou à noite. O número de instâncias de função, granularidade de faturamento e tráfego podem ser perfeitamente combinados.

Serverless na prática de educação de programação

Exemplo de linguagem de programação Python

Vamos usar a execução do código Python como exemplo para ver como usar o FC para implementar a demonstração de programação online do Python. <br /> #### Criar serviços e funções <br /> Abra o console de computação de funções (FC), selecione a região correspondente, selecione o serviço / função à esquerda e, em seguida, crie um novo serviço:

Serverless na prática de educação de programação

Envie o nome do serviço e crie o serviço.

Serverless na prática de educação de programação

Insira o serviço recém-criado, crie uma função, selecione a função HTTP, você pode configurar a função do gatilho HTTP:

Serverless na prática de educação de programação

Defina os parâmetros da função:

Serverless na prática de educação de programação

Vários parâmetros que precisam de atenção são feitos aqui para ilustrar:

  • Ambiente operacional: é fácil de entender, escolha Python3 aqui
  • Tipos de instância de função: Existem dois tipos de instâncias flexíveis e instâncias de desempenho. A primeira suporta instâncias de até 2C3G e a última suporta especificações maiores, de até 8C16G.
  • Entrada de função: consulte o documento para obter detalhes
  • Método de autenticação de gatilho HTTP: anônimo significa que nenhuma autenticação é necessária, enquanto a função requer autenticação.

Análise de código

Depois que a função é criada, entre na função, você pode ver as guias de visão geral, execução de código, gatilho, consulta de log, etc., primeiro olhamos para o gatilho, veremos que esta função cria automaticamente um gatilho HTTP, e há um HTTP correspondente à função chamada caminho:

Serverless na prática de educação de programação

Em seguida, selecionamos a execução do código e escrevemos nosso código diretamente online:

Serverless na prática de educação de programação

O código específico é o seguinte:

- - codificação: utf-8 - -

import logging
import urllib.parse
import time
import subprocess
def handler(environ, start_response):
context = environ['fc.context']
request_uri = environ['fc.request_uri']
for k, v in environ.items():
if k.startswith('HTTP_'):
pass
try:
request_body_size = int(environ.get('CONTENT_LENGTH', 0))
except (ValueError):
request_body_size = 0
# 获取用户传入的code
request_body = environ['wsgi.input'].read(request_body_size)
codeStr = urllib.parse.unquote(request_body.decode("GBK"))
# 因为body里的对象里有code和input两个属性,这里分别获取用户code和用户输入
codeArr = codeStr.split('&')
code = codeArr[0][5:]
inputStr = codeArr[1][6:]
# 将用户code保存为py文件,放/tmp目录下,以时间戳为文件名
fileName = '/tmp/' + str(int(time.time())) + '.py'
f = open(fileName, "w")
# 这里预置引入了time库
f.write('import time \r\n')
f = open(fileName, "a")
f.write(code)
f.close()
# 创建子进程,执行刚才保存的用户code py文件
p = subprocess.Popen("python " + fileName, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, encoding='utf-8')
# 通过标准输入传入用户的input输入
if inputStr != '' :
p.stdin.write(inputStr + "\n")
p.stdin.flush()
# 通过标准输出获取代码执行结果
r = p.stdout.read()
status = '200 OK'
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
return [r.encode('UTF-8')]

Toda a ideia do código é a seguinte:

  • Passe trechos de código do front end, o formato é uma string.
  • Obtenha a string de código de entrada na função FC e intercepte o conteúdo do código e o conteúdo de entrada. Porque a capacidade de interação de entrada em Python é simplesmente realizada aqui.
  • Salve o código como um arquivo Python, com o carimbo de data / hora como o nome do arquivo, e salve-o no diretório / tmp da função FC. (Cada função FC tem um diretório / tmp separado, que pode armazenar arquivos temporários)
  • Em seguida, adicionou o código para apresentar a biblioteca de tempo ao arquivo para lidar com cenários interativos como o sono.
  • Crie um subprocesso por meio de subprocesso e execute o arquivo Python salvo no diretório / tmp por meio do comando Python no modo Shell. Se houver entrada de informações pelo usuário, ela será gravada no processo filho por meio de entrada e saída padrão.
  • Finalmente, o resultado da execução é lido e retornado ao front end.

Código de front-end

No front end, escrevi uma página simples usando o VUE. Aqui estão dois métodos simples de análise:

Serverless na prática de educação de programação

O objeto de solicitação HTTP é inicializado quando a página é carregada e o caminho HTTP chamado é o caminho do gatilho HTTP da função agora.

Serverless na prática de educação de programação

Este método é chamar a função PythonRuntime em FC e passar o fragmento de código da página front-end para a função. A ideia de lidar com a interação de entrada aqui é fazer a varredura de todo o segmento de código e dividir todo o segmento de código em vários segmentos com o código de entrada como um identificador. Aqueles que não contêm o código de entrada são enviados diretamente para a função FC para execução e aqueles que contêm o código de entrada solicitam a entrada do usuário e, em seguida, os fragmentos de código são enviados para a função FC para execução junto com a entrada de informações pelo usuário.

Serverless na prática de educação de programação

A demonstração é a seguinte:

Serverless na prática de educação de programação

Considerações finais

Este artigo apresenta Serverless, o produto Function Computing (FC) do Alibaba Cloud e a demonstração de um sistema de programação online baseado em Function Computing (FC). Todos deveriam sentir algo. Ao implementar um sistema de programação online baseado em computação funcional (FC), os alunos de P&D só precisam se concentrar em como executar o código passado do front-end, e todo o lado do servidor não exige que os alunos de P&D e de operação e manutenção o façam A preocupação reflete basicamente a essência do Serverless.

Existem muitos outros cenários de aplicativos baseados em Serverless, e irei compartilhá-los um por um.

Acho que você gosta

Origin blog.51cto.com/14902238/2561338
Recomendado
Clasificación