Contact
Vamos trabalhar juntos
Mecanismo de Busca Europeu B2B de Produtos Promocionais (European Sourcing)

Mecanismo de Busca Europeu B2B de Produtos Promocionais (European Sourcing)

Mecanismo de busca B2B que funciona como feira online para revendedores europeus de produtos promocionais - um precursor das marketplaces atuais.

2010 - 2016
~6 anos
Software Engineer depois Senior Software Engineer
PHP 5.xSymfony 2/3MySQLElasticsearchAngularJSDoctrine ORMZend FrameworkMemcacheRabbitMQApacheProxmox VE

Linhas de codigo

~9.2M

PHP, JS, Twig, CSS, HTML

Tabelas no banco

97

MySQL (master-slave)

Sub-aplicacoes

15+

Ecossistema de microsservicos

Idiomas suportados

7

FR, EN, DE, ES, IT, NL, PT

Servidores dedicados

9

OVH Proxmox VE

Conectores de fornecedores

26+

Importacao automatizada de dados

Entradas de versionamento

1.234

836 Git + 398 SVN

Sites revendedores

~160

CMS hospedado MyEasyWeb

Apresentacao e definicao do projeto

Quinze sub-aplicacoes interconectadas, quatro geracoes de mecanismos de busca, 8 anos de desenvolvimento

European Sourcing e um mecanismo de busca B2B de produtos promocionais que funciona como feira profissional permanente online em escala europeia - um precursor do que hoje chamamos de marketplaces, destinado a todos os revendedores europeus de produtos promocionais. O projeto constitui um ecossistema completo de aplicacoes composto por quinze sub-aplicacoes interconectadas, desenvolvidas ao longo de mais de 6 anos (2010-2017).

A plataforma conecta tres tipos de atores no mercado de produtos promocionais:

  • Fornecedores (fabricantes/atacadistas) que listam seus catalogos de produtos → B2B
  • Revendedores/Distribuidores (agencias de comunicacao) que buscam produtos para seus clientes → B2B
  • Visitantes que navegam pelo catalogo online nos sites dos revendedores (clientes finais) → B2C

O sistema funciona como uma feira profissional permanente online, oferecendo aos fornecedores uma vitrine multicanal (catalogo online, newsletters, banners publicitarios, guidebook anual, Google Ads) e aos revendedores um motor de busca de produtos multilingue cobrindo 7 idiomas europeus.

Dominio de negocios

Comunicacao por objeto B2B - conectando fornecedores, revendedores e agencias europeias na industria de produtos promocionais.

Usuarios-alvo

Profissionais B2B em toda a Europa - agencias de comunicacao, distribuidores, e exemplos de fornecedores europeus integrados (Midocean, PF Concept, BIC, Paul Stricker, SOL'S, TopTex, Topico, Inspirion, Makito, Xindao, Clipper, Cybernecard, Pixika, Delta, Passot, Lm, Boomerang, Axpol, Goya, GetImpressed, Giving, Lensen Toppoint, Cottel, Eljte, Frezal, Imbretex).

Escopo funcional
Catalogo de produtos multilingue (7 idiomas)
Busca full-text (Elasticsearch)
Back-office fornecedores/revendedores
Importacao automatizada de dados (26+ conectores)
API REST com autenticacao WSSE
Sistema de traducao centralizado
Pagamento online (Sogenactif)
CMS mini-sites revendedores (MyEasyWeb)
Aplicacoes moveis (PhoneGap/Cordova)
Estatisticas de consulta (visualizacoes, buscas, cliques)
Exportacao de dados (CSV + imagens de produtos)
Back-office SEO / Marketing

Objetivos, contexto, desafios e riscos

Digitalizando o mercado europeu de produtos promocionais

Objetivos
  • Posicionar a plataforma como a referencia europeia do sourcing B2B de produtos promocionais online, substituindo catalogos impressos e feiras fisicas
  • Construir um catalogo de produtos multilingue agregando varios milhoes de produtos e variantes provenientes de dezenas de fornecedores
  • Fornecer aos revendedores um motor de busca avancado com filtros por categoria, marca, preco, atributos, marcacao
  • Automatizar a importacao de feeds de dados de fornecedores (precos, estoques, imagens, descricoes) de 26+ fornecedores
  • Oferecer aos revendedores uma solucao pronta de mini-sites e-commerce (MyEasyWeb) com sua propria vitrine brandada conectada ao catalogo central
  • Gerar estatisticas de consulta detalhadas para fornecedores (visualizacoes de produtos, buscas, cliques)
Contexto

O projeto inicial (v1/v2) foi desenvolvido pela SQLI, uma empresa francesa de servicos de TI, com um framework PHP customizado e templates Smarty. O codigo legado continha 398 revisoes SVN cobrindo 2010-2013.

Quando cheguei na SQLI, 5 desenvolvedores PHP dedicados em tempo integral trabalhavam no projeto. Com o tempo, assumi uma parte crescente do perimetro tecnico, ate cobrir sozinho o essencial das evolucoes - um papel que evoluiu naturalmente com minha expertise crescente e a autonomia do ambiente PME. Depois de cuidar sozinho do perimetro por um tempo, pedi reforco e obtive a contratacao de um segundo desenvolvedor.

A partir de 2014-2016, nossa nova equipe Medialeads realizou uma reescrita completa da plataforma, migrando progressivamente do framework customizado para Symfony 2/3 enquanto mantinha o site publico em um framework MVC customizado mais leve.

A plataforma era multilingue (7 idiomas), multi-pais, com alto volume de dados de produtos, e a necessidade de manter compatibilidade com os feeds de dados de fornecedores existentes - tudo hospedado em servidores dedicados OVH totalmente autogerenciados: faziamos absolutamente tudo por conta propria, da configuracao do sistema ate as implantacoes.

Desafios

Modelo de negocios

Receita de assinaturas de fornecedores (240-288 EUR/ano) e servicos publicitarios (banners, newsletters, guidebook, Google Ads, planejamento de midia).

Posicao estrategica

European Sourcing se posicionava como a referencia do sourcing de produtos promocionais online na Europa - um precursor das marketplaces B2B atuais, substituindo catalogos impressos e feiras fisicas tradicionais.

Ecossistema de marcas

A empresa tambem operava TendanceObjet.com, Kadobjet.fr, FranceObjet.com, Omyague.com, GourmetOnline.pro, Recherche-Publicitaire.com, GraphicSourcing.com, CPrint-Sourcing.com, WineSpiritSourcing.com, Tradexpo-Online.fr - cada marca visando um segmento especifico do mercado.

Riscos identificados

Divida tecnica

Migracao progressiva de um framework customizado para Symfony, coexistencia de duas arquiteturas (SVN legado + Git moderno), hash MD5 de senhas com uma unica iteracao e sem salt - coerente com o estado da arte das praticas de seguranca PHP da decada 2008-2014, antes de bcrypt se tornar o padrao.

Complexidade de integracao

Os feeds de dados de fornecedores eram heterogeneos (CSV, XML, API), exigindo um adaptador especifico por fornecedor, todos mantidos em flux.europeansourcing.com.

Dependencia de infraestrutura

9 servidores dedicados OVH com virtualizacao Proxmox, replicacao MySQL master/slave, implantacoes manuais via svn up - reflexo das restricoes tecnicas da epoca, antes da democratizacao do Docker e dos pipelines CI/CD modernos.

Bus factor

Apenas 3 desenvolvedores principais para todo o ecossistema de 38 sub-projetos e 9 servidores.

As etapas - O que eu fiz

Do monolito SQLI a arquitetura de microsservicos distribuida

Fase 1
Desenvolvimento SQLI e legado SVN (2008-2013)
2008 - 2013
  • Gerenciamento do codigo legado herdado da SQLI - um monolito PHP com templates Smarty, sob versionamento SVN (398 revisoes)
  • Manutencao e extensao do extranet para fornecedores e revendedores (CRUD de produtos, gestao de imagens, precos, atributos, marcacoes)
  • Operacoes de implantacao em servidores dedicados e coordenacao com a documentacao SQLI (47+ documentos de especificacoes)
  • Desenvolvimento de scripts de correcao de dados para resolver problemas de qualidade (categorias-pai ausentes, cores incorretas, imagens quebradas)
Fase 2
Retomada interna e microsservicos (2014-2016)
Jan 2016 - Dez 2016
  • Lideranca da migracao de SVN para GitHub - 13 repositorios criados em janeiro 2016, organizacao medialeads com 8 membros e 20+ repos privados
  • Reescrita do extranet (177 commits) em um framework PHP MVC customizado com acesso direto ao banco MySQL
  • Desenvolvimento da API REST (api.europeansourcing.com) em Symfony 2.4 com Propel ORM e autenticacao WSSE
  • Construcao de conectores automatizados de importacao de fornecedores em flux.europeansourcing.com (Pixika, Makito, Midocean, BIC, Paul Stricker, TopTex, Cybernecard)
  • Implementacao do Elasticsearch para busca full-text com indices multilingues dedicados
  • Criacao do sistema de traducao centralizado (translate.europeansourcing.com) em Symfony 3.0
Fase 3
Modernizacao arquitetural (2016-2017)
Mar 2016 - Nov 2016
  • Inicio da reescrita arquitetural com bundles Symfony compartilhados (ESCoreBundle: 143 commits, ESSourcingBundle: 15 commits)
  • Projeto de comportamentos Doctrine: Sluggable, Sortable, Timestampable, Translatable, Blameable, Toggleable, Visible, Overloadable, Tree
  • Implementacao de processamento assincrono com RabbitMQ para importacao de dados e calculos de visibilidade
  • Configuracao de provisionamento de infraestrutura com Chef para o projeto extranet_rebirth
Project Timeline
European Sourcing - 2008-2017
Supplier Data Import Flow

Os atores - As interacoes

Colaboracao em uma equipe reduzida mas altamente produtiva

Equipe de desenvolvimento

3 a 5 desenvolvedores ativos dependendo do periodo, com responsabilidades claramente divididas:

José DA COSTA

Desenvolvedor lider - 35,3% do versionamento total (225 Git + 116 SVN). Dominante no extranet (177 commits), flux (15), gestao do legado SVN.

Thomas C.

Desenvolvedor senior - 36,9% (355 Git + 1 SVN). Dominante no ESCoreBundle (113), translate (88), supplierbo (19).

wamania

Desenvolvedor - 24,2% (226 Git + 8 SVN). Dominante no europeansourcing.com (166 commits), extranet (49).

IronXtreme

Desenvolvedor - 3,0% (29 commits Git no ESCoreBundle).

Contribution Distribution (Git + SVN)
Partes interessadas externas

SQLI

Empresa de servicos de TI que desenvolveu v1/v2/v3 (especificacoes, desenvolvimento inicial)

Dolead

Agencia de gestao Google AdWords

Universem

Agencia de SEO (auditorias TendanceObjet e Kadobjet)

OVH

Provedor de hospedagem (9 servidores dedicados)

Os resultados

Impacto mensuravel para a empresa e para minha carreira

Para mim
  • Gestao massiva de dados e otimizacao SQL: dominio das formas normais SQL (1NF, 2NF, 3NF, BCNF), de todos os tipos de joins (INNER/LEFT/RIGHT/CROSS/SELF), da indexacao avancada (indices B-tree, compostos, covering), da analise constante de planos de execucao com `EXPLAIN ANALYZE`, da replicacao MySQL master-slave e do cache Memcache. Batches noturnos de varias horas para recalcular estoques, precos e promocoes em todo o catalogo - nessa escala, um indice ausente podia transformar uma query de 50 ms em timeout de 30 segundos, entao cada milissegundo ganho por query se multiplicava em milhoes de execucoes.
  • Mecanismos de busca e indexacao: passagem pratica por quatro geracoes de mecanismos - (1) MySQL LIKE / FULLTEXT (MyISAM/InnoDB), (2) busca full-text PostgreSQL com `tsvector`/`tsquery`, indices GIN e funcoes `to_tsvector`/`ts_rank`, (3) Apache Solr indexando centenas de milhares de produtos com facetamento avancado (categorias, cores, precos, fornecedores), sugestoes, correcao ortografica e scoring de relevancia personalizado, (4) Elasticsearch com inverted indexes, analyzers multilingues (stemming, tokenization, normalizacao), scoring TF-IDF, agregacoes e facetas. Aprendizado das diferencas profundas entre um mecanismo relacional e um mecanismo de busca dedicado.
  • Algoritmos e regras de negocio complexas: concepcao e implementacao de numerosos algoritmos e de regras de negocio muito complexas - por exemplo o calculo de todas as combinacoes possiveis de preco, variantes de produto e disponibilidade (produto cartesiano / explosao combinatoria gerando milhares de combinacoes por produto entre tamanhos, cores, quantidades, tipos de marcacao, zonas de marcacao e acabamentos). Dominio da modelagem de regras de pricing dinamicas e motores de decisao de negocio.
  • Dominio do ecossistema Symfony 2/3 em producao em larga escala (Propel, Doctrine, bundles, servicos, seguranca, WSSE)
  • Desenvolvimento de habilidades solidas em migracao de codigo legado - transicao do monolito SVN para microsservicos Git sem interrupcao de servico
  • Aquisicao de conhecimento de dominio em mercado B2B de produtos promocionais, automacao de feeds de dados e e-commerce multi-pais
  • Aprendizado de coordenacao em uma equipe pequena onde cada desenvolvedor possui porcoes significativas do codigo
Para a empresa

Cobertura funcional

Ciclo completo de sourcing B2B coberto por um unico ecossistema - do upload de catalogo do fornecedor a vitrine do revendedor, sem rupturas manuais entre servicos

Volume do catalogo

Indexacao da maior base de dados europeia de produtos promocionais - varios milhoes de produtos e variantes agregados de 26+ feeds de fornecedores, armazenados em 97 tabelas MySQL com replicacao master-slave

Alcance multilingue

7 idiomas europeus com indices Elasticsearch dedicados e gestao centralizada de traducoes

Cobertura geografica

Sub-dominios localizados cobrindo os principais mercados europeus: UK, Iberia, Italia, Alemanha, mais um vertical Textil dedicado

Escala de automacao

26+ conectores automatizados de dados de fornecedores lidando com formatos heterogeneos (CSV, XML, API) de grandes marcas europeias

Rede de revendedores

~160 mini-sites revendedores hospedados na plataforma CMS MyEasyWeb

Ecossistema de marcas

11+ marcas operadas: europeansourcing.com, tendanceobjet.com, kadobjet.fr, franceobjet.com, omyague.com, gourmetonline.pro, recherche-publicitaire.com, graphicsourcing.com, cprint-sourcing.com, winespiritsourcing.com, tradexpo-online.fr

Funcionalidades-chave entregues

Catalogo de produtos multilingue com indices Elasticsearch dedicados e scoring de relevancia personalizado
API REST com autenticacao WSSE stateless (nonce + timestamp + digest)
Conectores automatizados de importacao lidando com feeds heterogeneos CSV / XML / API
Back-office fornecedores/revendedores com gestao completa de produtos
Dashboard de fornecedores SPA (AngularJS 1.2 + CoffeeScript + Grunt + Bower)
CMS mini-sites revendedores (MyEasyWeb) com vitrines brandadas conectadas ao catalogo central
Integracao de pagamento online (Sogenactif, Société Générale)
Back-office SEO / marketing (Zend Framework + ExtJS + crawler web)
Aplicacoes moveis hibridas (jQuery Mobile + PhoneGap/Cordova)
Microservices Ecosystem
Technology Distribution
Escala do codigo
7.514Arquivos PHP
4.505Arquivos JS
909Controllers
2.222Views / templates
87Cron jobs
1.506Arquivos i18n
611Arquivos de teste

O depois do projeto

O que aconteceu apos minha saida do projeto

Sai do projeto em novembro de 2016, deixando uma plataforma em pleno funcionamento. A equipe continuou operando e evoluindo o European Sourcing - o projeto nao foi interrompido, ele simplesmente continuou sem mim. A fase final de consolidacao em torno de bundles Symfony compartilhados, que eu havia iniciado, foi levada adiante pela equipe.

Em retrospectiva, as escolhas arquiteturais da Fase 2 se mostraram solidas e modernas para sua epoca: a abordagem orientada a servicos com subdominios dedicados, a autenticacao WSSE stateless entre servicos, a arquitetura do mecanismo de busca e a infraestrutura de conectores automatizados de fornecedores permaneceram tecnicamente impressionantes muito depois da minha saida.

Minha perspectiva critica

Retrospectiva honesta sobre 8 anos de desenvolvimento

Pontos fortes
  • Arquitetura de microsservicos bem projetada

    A decomposicao do monolito SQLI em servicos especializados (API, busca, flux, traducao, exportacao, estatisticas) demonstra visao arquitetural solida. Cada servico tem uma responsabilidade clara e perimetro funcional bem definido.

  • Escopo de produto raro no mercado

    Muito poucos concorrentes da epoca ofereciam todo o ciclo de sourcing B2B em um unico ecossistema. Esse nivel de integracao foi o que posicionou a European Sourcing na lideranca do mercado europeu.

  • Internacionalizacao nativa

    Indices Elasticsearch dedicados por idioma e um sistema de traducao centralizado demonstram uma ambicao europeia real - planejada desde o inicio, nao adicionada depois.

  • Automacao de importacao de fornecedores

    Os conectores lidando com formatos heterogeneos (CSV, XML, API) representam investimento tecnico consideravel e valor de negocio fundamental - uma vantagem competitiva real.

Areas para melhoria
  • Implantacao pre-CI/CD

    Implantacao manual via svn up, sem pipeline de integracao continua, sem testes automatizados - coerente com as praticas do ecossistema PHP da decada 2008-2014, GitHub Actions ainda nao existia e o ferramental CI/CD (Jenkins, Travis CI) engatinhava.

  • Versionamento pre-SemVer

    Zero tags Git nos 13 repositorios - reflexo da epoca, antes da adocao massiva de SemVer no ecossistema PHP e da popularizacao do GitHub Releases.

  • Ecossistema multi-frameworks

    Coexistencia de multiplos frameworks (PHP customizado, Symfony 2.4, 2.8, 3.0, 3.1, Zend Framework 1) e 2 ORMs (Propel, Doctrine) - consequencia de uma migracao progressiva ao longo de varios anos, coerente com a evolucao do ecossistema PHP entre 2010 e 2016.

O que eu faria diferente

Com os padroes e o recuo de hoje, algumas escolhas poderiam ter sido diferentes - cada decisao fazia sentido dentro das restricoes da sua epoca:

  • Adotar um unico framework desde o inicio em vez de manter um framework PHP customizado ao lado do Symfony, embora o contexto historico justificasse a coexistencia durante a migracao.
  • Configurar CI/CD desde a migracao para GitHub (janeiro 2016) - Jenkins, Travis CI ou GitLab CI estavam disponiveis mesmo que GitHub Actions ainda nao existisse.
  • Usar Docker para ambientes de dev e implantacao, embora Proxmox fosse o padrao de virtualizacao maduro para PMEs PHP da epoca.
  • Centralizar o acesso a dados via uma unica API em vez de conectar cada servico diretamente ao banco MySQL - um padrao que so se generalizou apos 2017.
Licoes duradouras

A migracao de legado e uma maratona

A transicao do monolito SQLI para arquitetura de microsservicos levou 3+ anos e permanecia em andamento quando sai do projeto. Planejar marcos realistas e compromissos temporarios e essencial.

A automacao de importacao de dados e critica

Os conectores de fornecedores representam valor de negocio consideravel mas tambem divida de manutencao permanente - qualquer fornecedor pode mudar seu formato a qualquer momento, e cada quebra e um incidente de producao.

A internacionalizacao deve ser planejada desde o inicio

O sistema de traducao centralizado e um excelente padrao. Adicionar suporte multilingue depois teria sido exponencialmente mais caro do que planeja-lo desde o inicio.

A documentacao de consultoria e preciosa

As especificacoes da SQLI permitiram entender a arquitetura anos apos o fim da prestacao. Investir em documentacao tecnica tem um ROI de longo prazo.

Arquitetura tecnica

Architectural Évolution - Monolith to Microservices

Trajetoria relacionada

Experiencia profissional ligada a esta realizacao

Competencias aplicadas

Competencias tecnicas e humanas aplicadas

Competências técnicas

Desenvolvimento de software5/5

Desenvolvimento Full-Stack

15+ sub-aplicações interconectadas em PHP MVC custom, Symfony 2/3, AngularJS SPA, jQuery Mobile e apps PhoneGap/Cordova ao longo de 8 anos

Desenvolvimento de software5/5

Desenvolvimento Backend

Serviços backend em PHP 5.x com Symfony 2/3, ORMs Propel e Doctrine, legacy Zend Framework, processamento assíncrono RabbitMQ e cache Memcache

Arquitetura & Design5/5

Arquitetura e Design de Sistemas

Decomposição do monólito SQLI em ecossistema de microsserviços (API, search, flux, translate, export, stats, supplierbo) com bundles Symfony compartilhados (ESCoreBundle, ESSourcingBundle) e autenticação WSSE stateless inter-serviços

Dados & IA5/5

Fundamentos de Banco de Dados

Projeto e otimização de schema MySQL com 97 tabelas e replicação master-slave - formas normais SQL (1NF/2NF/3NF/BCNF), indexação avançada (B-tree, composite, covering), análise contínua de planos EXPLAIN e evolução para PostgreSQL full-text (tsvector/GIN) e Elasticsearch

Arquitetura & Design5/5

Design de APIs REST

API REST JSON em Symfony 2.4 + Propel com autenticação WSSE stateless (nonce + timestamp + digest), JMS Serializer, CORS e conexões multi-banco (europeansourcing + tendanceobjet)

Desenvolvimento de software5/5

Algoritmos Avançados e Complexidade

Algoritmos de pricing combinatório (produto cartesiano gerando milhares de combinações por produto: tamanhos × cores × quantidades × tipos de marcação × zonas de marcação × acabamentos) e teoria de indexação de motor de busca (índice invertido, analisadores, scoring TF-IDF)

Arquitetura & Design4/5

Padrões de Arquitetura de Software

Microsserviços, MVC, SPA (AngularJS), pattern Strategy para 26+ conectores de fornecedores heterogêneos (CSV/XML/API) e behaviors Doctrine (Sluggable, Sortable, Timestampable, Translatable, Blameable)

DevOps & Cloud4/5

Workflows Git Avançados

Liderança da migração de SVN (398 revisões) para GitHub (13 repositórios, 836 commits) - configuração da organização, estratégia de branches por desenvolvedor, 20+ repositórios privados sob a organização medialeads

Galeria de imagens

Capturas e visuais do projeto

Voce tem um portal B2B multilingue para projetar ?

Entreguei o portal European Sourcing ponta a ponta: modelagem de produto multilingue, catalogo de sourcing e fluxos de compradores. Vamos conversar sobre seu contexto.

Entrar em contato