Olá, meu nome é Pavel Savelyev, sou o chefe do departamento de automação de processos de negócios da Lamoda. Trabalhamos com tarefas muito diferentes e tentamos escolher as ferramentas mais convenientes para cada uma. Conseqüentemente, usamos linguagens diferentes - em nossos sistemas, você pode encontrar Java, Go e um pouco de Kotlin para Android. Ao mesmo tempo, uma parte significativa do desenvolvimento é conduzida em PHP; nele são escritas mais de duas dúzias de serviços que automatizam não apenas o trabalho com pedidos, mas também os processos operacionais de uma ampla rede de entrega, call centers em três países e nosso próprio estúdio de fotografia, além de fornecer tudo isso na forma serviços aos nossos parceiros B2B. Esses serviços são suportados e desenvolvidos por 5 equipes de desenvolvimento de nosso departamento.

À medida que os próprios serviços e a infraestrutura ao redor deles se desenvolvem, tarefas semelhantes ocorrem com mais frequência nesses sistemas, como efetuar login no CLS (Sistema de Log Centralizado) comum, testar o armazenamento de arquivos, coletar métricas para o Prometheus e outros. Tentamos padronizar maneiras de resolver esses problemas e usar componentes comuns para diferentes sistemas.
Quando uma das equipes se depara com a adaptação ou integração de um novo serviço / ferramenta que pode se tornar comum a todos, iniciamos o desenvolvimento da biblioteca nessa equipe. E o componente final é preparado para reutilização futura e apresentado em domínio público.
Portanto, como esse processo ocorre regularmente conosco, criamos uma diretriz que nos permite conduzi-lo com menos esforço - tentarei relatar isso em uma das próximas conferências.
Mais de duas dúzias de nossas bibliotecas PHP foram disponibilizadas publicamente no GitHub. E planejamos nos espalhar ainda mais. Porque Bem, investimos muitos recursos e (quero acreditar) se saíram bem. Esperamos astutamente que outros desenvolvedores usem nossas bibliotecas, os ajudem a finalizar e a desenvolver mais, em vez de gastar tempo escrevendo seus análogos do zero. Neste artigo, quero falar brevemente sobre sete bibliotecas projetadas para resolver problemas comuns para tarefas de comércio eletrônico - ficarei feliz se elas forem úteis para você e ficarei ainda mais feliz em desenvolvê-las juntas :)
1. Fiscalização online: um cliente para o ATOL Online
Como outras empresas russas, somos obrigados a cumprir totalmente os requisitos do FZ-54, um dos quais é a fiscalização online. Todos os pedidos pré-pagos no
lamoda.ru são sempre fiscalizados: eles geram cheques on-line que são enviados aos clientes. Nosso serviço de fiscalização funciona pela API com o sistema
ATOL Online, e a primeira
biblioteca da nossa lista é um cliente completo para esse serviço. Além da própria biblioteca, também publicamos um
pacote , com o qual você pode conectá-lo facilmente a qualquer projeto baseado na estrutura do Symfony. A própria biblioteca pode ser incorporada em qualquer outra estrutura PHP: Laravel, Yii, etc. - basta escrever um "wrapper" para a biblioteca.
2. Pagamentos pré-pagos: interação com o Payture
Para processar pagamentos pré-pagos, interagimos ativamente com o serviço Payture. Este serviço possui várias interfaces de software. Usamos a
opção Payture InPay e
criamos nosso próprio
cliente de API para isso. A biblioteca permite manipular vários terminais, suporta o registro PSR-3 padrão. Também é possível usar o cliente Guzzle pré-configurado - isso facilita a organização de testes usando o
Guzzle Mock Handler .
Nosso pacote de
bibliotecas fornece uma configuração semântica de terminais e permite que você defina convenientemente as configurações do cliente (até o momento, apenas o tempo limite) para várias operações da API.
3. Rotulagem do produto: Analisador de código GS1 Datamatrix
Um dos projetos mais importantes de 2019 em nossa empresa é o suporte à rotulagem estadual de mercadorias. Como parte deste projeto, códigos exclusivos especiais serão aplicados a todos os produtos de determinadas categorias - no formato GS1 Datamatrix. Esses códigos permitirão a qualquer comprador verificar a autenticidade dos produtos, sua origem e histórico. Para que os sistemas internos da Lamoda funcionem com esses códigos de barras, desenvolvemos uma
biblioteca para a análise correta dos códigos GS1.
Em um futuro próximo, também planejamos definir os códigos-fonte de nossos clientes desenvolvidos para interação com o Sistema de Informações de Marcação e Rastreabilidade (IP MP).
4. Gerenciamento de microsserviços: middleware para o ônibus da equipe Tactician
Temos mais de cem microsserviços que realizam muitas operações separadas: eles verificam o status dos pagamentos ou novos arquivos nos armazenamentos, enviam comandos de controle aos caixas, fazem o download e processam fotos de serviços externos. Quase todas essas operações são executadas em segundo plano, e o padrão do barramento de comando é excelente para gerenciá-las. Para implementar o barramento em sistemas PHP, escolhemos uma solução pronta - a biblioteca
Tactician aberta.
No entanto, surgiu um problema: nossas equipes de segundo plano costumam interagir com serviços externos, que têm um limite no número de operações em n segundos. E o Tactician não tem a capacidade de controlar o número de comandos executáveis em uma janela de tempo específica. Portanto, desenvolvemos um middleware adicional - biblioteca de
limites de taxas Tactician . Com sua ajuda, você pode adicionar uma nova camada de processamento que rastreia o número de comandos executados no barramento de acordo com a estratégia de limitação de taxa selecionada. As estratégias são conectáveis, as estratégias da biblioteca
stiphle estão disponíveis na
caixa .
Também no domínio público está o nosso
pacote Symfony para a biblioteca.
5. Coletando e Renderizando Métricas para o Prometheus
Nossos microsserviços geram métricas técnicas e de negócios, que são coletadas pelo Prometheus Operator de todo o cluster k8s. Para gerenciar tudo isso, escrevemos uma
biblioteca que processa métricas personalizadas de acordo com o cenário "coletar, salvar e mostrar". Ao mesmo tempo, a biblioteca suporta modos operacionais nos quais um dos itens de script pode ser omitido para aumentar a eficiência. Por exemplo, para métricas computáveis rápidas, um cenário simplificado de "exibição em coleta" pode ser executado. E o trabalho com métricas de negócios lentas pode se traduzir parcialmente em segundo plano, dividindo-se em dois estágios: “coleta-salvamento” + “coleta (do armazenamento) - exibição”.
A biblioteca possui os níveis de abstração necessários, tanto para escrever seus geradores de métricas quanto para escrever repositórios. Fora da caixa, há um adaptador abstrato para o Doctrine, que pode ser configurado na entidade para salvar dados no banco de dados.
Como formatos de renderização métrica, o prometheus e o telegraf httpjson atualmente são suportados.
A biblioteca vem com um pacote Symfony, que fornece uma configuração semântica de fontes de métricas, repositórios e métricas de roteamento. Ele também possui comandos auxiliares para depuração e salvamento de métricas de fontes (por exemplo, para calcular métricas cron).
6. Testando o armazenamento de arquivos: trabalhando com diferentes sistemas de arquivos
Para automatizar o teste, usamos a estrutura de
Codeception , que nos permite escrever testes de vários níveis e possui uma biblioteca bastante extensa de módulos padrão. Escrevemos mais sobre nossas abordagens para testar o desenvolvimento recentemente em um
artigo separado e conversamos em uma conferência do
PHP Rússia . A codecepção possui módulos prontos para interagir com o FTP e o sistema de arquivos local, mas em nossos testes é necessário trabalhar com mais sistemas de arquivos. No mínimo, também usamos o AWS S3 e o Webdav. Além disso, eu gostaria de interagir com todos os sistemas de arquivos usando a mesma API (todos os sistemas de arquivos :)).
Felizmente, existe uma biblioteca
FlySystem aberta que fornece uma única interface de software para trabalhar com diferentes sistemas de arquivos. Portanto, precisamos apenas combinar as duas ferramentas - o que fizemos escrevendo um invólucro no FlySystem como um
módulo de sistema de codecpção-flysystem . Agora ele suporta SFTP, S3 e Webdav. Basta definir as configurações uma vez para conectar-se ao sistema de arquivos desejado na configuração de teste yml e, depois disso, você pode trabalhar com todos os sistemas de arquivos usando o mesmo conjunto de métodos: escreva, copie, limpe o diretório, etc. O módulo já está incluído na página de adições e recomendações de Codeception:
codeception.com/addons .
7. Trabalhando com variáveis de ambiente no modo multilocatário
No departamento de automação de processos de negócios, existem sistemas que operam no modo multilocatário. Para garantir seu trabalho, é necessário poder trabalhar com variáveis de ambiente - para determinar qual variável usar no momento atual.
Nossa
biblioteca fornece várias estratégias para trabalhar com variáveis de ambiente no modo multilocatário. Com base nos parâmetros passados no estágio de inicialização, a biblioteca determina qual variável de ambiente deve ser acessada na solicitação atual.
Para ser continuado
Esta é apenas a primeira parte das bibliotecas. Temos mais uma dúzia lá dentro - eles estão esperando na fila quando os “penteamos” um pouco e os colocamos em domínio público. Isso me motiva a entender que essas bibliotecas podem ser úteis para outra pessoa. Eu me alegro com os comentários e as estrelas no github e espero continuar desenvolvendo bibliotecas com outros desenvolvedores. De fato, muitos projetos russos de comércio eletrônico trabalham com ATOL e Payture. Para o Datamatrix, além do analisador de código descrito no artigo, também temos alguns clientes que já usamos internamente - essas bibliotecas são as primeiras da fila no GitHub.
Tentamos não esquecer os outros idiomas - já publicamos a primeira biblioteca no Go (
escrevemos mais sobre isso
aqui no Habré ) e estamos preparando outros. Fique atento!